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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Я автор.

Ответ 4

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

Ответ 5

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

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