Avertissement C6217
Conversion implicite entre des types entiers sémantiquement différents : test de HRESULT avec « not ». Envisagez plutôt d’utiliser
SUCCEEDED
ouFAILED
de macro.
Notes
Cet avertissement indique que le code teste un HRESULT
opérateur non logique (!
) avec le code. La valeur 0 (la valeur définie pour S_OK
) indique la réussite dans un HRESULT
. Toutefois, 0 indique également l’échec d’un type booléen. Si vous testez un HRESULT
opérateur non logique (!
) pour déterminer le bloc de code à exécuter, il peut provoquer un comportement incorrect ou du code qui confond les futurs maintenances.
Pour vérifier si une HRESULT
réussite ou un échec est un échec, utilisez plutôt les macros ou FAILED
les SUCCEEDED
macros.
Cet avertissement fonctionne pour les deux HRESULT
types.SCODE
Nom de l’analyse du code : TESTING_HRESULT_WITH_NOT
Exemple
Le code suivant génère cet avertissement, car il utilise l’opérateur non logique (!
) pour déterminer la réussite ou l’échec d’une HRESULT
valeur. Dans ce cas, le code exécute le chemin de code incorrect, car un HRESULT
0 indique la réussite. Par conséquent ( !hr )
, exécute incorrectement 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 une FAILED
macro pour case activée en cas d’échec :
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// failure code ...
}
else
{
// success code ...
}
}