C6217
Mise à jour : novembre 2007
C6217
Avertissement C6217 : Cast implicite entre types d'entiers sémantiquement différents : test de HRESULT avec 'not'. Si possible, utilisez plutôt la macro SUCCEEDED ou FAILED.
Cet avertissement indique que HRESULT est testé avec l'opérateur not (!). Un succès (S_OK) dans HRESULT est indiqué par la valeur 0. Toutefois, cette valeur indique l'échec d'un type Boolean. Le test de HRESULT avec l'opérateur not (!) pour déterminer le bloc de code à exécuter peut provoquer le suivi d'un chemin d'accès de code incorrect. Cela génère des résultats non désirés.
Exemple
Le code suivant génère cet avertissement car l'opérateur not est utilisé pour déterminer le succès ou l'échec d'une valeur HRESULT. Dans ce cas, un chemin d'accès de code incorrect est exécuté car ( !hr ) exécute le code d'échec :
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (!hr)
{
// failure code ...
}
else
{
// success code ...
}
}
Pour corriger cet avertissement, le code suivant utilise la macro FAILED pour rechercher l'échec :
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// failure code ...
}
else
{
// success code ...
}
}
Pour cet avertissement, le type SCODE équivaut à HRESULT.
La valeur de succès classique de HRESULT (S_OK) est false lorsqu'elle est testée comme un type Boolean.
Pour vérifier si HRESULT est un succès, utilisez la macro SUCCEEDED à la place.