Condividi tramite


Avviso C6217

Cast implicito tra tipi integer semanticamente diversi: test HRESULT con 'not'. È consigliabile usare SUCCEEDED o FAILED macro.

Osservazioni:

Questo avviso indica che il codice testa un oggetto HRESULT con l'operatore logical-not (!). Il valore 0 (il valore definito per S_OK) indica l'esito positivo in un oggetto HRESULT. Tuttavia, 0 indica anche un errore per un tipo booleano. Se si testa un oggetto HRESULT con l'operatore logical-not (!) per determinare il blocco di codice da eseguire, può causare un comportamento errato o codice che confonde i gestori futuri.

Per verificare se un oggetto HRESULT ha esito positivo o negativo, utilizzare invece le SUCCEEDED macro o FAILED .

Questo avviso funziona sia per i HRESULT tipi che SCODE per i tipi .

Nome dell'analisi del codice: TESTING_HRESULT_WITH_NOT

Esempio

Il codice seguente genera questo avviso perché usa l'operatore logical-not (!) per determinare l'esito positivo o negativo di un HRESULT valore. In questo caso, il codice esegue il percorso di codice errato perché un HRESULT valore pari a 0 indica l'esito positivo, quindi ( !hr ) esegue erroneamente il codice di errore:

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL);
  if (!hr)
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

Per correggere questo avviso, il codice seguente usa una FAILED macro per verificare la presenza di errori:

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL);
  if (FAILED(hr))
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

Vedi anche

SUCCEEDED Macro
FAILED Macro