﻿# V3056\. Consider reviewing the correctness of 'X' item's usage\.

Анализатор выявляет случаи, когда для условных переменных 'x' и 'y' дважды использовался условный метод 'GetX', вместо 'GetX' и 'GetY' соответственно\.

Рассмотрим пример:

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

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

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

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

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

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

```cpp
var t1 = new Thread { Name = "Thread 1" };
var t2 = new Thread { Name = "Thread 2" };
var m1 = new Message { Name = "Thread 1: Message 1", Thread = t1};
var m2 = new Message { Name = "Thread 1: Message 2", Thread = t1};
var m3 = new Message { Name = "Thread 2: Message 1", Thread = t2};
```

Анализатор предположил, что при объявлении переменной 'm2' использовалось копирование кода и возникла ошибка: используется переменная 't1', а не 't2'\. На самом деле ошибки нет\. Исходя из текста сообщений, можно сделать вывод, что тест проверят вывод сообщений 'm1', 'm2' из одного потока 't1', а вывод сообщения 'm3' из потока 't2'\. Для подобных случаев ошибочного анализа, есть возможность убрать предупреждение, вписав в код комментарий "//\-V3056" или использовать другие методы подавления ложных предупреждений\.