Aviso C6214

Converter entre tipos inteiros semanticamente diferentes: HRESULT para um tipo booleano

Este aviso indica que um HRESULT está sendo convertido em um tipo booliano. O valor de êxito (S_OK) de um HRESULT é igual a 0. No entanto, 0 indica falha para um tipo booliano. A conversão de um HRESULT em um tipo booliano e, em seguida, usá-lo em uma expressão de teste produzirá um resultado incorreto.

Comentários

Às vezes, esse aviso ocorre se um HRESULT estiver sendo armazenado em uma variável booliana. Qualquer comparação que use a variável booliana para testar sucesso ou a falha do HRESULT poderá levar a resultados incorretos.

Nome da análise de código: CAST_HRESULT_TO_BOOL

Exemplo

O código a seguir gera o aviso C6214:

#include <windows.h>

BOOL f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  hr = CoGetMalloc(1, &pMalloc);
  if ((BOOL)hr) // warning C6214
  {
    // success code ...
    return TRUE;
  }
  else
  {
    // failure code ...
    return FALSE;
  }
}

Para corrigir esse aviso, use o seguinte código:

#include <windows.h>

BOOL f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;

  hr = CoGetMalloc(1, &pMalloc);
  if (SUCCEEDED(hr))
  {
    // success code ...
    return TRUE;
  }
  else
  {
    // failure code ...
    return FALSE;
  }
}

Para este aviso, o tipo SCODE é equivalente a HRESULT.

Normalmente, a macro SUCCEEDED ou FAILED deve ser usada para testar o valor de um HRESULT.

Para obter mais informações, consulte um dos seguintes artigos:

SUCCEEDED

FAILED

Para fazer uso da metodologia moderna de alocação de memória C++, use os mecanismos fornecidos pela STL (Biblioteca Padrão do C++). Isso inclui shared_ptr, unique_ptre contêineres como vector. Para obter mais informações, confira Ponteiros inteligentes e Biblioteca Padrão do C++.