Переименование переменной для обнаружения плагиата для C / C ++ - PullRequest
6 голосов
/ 04 мая 2011

У меня есть пара простых домашних заданий на C ++, и я знаю, что студенты делятся кодом.Это умные студенты, и они знают, как обмануть мох.Я ищу инструмент, который может переименовывать переменные на основе их типов (первая переменная типа int будет int1, первый массив int будет intptr1 ...), или делает что-то подобное, о чем я не могу сейчас думать.Вы знаете быстрый способ сделать это?

edit: Мне нужно использовать мох и сообщать о совпадении 90%

Спасибо

Ответы [ 4 ]

4 голосов
/ 04 мая 2011

Да, инструмент, который вы ищете, называется компилятором. :)

Серьезно, если представленные программы точно такие же , за исключением имен идентификаторов, тогда компиляция ( без отладочной информации) должна привести к точно таким же выводам.

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

РЕДАКТИРОВАТЬ: Я вижу из комментариев, добавленных к вопросу, что вы наблюдаете некоторые представления, которые отличаются не только именами идентификаторов. Если программы по-прежнему структурно эквивалентны, это все равно должно работать.

РЕДАКТИРОВАТЬ: Учитывая, что использование мох является обязательным требованием, это, вероятно, не путь. Мне кажется, однако, что у мха есть некоторая поддержка для сравнения ассемблера - возможно, компиляция в ассемблер и передача этого в мох - вариант (в зависимости от того, какой компилятор вы используете).

3 голосов
/ 04 мая 2011

Можно попробовать Детектор копирования и вставки с включенным ignoreIdentifiers. Вы можете по крайней мере использовать его для первого прохода, прежде чем приступить к нормализации имен для мха. Или, поскольку источник доступен, возможно, вы можете заставить его выплюнуть внутреннюю нормализацию кода.

3 голосов
/ 04 мая 2011

Вы можете скачать и попробовать наш C CloneDR детектор повторяющихся кодов.Он находит дублированный код, даже когда имена переменных были изменены.Многократные изменения в одном и том же чанке рассматриваются как одно;если они повсеместно переименовывают переменные, вы получите отчет «один клон» с точной переменной подстановки.

2 голосов
/ 04 мая 2011

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

В этом вам может помочь редактор HEX. Я только что попробовал ExamDiff (не бесплатно $) и был доволен результатом.

...