| description | Learn more about: Warning C6217 | |||
|---|---|---|---|---|
| title | Warning C6217 | |||
| ms.date | 2/07/2023 | |||
| f1_keywords |
|
|||
| helpviewer_keywords |
|
Implicit cast between semantically different integer types: testing HRESULT with 'not'. Consider using
SUCCEEDEDorFAILEDmacro instead.
This warning indicates that the code tests an HRESULT with the logical-not (!) operator. A value of 0 (the value defined for S_OK) indicates success in an HRESULT. However, 0 also indicates failure for a Boolean type. If you test an HRESULT with the logical-not operator (!) to determine which code block to run, it can cause incorrect behavior or code that confuses future maintainers.
To verify whether an HRESULT is a success or failure, use the SUCCEEDED or FAILED macros instead.
This warning works for both HRESULT and SCODE types.
Code analysis name: TESTING_HRESULT_WITH_NOT
The following code generates this warning because it uses the logical-not (!) operator to determine success or failure of an HRESULT value. In this case, the code executes the wrong code path because an HRESULT of 0 indicates success, so ( !hr ) incorrectly 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 a FAILED macro to check for failure:
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// failure code ...
}
else
{
// success code ...
}
}