Avertissement C6221

Conversion implicite entre des types entiers sémantiquement différents : comparaison de HRESULT à un entier. Envisagez d’utiliser SUCCEEDED ou FAILED de macros à la place

Cet avertissement indique qu’un HRESULT entier est comparé à un entier autre que zéro.

Notes

Un succès dans un HRESULT (S_OK) est représenté par un 0. Par conséquent, un cast implicite d’un HRESULT entier génère une valeur incorrecte et est susceptible d’entraîner un résultat incorrect. L’erreur est souvent due à l’attente erronée d’une fonction pour retourner un entier lorsqu’elle retourne réellement un HRESULT.

Nom de l’analyse du code : COMPARING_HRESULT_TO_INT

Exemple

Le code suivant génère l’avertissement C6221 en comparant une valeur entière à une HRESULT valeur entière :

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (hr == 4)
  {
    // failure code ...
    return S_FALSE;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

Pour corriger cet avertissement, le code suivant utilise la FAILED macro :

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (FAILED(hr))
  {
    // failure code ...
    return S_FALSE;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

Pour cet avertissement, le SCODE type est équivalent à HRESULT.

Pour plus d’informations, consultez Macro et FAILED Macro.SUCCEEDED

L’utilisation et free les API d’allocation de mémoire dynamique associées ont de nombreux pièges en termes de malloc fuites de mémoire et d’exceptions. Pour éviter ces types de fuites potentielles, utilisez les mécanismes fournis par la bibliothèque C++ Standard (STL). Ceux-ci incluent shared_ptr, unique_ptret des conteneurs tels que vector. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.