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: using HRESULT in a Boolean context
Remarks
This warning indicates that a bare HRESULT
is used in a context where a Boolean result is expected, such as an if
statement. This test is likely to yield incorrect results. For example, the typical success value for HRESULT
(S_OK
) is false when it's tested as a Boolean.
Code analysis name: USING_HRESULT_IN_BOOLEAN_CONTEXT
Example
The following code generates this warning:
#include <windows.h>
VOID f( )
{
LPMALLOC pMalloc;
HRESULT hr = CoGetMalloc(1, &pMalloc);
if (hr)
{
// code ...
}
else
{
// code ...
}
}
In most situations, the SUCCEEDED or FAILED macro should be used to test the value of the HRESULT
. To correct this warning, use the following code:
#include <windows.h>
VOID f( )
{
LPMALLOC pMalloc;
HRESULT hr = CoGetMalloc(1, &pMalloc);
if (SUCCEEDED(hr))
{
// code ...
}
else
{
// code ...
}
}
For this warning, the SCODE
type is treated as an HRESULT
.
The use of malloc
and free
(and related dynamic memory APIs) has many pitfalls as a cause of memory leaks and exceptions. To avoid these kinds of leaks and exception problems, use the pointer and container classes provided by the C++ Standard Library. These include shared_ptr, unique_ptr, and vector. For more information, see Smart Pointers and C++ Standard Library.