Анализатор обнаружил код, который возможно содержит опечатку. Высока вероятность, что подобный код был создан с использованием подхода 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. |