Переименование переменной для обнаружения плагиата для C/C++
У меня есть пара простых домашних заданий на C++, и я знаю, что студенты делятся кодом. Это умные студенты, и они знают, как обмануть мох. Я ищу инструмент, который может переименовывать переменные на основе их типов (первая переменная типа int будет int1, первый массив int будет intptr1...), или делает что-то подобное, о чем я не могу думать сейчас. Знаете ли вы быстрый способ сделать это?
редактировать: я должен использовать мох и сообщать о 90% совпадении
Спасибо
4 ответа
Да, инструмент, который вы ищете, называется компилятором.:)
Серьезно, если представленные программы точно такие же, за исключением имен идентификаторов, то компиляция (без отладочной информации) должна привести к точно таким же выводам.
Если вы сделаете это с включенной отладкой, компилятор может оставить метаданные в исполняемом файле, которые отличаются для каждого исполняемого файла, следовательно, комментарий о том, что он отключен. Вот почему это не работает для программ Java - такая информация присутствует в режиме отладки или нет (для целей динамического самоанализа).
РЕДАКТИРОВАТЬ: я вижу из комментариев, добавленных к вопросу, что вы наблюдаете некоторые представления, которые отличаются не только именами идентификаторов. Если программы все еще структурно эквивалентны, это все равно должно работать.
РЕДАКТИРОВАТЬ: Учитывая, что использование мха является требованием, это, вероятно, не путь. Мне кажется, однако, что у мха есть некоторая поддержка для сравнения ассемблера - возможно, компиляция в ассемблер и передача этого в мох - вариант (в зависимости от того, какой компилятор вы используете).
Вы можете скачать и попробовать наш детектор дубликатов кода C CloneDR. Он находит дублированный код, даже когда имена переменных были изменены. Многократные изменения в одном и том же чанке рассматриваются как одно; если они повсеместно переименовывают переменные, вы получите отчет "один клон" с точной переменной подстановкой.
Вы можете попробовать Copy Paste Detector с ignoreIdentifiers
включенный. Вы можете по крайней мере использовать его для первого прохода, прежде чем приступить к нормализации имен для мха. Или, поскольку исходный код доступен, возможно, вы можете заставить его выплюнуть внутреннюю нормализацию кода.
Еще один способ сделать это - скомпилировать приложения и сравнить их двоичные файлы, чтобы ваш экзамен не ограничивался изменением имени переменной / функции.
В этом вам может помочь редактор HEX. Я только что попробовал ExamDiff (не бесплатно $), и я был доволен результатом.