Как запутать C++ переменные и функции

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

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

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

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

2 ответа

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

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

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

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

Другие вопросы по тегам