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 (page éventuellement en anglais) ou FAILED (page éventuellement en anglais)

Cet avertissement indique que HRESULT est testé avec l'opérateur not (!).Une réussite (S_OK) dans HRESULT est indiquée par une valeur égale à 0.Toutefois, la valeur 0 indique un échec pour 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 réussite standard de HRESULT (S_OK) est false lorsqu'elle est testée comme une valeur booléenne.

Pour vérifier si HRESULT est un succès, utilisez la macro SUCCEEDED à la place.