Подобный детектор кода

Я ищу инструмент, который мог бы сравнивать исходные коды для сходства.

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

Мои требования:

  • достаточно небольшое количество ложных срабатываний
  • хорошая скорость обнаружения (да, они идут друг против друга)
  • идеально с более сложным результатом, чем просто одно значение
  • для C (C99) и С++ (С++ 03 и оптимально С++ 11)
  • все еще поддерживается
  • используется для сравнения двух исходных файлов друг с другом.
  • используется в неинтерактивном режиме

EDIT:

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

for (int i = 0; i < 10; i++) { bla; }

int i; while (i < 10) { bla; i++; }

То же самое и здесь:

int x = 10; y = x + 5;

int a = 10; y = a + 5;

Ответы

Ответ 1

Я использовал MOSS в прошлом: http://theory.stanford.edu/~aiken/moss/ для обнаружения плагиата. Поскольку он работает на семантическом уровне, он обнаружит ситуации, которые вы представили выше. Инструмент ориентирован на знание языков, поэтому комментарии не рассматриваются в анализе, и он долгий путь в обнаружении кода, который был изменен путем простого поиска и замены имен переменных и/или функций.

Примечание. Я использовал этот инструмент несколько лет назад, когда я преподавал информатику в градообразующей школе, и он отлично работал в обнаружении кода, который был вырван из Интернета. Вот хорошо документированная учетная запись подобного приложения: http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

Если вы Google "измерьте сходство программного обеспечения", вы должны найти еще несколько полезных хитов: http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html

Ответ 2

Ваша проблема в терминологии информатики может быть указана как обнаружение плагиата исходного кода. Хорошим началом было бы прочитать эту статью о д-ра Доббс: Обнаружение плагиата исходного кода. В нем перечислены Алгоритмы обнаружения плагиата в исходном коде.

Примечание. То, о чем вы просили, действительно является сложной вычислительной задачей:)

Ответ 3

Может быть Копировать-пастовый детектор из PMD?

Ответ 4

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

Ответ 5

Я начинаю использовать JPLAG (https://github.com/jplag/jplag), чтобы проверить сходство кода и сравнить учащиеся в Java и текстовых файлах. Он хорошо работает, чтобы проверить ту же структуру кода и переменную Substitution.

Ответ 6

(ответ запаздывает, но актуальность вопроса никогда не исчезает)

Я столкнулся с подобной проблемой и написал веб-приложение.

https://jefferey-cave.gitlab.io/miss/

Я преподавал на javascript и python, так что это те языки, которые он обрабатывает. Он не обрабатывает C/C++ (в настоящее время). Мне было бы любопытно посмотреть, как интерпретатор Javascript обрабатывает C.

доступно на gitlab


Проблема, с которой я столкнулся, заключалась в том, что нелегально передавать код студента через международные границы (MOSS был запрещен), поэтому требовалось что-то, что будет работать локально. Реализация - чистый клиентский браузер.

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

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

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

Ничего не случилось, и эти ученики никогда не приближались.