The fragment is taken from NAME project. The code contains an error that analyzer diagnoses in the following way: V721 The VARIANT_BOOL type is utilized incorrectly. The true value (VARIANT_TRUE) is defined as -1. Inspect the first argument.
virtual HRESULT __stdcall put_HandleKeyboard (VARIANT_BOOL pVal) = 0; .... pController->put_HandleKeyboard(true);
There is quite a witty quote:
We all truck around a kind of original sin from having learned Basic at an impressionable age. (C) P.J. Plauger
And this hint is exactly on the topic of evil. VARIANT_BOOL type came to us from Visual Basic. Some of our present day programming troubles are connected with this type. The thing is that “true” is coded as -1 in it.
Let’s see the declaration of the type and the constants denoting true/false:
typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
It seems like there is nothing terrible in it. False is 0, and truth is not 0. So, -1 is quite a suitable constant. But it’s very easy to make an error by using true or TRUE instead of VARIANT_TRUE.
If you see an unknown type, it’s better not to hurry, and to look up in the documentation. Even if the type name has a word BOOL, it doesn’t mean that you can place 1 into the variable of this type.
In the same way programmers sometimes make mistakes, when they use HRESULT type, trying to compare it with FALSE or TRUE and forgetting that:
#define S_OK ((HRESULT)0L) #define S_FALSE ((HRESULT)1L)
So we really ask you to be very careful with any types which are new to you, and not to hasten when programming.
Written by Andrey Karpov.
This error was found with PVS-Studio static analysis tool.