Как запутать переменные и функции C ++ - PullRequest
3 голосов
/ 10 февраля 2012

Я пытаюсь сделать сравнение некоторых алгоритмов для плагиата.Я нашел много текстовых сравнений на плагиат.

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

Что я хочу сделать, это «обобщить» (Я не знаю, правильное ли это слово) имена всех переменных, функций и пользовательских структур в исходном коде C ++.Таким образом, переменные будут именоваться как «a», «b», то же самое для функций «... fa (...)», «... fb (...)».У меня есть исходные алгоритмы c ++ в строковых переменных в PHP для сравнения.

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

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Это интересный вопрос.Однако, в зависимости от того, насколько сложен алгоритм, имена переменных могут быть причиной плагиата.Сколько способов вы действительно можете кодировать, например, обход дерева?

Я думаю, что несколько лет назад была статья по идентификации кодировщиков по их стилю - рассматривая все мелочи, такие как пробел, где {}s размещены и т. д. Кто знает, но, может быть, таков путь, ищите отрицательное совпадение с предыдущим стилем ученика, а не положительное совпадение с известными источниками.Сказав это, ученики вряд ли разработали очень личный стиль кодирования на ранней стадии обучения.

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

0 голосов
/ 06 июня 2012

В прошлом я использовал 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

...