Предупреждение C6284

Объект, передаваемый в качестве параметра, когда строка требуется при вызове "*function**

Замечания

Это предупреждение указывает на несоответствие между описательом формата и типом, используемым в printfфункции -style. Описатель формата — это тип строки стиля C, например %s или %ws, и аргумент является типом класса/структуры или объединения. Этот дефект может привести к сбоям в дополнение к потенциально неправильным выходным данным.

Этот дефект часто возникает из-за того, что вы забываете преобразовать тип строки объекта, например std::stringCComBSTR , или bstr_t в строку printfстиля C, которая ожидает функцию -style. В этом случае исправление заключается в добавлении соответствующего преобразования в тип. Преобразование необходимо, так как параметров variadic в printfфункции стиля нетипичены, поэтому автоматическое преобразование не выполняется.

Имя анализа кода: OBJECT_AS_STRING_ARGUMENT_TO_FORMAT_FUNCTION

Пример

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

Исправьте предупреждение, добавив соответствующие преобразования:

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

См. также

static_castОператор
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
C4477
C4840