Condividi tramite


Avviso C6284

Oggetto passato come parametro quando la stringa è necessaria nella chiamata a '*function*'

Osservazioni:

Questo avviso indica che esiste una mancata corrispondenza tra l'identificatore di formato e il tipo usato in una printffunzione -style. L'identificatore di formato è un tipo String di stile C, %s ad esempio o %wse l'argomento è un tipo di classe/struct/unione. Questo difetto può causare arresti anomali, oltre a un output potenzialmente errato.

Questo difetto è spesso dovuto alla mancata conversione di un tipo stringa di oggetto, ad std::stringesempio , CComBSTR o bstr_t nella stringa di stile C prevista dalla printffunzione -style. In tal caso, la correzione consiste nell'aggiungere la conversione appropriata al tipo . La conversione è necessaria perché i parametri variadic in printffunzioni di tipo -style non sono tipizzato, quindi non viene eseguita alcuna conversione automatica.

Nome dell'analisi del codice: OBJECT_AS_STRING_ARGUMENT_TO_FORMAT_FUNCTION

Esempio

#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);
}

Correggere l'avviso aggiungendo le conversioni appropriate:

#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());
}

Vedi anche

Operatore static_cast
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
C4477
C4840