# V760. Two identical text blocks were detected. The second block starts with NN string.

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

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

    void Example(int *a, int *b, size_t n)
    {
      ....
      for (size_t i = 0; i != n; i++)
        a[i] = 0;
      for (size_t i = 0; i != n; i++)
        a[i] = 0;
      ....
    }

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

    void Example(int *a, int *b, size_t n)
    {
      ....
      for (size_t i = 0; i != n; i++)
        a[i] = 0;
      for (size_t i = 0; i != n; i++)
        b[i] = 0;
      ....
    }

Анализатор не выдаёт сообщение, если найдено больше двух блоков текста. Пример:

    void Foo();
    void Example()
    {
      ....
      Foo();
      Foo();
      Foo();
      Foo();
      ....
    }

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

    switch(t) {
      case '!': InvokeMethod(&obj_Sylia, "!", 1); break;
      case '~': InvokeMethod(&obj_Sylia, "~", 1); break;
      case '+': InvokeMethod(&obj_Sylia, "+", 1); break;
      case '-': InvokeMethod(&obj_Sylia, "-", 1); break;
        break;
      default:
        SCRIPT_ERROR(PARSE_ERROR);
    }

Нужно присмотреться. В данном случае мы имеем дело с очень коротким повторяющимся блоком. Этот блок - оператор 'break'. Один из операторов здесь лишний. В данном примере это не приводит к настоящей ошибке, но лишний 'break' стоит удалить:

    switch(t) {
      case '!': InvokeMethod(&obj_Sylia, "!", 1); break;
      case '~': InvokeMethod(&obj_Sylia, "~", 1); break;
      case '+': InvokeMethod(&obj_Sylia, "+", 1); break;
      case '-': InvokeMethod(&obj_Sylia, "-", 1); break;
      default:
        SCRIPT_ERROR(PARSE_ERROR);
    }

Примечание

Дублирование кода само по себе не является ошибкой. Однако, даже если ошибки нет, предупреждение V760 может служить подсказкой, что одинаковые блоки кода стоит вынести в функцию. См. также диагностику V761.

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