Partager via


C6230

avertissement C6230 : cast implicite entre types d'entiers sémantiquement différents : utilisation de HRESULT dans un contexte Boolean

Cet avertissement indique qu'un HRESULT nu est utilisé dans un contexte, par exemple l'instruction if , dans lequel un résultat Boolean est attendu.Cette situation risque de générer des résultats incorrects.Par exemple, la valeur de succès classique pour HRESULT (S_OK) est False lorsqu'elle est testée comme un type Boolean.

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 situations, la macros SUCCEEDED ou FAILED doit être utilisée pour tester la valeur de HRESULT.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 type SCODE équivaut à HRESULT.

Notez que l'utilisation de malloc et free (et des API connexes d'allocation mémoire dynamique) présente de nombreux pièges en termes de fuites de mémoire et d'exceptions.Pour éviter complètement ce genre de problème de fuites et d'exception, utilisez les mécanismes fournis par la bibliothèque de modèles standard (STL) C++.Ceux-ci incluent shared_ptr, unique_ptr, et vector.Pour plus d’informations, consultez Pointeurs intelligents (Modern C++) et Référence de bibliothèque standard C++.