Advertencia C6220

Conversión implícita entre tipos enteros semánticamente diferentes: comparando HRESULT con -1. Considere la posibilidad de usar SUCCEEDED o FAILED macro en su lugar

Esta advertencia indica que se HRESULT está comparando con un valor explícito queHRESULT no es -1, que no es un correcto.HRESULT

Comentarios

Un error en HRESULT (E_FAIL) no está representado por un -1. Por consiguiente, la conversión implícita de un HRESULT en un entero generará un valor incorrecto y, con toda probabilidad, dará lugar a un resultado incorrecto.

Nombre del análisis de código: COMPARING_HRESULT_TO_MINUS_ONE

Ejemplo

En la mayoría de los casos, la advertencia C6220 se debe al código que espera erróneamente que una función devuelva un entero y usar -1 como valor de error, pero en su lugar la función devuelve un HRESULT. El siguiente ejemplo de código genera esta advertencia:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (hr == -1)
  {
    // failure code ...
    return E_FAIL;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

Es mejor usar la SUCCEEDED macro o FAILED para probar el valor de .HRESULT Para corregir esta advertencia, utilice el código siguiente:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

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

Para esta advertencia, el tipo SCODE es equivalente a HRESULT.

La comparación explícita es adecuada para comprobar determinados valores de HRESULT, como E_FAIL. De lo contrario, use las macros SUCCEEDED o FAILED.

Para obtener más información, vea SUCCEEDED Macro y FAILED Macro.

El uso de malloc y free (y las API de asignación dinámica de memoria relacionadas) tiene muchos problemas en términos de pérdidas de memoria y excepciones. Para evitar estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptrlos contenedores , unique_ptry , como vector. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.