Condividi tramite


Avviso C6230

Cast implicito tra tipi integer semanticamente diversi: uso di HRESULT in un contesto booleano

Osservazioni:

Questo avviso indica che un bare HRESULT viene usato in un contesto in cui è previsto un risultato booleano, ad esempio un'istruzione if . È probabile che questo test restituisca risultati non corretti. Ad esempio, il valore di esito positivo tipico per HRESULT (S_OK) è false quando viene testato come valore booleano.

Nome dell'analisi del codice: USING_HRESULT_IN_BOOLEAN_CONTEXT

Esempio

Il codice seguente genera questo avviso:

#include <windows.h>

VOID f( )
{
  LPMALLOC pMalloc;
  HRESULT hr = CoGetMalloc(1, &pMalloc);

  if (hr)
  {
    // code ...
  }
  else
  {
    // code ...
  }
}

Nella maggior parte dei casi, la macro SUCC edizione Enterprise DED o FAILED deve essere usata per testare il valore di HRESULT. Per correggere questo avviso, usare il codice seguente:

#include <windows.h>

VOID f( )
{
  LPMALLOC pMalloc;
  HRESULT hr = CoGetMalloc(1, &pMalloc);

  if (SUCCEEDED(hr))
  {
    // code ...
  }
  else
  {
    // code ...
  }
}

Per questo avviso, il SCODE tipo viene considerato come .HRESULT

L'uso di malloc e free (e delle API di memoria dinamica correlate) ha molte insidie come causa di perdite di memoria ed eccezioni. Per evitare questi tipi di perdite ed eccezioni, usare le classi puntatore e contenitore fornite dalla libreria standard C++. Questi includono shared_ptr, unique_ptr e vettore. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.