C6217
경고 C6217: 의미 체계가 다른 정수 형식 간의 암시적 캐스팅입니다. 'not'을 사용하여 HRESULT를 테스트하고 있습니다.SUCCEEDED 또는 FAILED 매크로를 대신 사용하십시오.
이 경고는 HRESULT를 not(!) 연산자로 테스트하고 있음을 나타냅니다.HRESULT에서 성공(S_OK)은 0 값으로 나타냅니다.하지만 0은 부울 형식에서는 실패를 나타냅니다.HRESULT를 not 연산자(!)로 테스트하여 실행할 코드 블록을 결정하면 잘못된 코드 경로를 따르게 될 수 있습니다.이 경우 원치 않는 결과가 발생할 수 있습니다.
예제
다음 코드에서는 not 연산자를 사용하여 HRESULT 값의 성공 또는 실패를 확인하기 때문에 이 경고가 생성됩니다.이 경우 ( !hr )가 실패 코드를 실행하므로 잘못된 코드 경로가 실행됩니다.
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (!hr)
{
// failure code ...
}
else
{
// success code ...
}
}
이 경고를 해결하기 위해 다음 코드에서는 FAILED 매크로를 사용하여 실패를 찾습니다.
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// failure code ...
}
else
{
// success code ...
}
}
이 경고의 경우 SCODE 형식은 HRESULT와 동일합니다.
부울로 테스트할 때 HRESULT의 일반적인 성공 값(S_OK)은 false입니다.
HRESULT의 성공 여부를 확인하려면 SUCCEEDED 매크로를 대신 사용하십시오.