Share via


Advertencia C6230

Conversión implícita entre tipos enteros semánticamente diferentes: uso de HRESULT en un contexto booleano

Comentarios

Esta advertencia indica que un HRESULT vacío se usa en un contexto en el que se espera un resultado booleano, como una instrucción if. Es probable que esta prueba produzca resultados incorrectos. Por ejemplo, el valor típico de HRESULT (S_OK) para indicar que una operación es correcta es false cuando se prueba como booleano.

Nombre del análisis de código: USING_HRESULT_IN_BOOLEAN_CONTEXT

Ejemplo

El código siguiente genera esta advertencia:

#include <windows.h>

VOID f( )
{
  LPMALLOC pMalloc;
  HRESULT hr = CoGetMalloc(1, &pMalloc);

  if (hr)
  {
    // code ...
  }
  else
  {
    // code ...
  }
}

En la mayoría de los casos, deben usarse las macros SUCCEEDED o FAILED para probar el valor de HRESULT. Para corregir esta advertencia, utilice el código siguiente:

#include <windows.h>

VOID f( )
{
  LPMALLOC pMalloc;
  HRESULT hr = CoGetMalloc(1, &pMalloc);

  if (SUCCEEDED(hr))
  {
    // 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++.