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.