﻿# V694\. The condition \(ptr \- const\_value\) is only false if the value of a pointer equals a magic constant\.

Анализатор обнаружил очень подозрительное условие\. К указателю прибавляется или из указателя вычитается константное значение\. Результат сложения/вычитания сравнивается с нулём\. Высока вероятность, что в коде имеется опечатка\.

Рассмотрим пример со сложением:

```cpp
int *p = ...;
if (p + 2)
```

Это условие будет всегда истинным\. Единственный случай, когда выражение будет равно 0, если специально записать в указатель магическое число "\-2"\. 

Исправленный вариант кода:

```cpp
int *p = ...;
if (*p + 2)
```

Теперь рассмотрим пример с подозрительным вычитанием:

```cpp
char *begin = ...;
char *end = ...;
....
const size_t ibegin = 1;
....
if (end - ibegin)
```

Из переменной 'end' следовало вычитать переменную 'begin'\. Из\-за неудачного именования переменных, случайно используется константная переменная 'ibegin', имеющая целочисленный тип\.

Исправленный вариант кода:

```cpp
char *begin = ...;
char *end = ...;
....
if (end - begin)
```

**Примечание\.** Предупреждение выводится только в том случае, если указатель является "настоящим"\. Например, он указывает на память, выделенную с помощью функции "malloc\(\)"\. Если анализатор не знает, чему равен указатель, он не выдаст предупреждение, чтобы сократить число ложных срабатываний\. Иногда, в указателях действительно передают "магические числа" и условия вида \(ptr \- 5 \=\= 0\) имеют смысл\.