Какой инструмент использовать для поиска дублированного кода Ada из-за копирования и вставки - PullRequest
1 голос
/ 29 февраля 2012

Я ищу инструмент для поиска дублированного кода из-за программирования копирования и вставки, которое будет выполняться на большой базе кода Ada. Я полагаю, что поддержка Ada в инструменте важна для обнаружения не только тривиальных сходств текста, то есть игнорирования разметки или различий в идентификаторах и т. Д.

Инструменты, которые я нашел с поддержкой Ada, следующие:

  1. Clone Doctor, коммерческий продукт с поддержкой нескольких языков, включая Ada. http://www.semdesigns.com/Products/Clone/index.html
  2. ConQAT: коммерчески поддерживаемый продукт с открытым исходным кодом, включающий инструмент CloneDetection с поддержкой Ada с сентября 2011 года http://conqat.cs.tum.edu/index.php/CloneDetectionTutorial

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

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Я автор CloneDR. Прочитайте следующее понимание моего уклона.

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

ConQAT является представителем так называемых «основанных на токене» детекторов. Они соответствуют последовательностям языковых токенов (операторы, идентификаторы, скобки, ключевые слова и т. Д.). Хорошая новость в том, что они довольно быстрые (это не большая проблема; вы не запускаете обнаружение клонов каждые 30 секунд, достаточно одной недели в неделю). ). Они найдут некоторые клоны, которые почти отсутствуют, в том смысле, что другой идентификатор или константа заменяет идентификатор в клоне. Плохая новость заключается в том, что они не понимают структуру вашего кода и, следовательно, хотят сообщать о таких вещах, как

 } void ID ( ID

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

CloneDR работает, анализируя код (даже для Ada) точно так же, как компилятор, создавая деревья абстрактного синтаксиса и сопоставляя деревья вплоть до точки различия. Он не может предложить клона, который глупо пересекает границы структуры. Он найдет почти промахи того же рода, что и детекторы на основе токенов, но это выходит за рамки этого. CloneDR найдет последовательные замены («анти-унификаторы»), что означает, что клоны могут быть объяснены небольшим количеством параметров, которые использовались во многих местах в клоне, и он найдет варианты в коде, в которых несоответствия больше, чем одиночный токен, например, выражения, операторы, объявления, даже блоки. Таким образом, он дает меньше ложных срабатываний и лучшие ответы. Независимые исследовательские отчеты, в которых сравниваются типы детекторов клонов, в частности, включая CloneDR, согласуются с этим анализом .

Более подробное обсуждение можно найти по ссылке Clone Doctor, которую вы перечислили выше. Вы можете увидеть примеры обнаруженных клонов для многих языков (но у нас нет отчета Ada на веб-сайте).

РЕДАКТИРОВАТЬ 19 марта 2012 г .:

Теперь вы можете скачать пробную копию Ada95 CloneDR .

0 голосов
/ 29 февраля 2012

Ира Бакстер имеет хорошее описание.

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

В частности, мы довольны CCFinderX , потому что он имеет хороший интерфейс визуализации. Тем не менее, он содержит ошибки, не поддерживается, и код был выпущен, но без каких-либо лицензионных заявлений.

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

Если вам нужна лучшая точность, вы точно знаете язык, который нужно проанализировать (например, с C или C ++, это не всегда так), и вы можете найти инструмент, который анализирует именно этот язык (что также является проблемой с C и C ++) подход на основе парсинга может быть лучше, как пишет Ира.

...