Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Implicit cast between semantically different integer types: testing HRESULT with 'not'. Consider using
SUCCEEDEDorFAILEDmacro instead.
Remarks
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
Example
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 ...
}
}