Warning C6230

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.