Condividi tramite


Avviso C6220

Cast implicito tra tipi integer semanticamente diversi: confronto tra HRESULT e -1. Prendere in considerazione l'uso SUCCEEDED o FAILED la macro

Questo avviso indica che un oggetto HRESULT viene confrontato con un valore esplicito eHRESULT diverso da -1, che non è un formato corretto HRESULT.

Osservazioni:

Un errore in HRESULT (E_FAIL) non è rappresentato da -1. Pertanto, un cast implicito di un HRESULT oggetto a un numero intero genererà un valore non corretto e potrebbe causare un risultato errato.

Nome dell'analisi del codice: COMPARING_HRESULT_TO_MINUS_ONE

Esempio

Nella maggior parte dei casi, l'avviso C6220 è causato dal codice che prevede erroneamente che una funzione restituisca un numero intero e di usare -1 come valore di errore, ma la funzione restituisce invece un oggetto HRESULT. L'esempio di codice seguente genera questo avviso:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

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

È consigliabile usare la SUCCEEDED macro o FAILED per testare il valore di un oggetto HRESULT. Per correggere questo avviso, usare il codice seguente:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

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

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

Il confronto esplicito è appropriato per verificare la presenza di valori specificiHRESULT, ad esempio . E_FAIL In caso contrario, utilizzare le SUCCEEDED macro o FAILED .

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++.