Avertissement C6230

Conversion implicite entre des types entiers sémantiquement différents : utilisation de HRESULT dans un contexte booléen

Notes

Cet avertissement indique qu’une nue HRESULT est utilisée dans un contexte où un résultat booléen est attendu, tel qu’une if instruction. Ce test est susceptible de produire des résultats incorrects. Par exemple, la valeur de réussite classique pour HRESULT (S_OK) est false lorsqu’elle est testée en tant que booléen.

Nom de l’analyse du code : USING_HRESULT_IN_BOOLEAN_CONTEXT

Exemple

Le code suivant génère cet avertissement :

#include <windows.h>

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

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

Dans la plupart des cas, la macro SUCCEEDED ou FAILED doit être utilisée pour tester la valeur du HRESULTfichier . Pour corriger cet avertissement, utilisez le code suivant :

#include <windows.h>

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

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

Pour cet avertissement, le SCODE type est traité comme un HRESULT.

L’utilisation et mallocfree (et les API de mémoire dynamique associées) présente de nombreux pièges comme cause de fuites de mémoire et d’exceptions. Pour éviter ces types de fuites et problèmes d’exception, utilisez les classes de pointeur et de conteneur fournies par la bibliothèque standard C++. Il s’agit notamment de shared_ptr, de unique_ptr et de vecteur. Pour plus d’informations, consultez Smart Pointers and C++ Standard Library.