Advertencia C6214

Conversión entre tipos enteros semánticamente diferentes: HRESULT a un tipo booleano

Esta advertencia indica que un HRESULT se convierte a un tipo booleano. El valor correcto (S_OK) de HRESULT es igual a 0. Sin embargo, 0 indica error en un tipo booleano. Convertir un HRESULT en un tipo booleano y utilizarlo en una expresión de prueba da lugar a un resultado incorrecto.

Comentarios

A veces, esta advertencia se produce cuando se almacena un HRESULT en una variable booleana. Cualquier comparación que utilice la variable booleana para comprobar si HRESULT es correcto o devuelve un error puede provocar resultados incorrectos.

Nombre del análisis de código: CAST_HRESULT_TO_BOOL

Ejemplo

El código siguiente genera la advertencia C6214:

#include <windows.h>

BOOL f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  hr = CoGetMalloc(1, &pMalloc);
  if ((BOOL)hr) // warning C6214
  {
    // success code ...
    return TRUE;
  }
  else
  {
    // failure code ...
    return FALSE;
  }
}

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

#include <windows.h>

BOOL f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (SUCCEEDED(hr))
  {
    // success code ...
    return TRUE;
  }
  else
  {
    // failure code ...
    return FALSE;
  }
}

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

Normalmente, se debe utilizar la macro SUCCEEDED o FAILED para probar el valor de un HRESULT.

Para obtener más información, vea uno de los artículos siguientes:

SUCCEEDED

FAILED

Para usar la metodología moderna de asignación de memoria de C++, use los mecanismos proporcionados por la biblioteca estándar (STL) de C++. 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++.