Подобный детектор кода
Я ищу инструмент, который мог бы сравнивать исходные коды для сходства.
У нас сейчас очень тривиальная система, которая имеет огромное количество ложных срабатываний, и реальные положительные результаты могут быть легко зарыты в них.
Мои требования:
- достаточно небольшое количество ложных срабатываний
- хорошая скорость обнаружения (да, они идут друг против друга)
- идеально с более сложным результатом, чем просто одно значение
- для 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 был запрещен), поэтому требовалось что-то, что будет работать локально. Реализация - чистый клиентский браузер.
Я нашел это более полезным при определении групповой динамики в классе (кто с кем работает/учится).
У него есть забавная живая графика, поэтому его было полезно показать классу старшекурсников после того, как они отправили свое первое задание. В первом задании всегда была высокая степень сходства, поэтому не мешало демонстрировать его вживую (с анонимными именами представлений).
Я всегда рассказываю историю ученика, которого я считал (грубо и нагло) обманом. Их работа показала удивительное сходство с другим учеником очень уникальный ответ. Сравнение студенческой работы с остальной частью класса не показало значительного сходства относительно остальной части класса. Это привело к более глубокому расследованию представления... оказалось, что было учебное пособие, и стиль показывал, но работа была уникальной.
Ничего не случилось, и эти ученики никогда не приближались.