Advertencia C6226

Conversión implícita entre tipos enteros semánticamente diferentes: asignar -1 a HRESULT. Considere utilizar E_FAIL en su lugar.

Esta advertencia indica que a HRESULT se le asigna un valor explícito de -1 o se inicializa en este valor.

Comentarios

Esta advertencia se genera con frecuencia a causa de una confusión accidental de los tipos integer y HRESULT. Para indicar que la operación es correcta, use la constante simbólica S_OK en su lugar. Para indicar que la operación es incorrecta, use las constantes simbólicas que comienzan por E_constant, como E_FAIL.

Para obtener más información, consulte las SUCCEEDED macros y FAILED .

Nombre del análisis de código: ASSIGNING_MINUS_ONE_TO_HRESULT

Ejemplo

El código siguiente genera esta advertencia:

#include <windows.h>

VOID f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  if (FAILED(CoGetMalloc(1, &pMalloc)))
  {
    hr = -1;
    // code ...
  }
  else
  {
    // code ...
  }
}

Para corregir esta advertencia, utilice el código siguiente:

#include <windows.h>

VOID f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  if (FAILED(CoGetMalloc(1, &pMalloc)))
  {
    hr = E_FAIL;
    // code ...
  }
  else
  {
    // code ...
  }
}

Para esta advertencia, el tipo SCODE se trata como un valor HRESULT.

El uso de malloc y free (y las API de memoria dinámica relacionadas) tiene muchos inconvenientes, por ejemplo, provoca fugas de memoria y excepciones. Para evitar estos problemas, use las clases de puntero y contenedor que se proporcionan en la Biblioteca estándar de C++. Incluyen shared_ptr, unique_ptr y vector. Para más información, consulte los artículos sobre punteros inteligentes y biblioteca estándar de C++.