C6217
avviso C6217: Cast implicito tra tipi integer semanticamente diversi: test di HRESULT con 'not' in corso. Considerare viceversa l'utilizzo della macro SUCCEEDED or FAILED.
L'avviso indica che un tipo HRESULT è sottoposto a test con l'operatore not (!). L'esito positivo (S_OK) in HRESULT viene indicato da un valore 0. 0 indica tuttavia un errore per un tipo boolean. Il test di HRESULT con l'operatore not (!) per determinare il blocco di codice da eseguire può indurre a seguire un percorso di codice non corretto e provocare risultati indesiderati.
Esempio
Il codice riportato di seguito genera l'avviso perché viene utilizzato l'operatore not per determinare l'esito positivo o negativo di un valore HRESULT. In questo caso, il percorso di codice non corretto viene eseguito perché ( !hr ) determina l'esecuzione del codice erroneo:
#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 utilizza la macro FAILED per ricercare l'errore:
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// failure code ...
}
else
{
// success code ...
}
}
Ai fini del presente avviso, il tipo SCODE equivale a HRESULT.
Il valore che in genere indica l'esito positivo di HRESULT (S_OK) è false quando viene testato come valore booleano.
Per verificare se HRESULT ha esito positivo, utilizzare la macro SUCCEEDED.