Avertissement C6284

Objet passé en tant que paramètre lorsque la chaîne est requise dans l’appel à '*function*'

Notes

Cet avertissement indique qu’il existe une incompatibilité entre le spécificateur de format et le type utilisé dans une printffonction -style. Le spécificateur de format est un type string de style C tel que %s ou %ws, et l’argument est un type classe/struct/union. Ce défaut peut entraîner des blocages, en plus d’une sortie potentiellement incorrecte.

Ce défaut est souvent dû à l’oubli de convertir un type de chaîne d’objet tel que std::string, CComBSTR ou bstr_t dans la chaîne de style C attendue par la printffonction -style. Dans ce cas, le correctif consiste à ajouter la conversion appropriée au type. La conversion est nécessaire, car les paramètres variadiques en printffonctions -style ne sont pas typés, donc aucune conversion automatique ne se produit.

Nom de l’analyse du code : OBJECT_AS_STRING_ARGUMENT_TO_FORMAT_FUNCTION

Exemple

#include <atlbase.h>
#include <string>

void f()
{
  char buff[50];
  CComBSTR bstrValue{"Hello"};
  std::string str{"World"};

  // Oops, %ws and %s require C-style strings but CComBSTR and std::strings are being passed instead
  sprintf(buff, "%ws %s", bstrValue, str);
}

Corrigez l’avertissement en ajoutant les conversions appropriées :

#include <atlbase.h>
#include <string>

void f()
{
  char buff[50];
  CComBSTR bstrValue{"Hello"};
  std::string str{"World"};

  // Fixed by adding a static_cast to the CComBSTR and calling c_str() on the std::string
  sprintf(buff, "%ws %s", static_cast<wchar_t*>(bstrValue), str.c_str());
}

Voir aussi

static_cast (opérateur)
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
C4477
C4840