Compartilhar via


C6220

aviso C6220: Conversão implícita entre tipos inteiros semanticamente diferentes: comparando HRESULT a -1.Considere alternativamente utilizar a macro SUCCEEDED ou FAILED

Este aviso indica que um HRESULT está sendo comparado com um valor de não HRESULT explícito de -1, que não é um HRESULT bem formado.Uma falha em HRESULT (E_FAIL) não é representada por -1.Portanto, uma conversão implícita de um HRESULT em um inteiro gerará um valor incorreto e provavelmente levará ao resultado incorreto.

Exemplo

Na maioria dos casos, esse aviso é causado pelo código que, equivocadamente, espera que uma função que deve retornar HRESULT retorne um inteiro, usando – 1 como um valor de falha.O exemplo de código a seguir gera este aviso:

#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;
  }
}

É melhor usar a macro de SUCCEEDED ou de FAILED para testar o valor de HRESULT.Para corrigir esse aviso, use o seguinte código:

#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;
  }
}

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

A comparação explícita é apropriada para verificar valores específicos de HRESULT, como, E_FAIL.Caso contrário, use as macros SUCCEEDED ou FAILED.

Para obter mais informações, consulte as macros APROVADAS e REPROVADAS.

Observe que o uso de malloc e free (e APIs de alocação de memória dinâmica relacionadas) têm várias armadilhas em termos de vazamentos de memória e exceções.Para evitar esses tipos de vazamentos e problemas de exceção no geral, use os mecanismos que são fornecidos pela STL (Biblioteca de Modelos Padrão) do C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão C++.