Можно ли настроить детектор дублирования кода SonarQube так, чтобы он останавливался на границах метода?

Я использую SonarQube в своих Java-проектах и ​​хочу, насколько это возможно, исключить дублирование кода.

Моя проблема в том, что обнаружение дублирования кода SonarQube не учитывает границы методов. Он перечисляет идентичные части файлов как дубликаты, и часто бывает так, что дублирование начинается в середине одного метода и заканчивается в середине другого. Их вряд ли можно рефакторить.

Вот пример. Нажмите на файл MavenArtifactRepository.java в верхнем правом списке и посмотрите на 4-й блок дублирования в нижней части страницы.

Есть ли способ параметризовать подключаемый модуль детектора дублирования кода, чтобы он отображал синтаксически согласованные дубликаты?


person f.r    schedule 05.05.2014    source источник
comment
Проверьте наш инструмент CloneDR; он выполняет сопоставление на основе AST, которое неявно учитывает границы структуры кода, такие как методы. Смотрите мою биографию. (Я бы предоставил ссылку, но SO, похоже, ненавидит мои ссылки на инструменты).   -  person Ira Baxter    schedule 08.05.2014


Ответы (2)


В настоящее время вы не можете добиться этого, настроив сам SonarQube. Однако вы можете попробовать наш инструмент SourceMeter с его плагин SonarQube, который реализует обнаружение клонов на основе AST и, следовательно, представляет синтаксически согласованные дубликаты внутри SonarQube. For an example, you may take a look at the онлайн-демонстрация.

person Tibor Bakota - FrontEndART    schedule 06.05.2014

Упомянутая вами проблема хорошо известна в сообществе исследователей клонов и является одной из основных проблем, почему не так много людей используют обнаружение клонов на практике. SonarQube реализует довольно простой и наивный алгоритм, который обнаруживает дублирование кода на основе последовательностей токенов и поэтому не понимает, что такое метод (помимо ряда других проблем). Так что ответ на ваш вопрос нет.

Одним из решений может быть поиск алгоритма обнаружения клонов, который выявляет дублирование кода на основе абстрактных синтаксических деревьев (AST). Но, насколько мне известно, такого бесплатного инструмента нет.

Альтернативным решением может быть использование ConQAT. ConQAT также использует метод обнаружения клонов на основе токенов, но имеет довольно сложные этапы постобработки. Одним из них является так называемое «AST-выравнивание», при котором повторяющиеся фрагменты кода выравниваются с синтаксическими единицами (такими как методы) в исходном коде после обнаружения. Это должно быть именно то, что вы ищете.

person Nils Göde    schedule 06.05.2014
comment
Я считаю, что ранее упомянутый плагин CodeAnalyzer действительно использует обнаружение клонов на основе AST. - person Rhino666; 06.05.2014