Avertissement C6220

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

Cet avertissement indique qu’un HRESULT élément est comparé à une valeur explicite, non-1HRESULT , qui n’est pas une valeur bien formée HRESULT.

Notes

Un échec dans HRESULT (E_FAIL) n’est pas représenté par un -1. Par conséquent, un cast implicite d’un HRESULT entier génère une valeur incorrecte et risque d’entraîner un résultat incorrect.

Nom de l’analyse du code : COMPARING_HRESULT_TO_MINUS_ONE

Exemple

Dans la plupart des cas, l’avertissement C6220 est dû au code qui s’attend à ce qu’une fonction retourne un entier et utilise -1 comme valeur d’échec, mais à la place, la fonction retourne un HRESULT. L’exemple de code suivant génère cet avertissement :

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

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

Il est préférable d’utiliser le ou FAILED la SUCCEEDED macro pour tester la valeur d’un HRESULT. Pour corriger cet avertissement, utilisez le code suivant :

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

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

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

La comparaison explicite est appropriée pour case activée pour des valeurs spécifiquesHRESULT, telles que E_FAIL. Sinon, utilisez les macros ou FAILED les SUCCEEDED macros.

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++.