C6217
Note
This article applies to Visual Studio 2015. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here
warning C6217: Implicit cast between semantically different integer types: testing HRESULT with 'not'. Consider using SUCCEEDED or FAILED macro instead.
This warning indicates that an HRESULT
is being tested with the not (!
) operator. A success (S_OK
) in HRESULT
is indicated by a value of 0. However, 0 indicates failure for a Boolean type. Testing HRESULT
with the not operator (!
) to determine which code block to run can cause following the wrong code path. This will lead to unwanted results.
Example
The following code generates this warning because the not operator is used to determine success or failure of an HRESULT
value. In this case, wrong code path is executed because ( !hr )
runs the failure code:
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (!hr)
{
// failure code ...
}
else
{
// success code ...
}
}
To correct this warning, the following code uses FAILED
macro to look for failure:
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// failure code ...
}
else
{
// success code ...
}
}
For this warning, the SCODE
type is equivalent to HRESULT
.
The typical success value of HRESULT (S_OK
) is false
when it is tested as a Boolean.
To verify whether HRESULT
is a success, use the SUCCEEDED
macro instead.