Мне нужен инструмент, чтобы найти дубликаты или похожие блоки текста в единственном текстовом файле или наборе текстовых файлов - PullRequest
5 голосов
/ 15 декабря 2009

Я хочу автоматизировать перемещение дублирующегося или похожего кода C в функции.

Это должно работать в Linux.

Ответы [ 6 ]

4 голосов
/ 15 декабря 2009

Подмножество вашей проблемы: Обнаружение дублирующего кода:

Попробуйте: PMD

Дублированный код может быть трудно найти, особенно в большом проекте. Но PMD Copy / Paste Detector (CPD) может найти его для вас! CPD прошел через три основных воплощения:

  • Сначала мы написали его, используя вариант алгоритма жадных строк Майкла Уайза (наш вариант описан здесь)
  • Затем он был полностью переписан Брайаном Юинсом с использованием преобразования Барроуза-Уилера
  • Наконец, Стив Хокинс переписал его для использования алгоритма сопоставления строк Карпа-Рабина.

...

Обратите внимание, что CPD работает с кодами Java, JSP, C, C ++, Fortran и PHP.

1 голос
/ 19 февраля 2010

См. CloneDR , инструмент для поиска точных копий и почти пропущенных (copy-paste-edit) клонов в исходном коде. Он использует полноязыковые синтаксические анализаторы, чтобы позволить ему находить клоны в соответствии со структурой языка, сводя к минимуму ложные срабатывания, и быть полностью независимым от того, как код комментируется или форматируется, тем самым максимизируя истинное обнаружение. CloneDR найдет клоны, когда клонированный блок изменил переменную, вставил состояния или блоки кода.

Он имеет языковые интерфейсы для C, C ++, COBOL, C #, Java, PHP и ряда других языков.

С примерами отчетов об обнаружении клонов можно ознакомиться на веб-сайте.

1 голос
/ 15 декабря 2009

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

Например, учитывая две функции, которые эквивалентны, но используют разные идентификаторы, текстовый поиск не увидит их как идентичные, но синтаксический анализатор может.

Также обратите внимание, что написание синтаксического анализатора C ++ не является тривиальной задачей, даже с учетом грамматики. Я предлагаю совет других и ищу инструмент для этого. Также ищите инструменты рефакторинга.

1 голос
/ 15 декабря 2009

Simian (отмеченный ранее) - хороший инструмент для этого. Я использовал CloneDetective в моем проекте, и он прекрасно работает. CloneDetective бесплатна, поэтому попробовать не стоит.

1 голос
/ 15 декабря 2009

Вам захочется взглянуть на Simian . Это бесплатно для некоммерческих проектов. Попробуйте что-то вроде:

# Find all C source files and identify similarities/duplicate code.
simian -includes=**/*.c -excludes=**/*_test.c
0 голосов
/ 19 января 2013

https://github.com/hudayou/fib

Инструмент для поиска идентичных блоков кода в файле или каталоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...