﻿# V537\. Potential incorrect use of item 'X'\. Consider inspecting the expression\.

Анализатор обнаружил потенциально возможную опечатку в коде, связанную с неверным использованием схожих имен\.

Данное правило пытается эвристическим методом обнаружить ошибку схожую со следующей:

```cpp
int x = static_cast<int>(GetX()) * n;
int y = static_cast<int>(GetX()) * n;
```

Во второй строке вместо функции 'GetY' используется 'GetX'\. Корректный код:

```cpp
int x = static_cast<int>(GetX()) * n;
int y = static_cast<int>(GetY()) * n;
```

Для обнаружения этого подозрительного места анализатор следовал следующей логике\. Мы имеем строку, где используется имя, включающее в себя фрагмент 'x'\. Рядом с ней есть строка, где используется похожее имя, содержащая 'y'\. Но при этом во второй строке также есть и 'X'\. Так как выполнилось это и еще некоторые условия, данную конструкцию следует считать нуждающейся в проверке программистом\. Если бы, например, слева не было переменных 'x' и 'y', то такой код не считался бы опасным\. Пример кода, на который анализатор не обратит внимания:

```cpp
array[0] = GetX() / 2;
array[1] = GetX() / 2;
```

К сожалению, данное правило часто дает ложное срабатывание, так как анализатор не имеет представления об устройстве программы и предназначении кода\. Пример ложного срабатывания:

```cpp
halfWidth -= borderWidth + 2;
halfHeight -= borderWidth + 2;
```

Анализатор предположил, что возможно второй строкой должно быть иное выражение, например: 'halfHeight \-\= borderHeight \+ 2'\. На самом деле никакой ошибки нет\. Размер границы \('border'\) одинаков по вертикали и горизонтали\. Такой константы как 'borderHeight' просто не существует\. Однако подобные высокоуровневые абстракции не доступны анализатору\. Чтобы убрать предупреждение вы можете вписать в код комментарий '//\-V537'\.

Можно использовать и другой приём для предотвращения ложных срабатываний\. Возьмём вот такой фрагмент кода:

```cpp
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = bsdf->alpha_x;
```

Этот код корректен, но выглядит подозрительно, причём не только с точки зрения анализатора\. Человеку, который будет сопровождать код, будет сложно понять, ошибочен он или нет\. Если переменным 'alpha\_x' и 'alpha\_y' хочется присвоить одно и тоже значение, то можно написать так:

```cpp
bsdf->alpha_y = bsdf->alpha_x = closure->alpha_x;
```

Этот код не вызовет вопроса у человека, а анализатор не выдаст предупреждение\.