Avviso C6221

Cast implicito tra tipi integer semanticamente diversi: confronto di HRESULT con un numero intero. Valutare invece l'uso di SUCCEEDED macro o FAILED

Osservazioni:

Questo avviso indica che un oggetto HRESULT viene confrontato con un numero intero diverso da zero.

Un esito positivo in un oggetto HRESULT (S_OK) è rappresentato da un valore 0. Di conseguenza, un cast implicito di un HRESULT oggetto a un numero intero genera un valore non corretto e probabilmente genera un risultato errato. L'errore è spesso causato dall'aspettarsi erroneamente che una funzione restituisca un intero quando restituisce effettivamente un oggetto HRESULT.

Nome dell'analisi del codice: COMPARING_HRESULT_TO_INT

Esempio

Il codice seguente genera l'avviso C6221 confrontando un oggetto HRESULT con un valore intero:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (hr == 4)
  {
    // failure code ...
    return S_FALSE;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

Per correggere l'avviso, nel codice seguente viene utilizzata la FAILED macro :

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (FAILED(hr))
  {
    // failure code ...
    return S_FALSE;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

Per questo avviso, il SCODE tipo è equivalente a HRESULT.

Per altre informazioni, vedere SUCCEEDED Macro e FAILED macro.

L'uso di malloc e free (e relative API di allocazione dinamica della memoria) presenta molti problemi in termini di perdite di memoria ed eccezioni. Per evitare completamente questi tipi di potenziali perdite, usare i meccanismi forniti dalla libreria standard C++ (STL). Sono inclusi shared_ptri contenitori , e , unique_ptrad esempio vector. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.