﻿# V721\. The VARIANT\_BOOL type is used incorrectly\. The true value \(VARIANT\_TRUE\) is defined as \-1\.

Анализатор обнаружил, что неправильно используется значение типа VARIANT\_BOOL\. Дело в том, что значение истина \(VARIANT\_TRUE\) обозначается как \-1\. Многие программисты не ожидают такого подвоха и используют тип неправильно\.

Вот как объявлен тип VARIANT\_TRUE и константы для обозначения "истина" и "ложь":

```cpp
typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
```

Рассмотрим несколько примеров неправильной работы с типом VARIANT\_TRUE\. Во всех случаях программист ожидает, что условие будет истинно\. Но на самом деле условие всегда ложно\.

Пример N1\.

```cpp
VARIANT_BOOL variantBoolTrue = VARIANT_TRUE;
if (variantBoolTrue == true) // false
```

Если подставить значение в выражение, то мы получим: \(\(short\)\(\-1\) \=\= true\)\. При вычислении выражения, 'true' превратится в '1'\. Условие \(\-1 \=\= 1\) ложно\.

Правильный вариант:

```cpp
if (variantBoolTrue == VARIANT_TRUE)
```



Пример N2\.

```cpp
VARIANT_BOOL variantBoolTrue = TRUE;
if (variantBoolTrue == VARIANT_TRUE) //false
```

Здесь программист ошибся и использовал TRUE вместо VARIANT\_TRUE\. В результате переменной variantBoolTrue будет присвоено значение 1\. Это недопустимое значение для переменных типа VARIANT\_BOOL\.

Если подставить значение в выражение, то мы получим: \(1 \=\= \(short\)\(\-1\)\)\.

Правильный вариант:

```cpp
VARIANT_BOOL variantBoolTrue = VARIANT_TRUE;
```

Пример N3\.

```cpp
bool bTrue = true;
if (bTrue == VARIANT_TRUE) //false
```

Раскроем выражение: \(true \=\= \(short\)\(\-1\)\)\. При вычислении выражения 'true' превратится в '1'\. Условие \(1 \=\= \-1\) ложно\.

Правильный вариант привести затруднительно\. Код в принципе неверен\. Нельзя смешивать переменные типа 'bool' и значения типа 'VARIANT\_TRUE'\. 

Подобных примеров можно придумать достаточно много\. Например, формальный аргумент функции имеет тип VARIANT\_BOOL\. А в качестве фактического аргумента будет передано значение 'true'\. Ещё вариант \- функция возвращает неправильно значение\. И так далее\.

**Самое главное \- не смешивать тип VARIANT\_BOOL с типами BOOL, bool и BOOLEAN\.**

**Дополнительные ссылки:**

1. MSDN\. [VARIANT\_BOOL](https://msdn.microsoft.com/en-us/library/cc237864.aspx)\.
1. The Old New Thing\. [BOOL vs\. VARIANT\_BOOL vs\. BOOLEAN vs\. bool](https://devblogs.microsoft.com/oldnewthing/2004/12/22)\.