# V778. Two similar code fragments. Perhaps, it is a typo and 'X' variable should be used instead of 'Y'.

Анализатор обнаружил код, который, возможно, содержит опечатку. Высока вероятность, что подобный код был создан с использованием подхода Copy-Paste.

Данная диагностика выявляет два схожих по структуре блока текста, идущих один за другим и отличающихся именем одной переменной. Предупреждение V778 предназначено для выявления тех случаев, если второй блок был получен путем копирования первого, при этом во втором блоке были переименованы не все переменные.

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

    void Example(int a, int b)
    {
      ....
      if (a > 50)
        doSomething(a);
      else if (a > 40)
        doSomething2(a);
      else
        doSomething3(a);

      if (b > 50)
        doSomething(b);
      else if (a > 40)    // <=
        doSomething2(b);
      else
        doSomething3(b);
      ....
    }

Код писался с помощью Copy-Paste. Во втором блоке не уследили и забыли заменить все переменные 'a' на 'b'. На самом деле, код должен быть таким:

    void Example(int a, int b)
    {
      ....
      if (a > 50)
        doSomething(a);
      else if (a > 40)
        doSomething2(a);
      else
        doSomething3(a);

      if (b > 50)
        doSomething(b);
      else if (b > 40)
        doSomething2(b);
      else
        doSomething3(b);
      ....
    }

Теперь рассмотрим пример, взятый из реального проекта:

    ....
    if(erendlinen>239) erendlinen=239;
    if(srendlinen>erendlinen) srendlinen=erendlinen;

    if(erendlinep>239) erendlinep=239;
    if(srendlinep>erendlinen) srendlinep=erendlinep;   // <=
    ....

Заметить ошибку не так уж и просто по сравнению с предыдущим примером. Имена переменных похожи друг на друга, и поэтому выявление ошибки усложняется в разы. На самом деле во втором блоке вместо переменной 'erendlinen' должна стоять 'erendlinep'.

Имена переменных 'erendlinen' и 'erendlinep' выбраны явно неудачно. Такую ошибку почти невозможно заметить при Code Review. Да что уж там, даже когда анализатор указывает на строку с ошибкой и то сложно её заметить. Поэтому, встретив предупреждение V778, рекомендуем не спешить и внимательно изучить код.

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

CWE-682

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