Partager via


Avertissement C6217

Conversion implicite entre des types entiers sémantiquement différents : test de HRESULT avec « not ». Envisagez plutôt d’utiliser SUCCEEDED ou FAILED 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 ...
  }
}

Voir aussi

SUCCEEDED Macro
FAILED Macro