Compartir a través de


C6220

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

Esta advertencia indica que se está comparando un tipo HRESULT con un valor explícito, no un tipo HRESULT de -1, que no es un valor HRESULT debidamente formado.El valor -1 no representa un error en HRESULT (E_FAIL).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.

Ejemplo

En la mayor parte de los casos, esta advertencia se produce porque el código espera equivocadamente que una función que debería devolver un valor HRESULT devuelva en su lugar un número entero, y utiliza –1 como valor de error.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;
  }
}

Suele ser preferible utilizar las macros SUCCEEDED 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 el tema sobre la macro SUCCEEDED y la macro FAILED.

Tenga en cuenta que el uso de las opciones malloc y free (y las API de asignación de memoria dinámica relacionadas) tiene muchos riesgos en cuanto a pérdidas de memoria y excepciones.Para evitar todos estos tipos de problemas de pérdidas de memoria y excepciones, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) de C++.Estos incluyen shared_ptr, unique_ptr y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de biblioteca estándar de C++.