Compartir a través de


Advertencia C6284

Objeto pasado como parámetro cuando se requiere una cadena en la llamada a '*function*'

Comentarios

Esta advertencia indica que hay una discrepancia entre el especificador de formato y el tipo que se usa en una printffunción -style. El especificador de formato es un tipo de cadena de estilo C, como %s o %ws, y el argumento es un tipo de clase/estructura/unión. Este defecto puede provocar bloqueos, además de una salida potencialmente incorrecta.

Este defecto suele deberse a que se olvida de convertir un tipo de cadena de objeto como std::string, CComBSTR o bstr_t en la cadena de estilo C que espera la printffunción -style. Si es así, la corrección consiste en agregar la conversión adecuada al tipo. La conversión es necesaria porque los parámetros variádicos a printflas funciones de estilo -style están sin tipo, por lo que no se produce ninguna conversión automática.

Nombre del análisis de código: OBJECT_AS_STRING_ARGUMENT_TO_FORMAT_FUNCTION

Ejemplo

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

Corrija la advertencia agregando las conversiones adecuadas:

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

Consulte también

Operador static_cast
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
C4477
C4840