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

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

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

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

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

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

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

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

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

    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" или использовать другие методы подавления ложных предупреждений.

Данная диагностика классифицируется как:

CWE-682

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3056.