Как автоматизировать обнаружение скопированного кода в большой базе кода?

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

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

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

5 ответов


просто использовать PMD пакета. Он поддерживает C++ и конфигурируемый CPD (Copy-Paste-Detection)...

Он также позволяет обнаруживать гораздо больше:

  • неиспользуемый код
  • нарушения стиля кодирования
  • метод/функция/подпрограмма размере
  • жесткая связь

и многое другое (хотя многие документы специфичны для Java, поэтому я не уверен, что еще применимо к C++)...


профессор Стэнфорда Алекс Эйкен разработал инструмент под названием мох (мера сходства программного обеспечения), которая используется для обнаружения плагиата в бакалавриате в нескольких университетах. Инструмент очень хорош в обнаружении фрагментов кода, которые структурно похожи. Я не знаю, насколько это применимо в вашем случае, но это может стоить изучения.


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

CloneDR отличается от других детекторов клонов:

  • использование языковой структуры / синтаксиса в качестве руководства (игнорирует языковые пробелы и комментарии - > не обманывается макетом, в отличие от чисто текстовых сопоставителей, таких как дубликаты детекторов стиля Рабина-карпа
  • обнаружение клонов с параметрическими колебаниями состоит не только из переменных или констант, но и целых операторов или блоков (в отличие от детекторов в стиле токенов)
  • демонстративно обеспечивая самую высокую точность ("несколько ложных срабатываний") отчетности в соответствии с рядом научных работ, сравнивающих детекторы клонов

существуют версии для C++ (Java, C#, ...), и вы можете увидеть примеры отчетов на сайте. Вы также можете скачать ознакомительную версию.

Я автор.


Я использовал simian для groovy и java, и это оказалось очень эффективным. Он поддерживал широкую конфигурацию и множество языков. Взгляните на http://www.harukizaemon.com/simian/features.html. Это бесплатно для некоммерческого использования, я предлагаю вам изучить с помощью лицензии оценки.


используя SourceMeter инструмент вы получаете текстовый отчет о дублированном исходном коде (клонах). Он обнаруживает так называемые клоны типа 2, которые структурно очень похожи, но могут отличаться лексически. Обнаруженные клоны целые синтаксические структуры (например, функции, блоки), поэтому они могут быть легко переработан, он не может случиться так, что клон начинается в конце и заканчивается в начале другого.

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