C6220
Avertissement C6220 : Cast implicite entre types d'entiers sémantiquement différents : comparaison de HRESULT à -1.Si possible, utilisez plutôt la macro SUCCEEDED ou FAILED.
Cet avertissement indique que HRESULT est comparé à une valeur explicite autre que HRESULT égale à -1, qui n'est pas un HRESULT de forme correcte.Un échec dans HRESULT (E_FAIL) n'est pas représenté par la valeur -1.Par conséquent, un cast implicite d'un HRESULT vers un entier générera une valeur incorrecte et conduira vraisemblablement à un résultat incorrect.
Exemple
Dans la plupart des cas, cet avertissement est provoqué par le code qui s'attend par erreur à ce qu'une fonction qui doit retourner HRESULT retourne à la place un entier, en utilisant la valeur -1 comme valeur d'échec.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 la macro SUCCEEDED ou FAILED pour tester la valeur de 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 type SCODE équivaut à HRESULT.
La comparaison explicite est appropriée pour vérifier des valeurs HRESULT spécifiques, par exemple E_FAIL.Sinon, utilisez la macro SUCCEEDED ou FAILED.
Pour plus d'informations, consultez Macro SUCCEEDED et Macro FAILED.
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++.