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

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

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

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

reasonably small amount of false positives good detection rate (yeah these are going against each other) ideally with a more complex output than just a single value usable for C (C99) and C++ (C++03 and optimally C++11) still maintained usable for comparing two source files against each other usable in non-interactive mode

РЕДАКТИРОВАТЬ:

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

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;

 High Performance Mark06 июн. 2012 г., 12:28
Удовлетворяет ли diff некоторые ваши потребности?
 Mike Kwan06 июн. 2012 г., 12:39
Что насчет Мосса?theory.stanford.edu/~aiken/moss
 Let_Me_Be06 июн. 2012 г., 12:29
@ HighPerformanceMark LOL, нет, это не так.
 High Performance Mark06 июн. 2012 г., 12:36
похоже, что вам нужен инструмент, который сравнивает семантическое сходство двух кодов, а не синтаксический. Я подозреваю, что это нерешенная проблема и что SO будет изо всех сил пытаться найти удовлетворительное решение для вас. Я думаю, что, как написано, ваш оригинальный вопрос введет в заблуждение многих читателей так же, как он ввел меня в заблуждение. Я также думаю, что вам следует переписать его полностью, чтобы четко указать, какие виды сравнения вас интересуют.

Ответы на вопрос(5)

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

Решение Вопроса

Я использовал 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

 31 дек. 2015 г., 14:19
Кажется, ссылка на fie1012.org больше не действительна. Не могли бы вы предоставить альтернативную ссылку?
 31 дек. 2015 г., 22:14
Попробуй это:www3.nd.edu/~kwb/nsf-ufe/1110.pdf

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

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

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

Может быть Copy-paste-детектор отPMD?

Ваш ответ на вопрос