Sdílet prostřednictvím


C6220

upozornění C6220: Implicitní přetypování mezi sémanticky rozdílnými celočíselnými typy: porovnávání hodnoty HRESULT s -1.Zvažte raději použití makra SUCCEEDED nebo FAILED

Toto upozornění označuje, že HRESULT je porovnáván s explicitní hodnotou -1, která neodpovídá HRESULT, což není dobře utvoření HRESULT.Selhání v HRESULT (E_FAIL) není reprezentováno hodnotou -1.Proto implicitní přetypování HRESULT na celé číslo bude generovat nesprávnou hodnotu a pravděpodobně povede k nesprávnému výsledku.

Příklad

Ve většině případů toto upozornění je způsobeno tím, že kód omylem očekává, že funkce, která by měla vrátit HRESULT, místo toho vrátí celočíselnou hodnotu, s použitím -1 jako hodnoty selhání.Následující ukázka kódu generuje toto upozornění:

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

Je nejvhodnější použít makra SUCCEEDED nebo FAILED pro testování hodnot HRESULT.Pro opravu tohoto upozornění použijte následující kód:

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

Pro toto upozornění je typ SCODE ekvivalentní k HRESULT.

Explicitní porovnání je vhodné pro kontrolu konkrétních hodnot HRESULT, jako například E_FAIL.Jinak použijte makra SUCCEEDED nebo FAILED.

Další informace viz Makro SUCCEEDED a Makro FAILED.

Všimněte si, že použití malloc a free (a souvisejících rozhraní API přidělení dynamické paměti) má mnoho nástrah v podobě nevracení paměti a výjimek.Chcete-li zabránit těmto druhům problémů úniky a výjimkami zcela, použijte mechanismy, které jsou k dispozici v knihovně C++ STL.Patří mezi ně shared_ptr, unique_ptr a vector.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.