变量重命名用于C/ c++的抄袭检测

Variable renaming for plagiarism detection for C/C++

本文关键字:检测 c++ 重命名 用于 变量      更新时间:2023-10-16

我有几个简单的c++作业,我知道学生们共享代码。这些都是聪明的学生,他们知道如何欺骗苔藓。我正在寻找一种工具,可以根据变量的类型(int类型的第一个变量将是int1,第一个int数组将是intptr1…)重命名变量,或者做一些类似的事情,我现在想不起来。你知道一个快速的方法吗?

edit:我被要求使用苔藓并报告90%匹配

谢谢

是的,你正在寻找的工具被称为编译器。:)

说真的,如果提交的程序除了标识符名称外完全相同,编译它们(不包含调试信息的)应该会导致完全相同的输出。

如果您在打开调试的情况下这样做,编译器可能会在每个可执行文件中留下不同的元数据,因此关于确保它是关闭的注释。这也是为什么这在Java程序中不起作用的原因——无论是否在调试模式下(为了动态自省的目的),这种信息都是存在的。

EDIT:我从添加到问题的评论中看到,您正在观察一些提交的不同之处,而不仅仅是标识符名称。如果程序在结构上仍然是等价的,这应该仍然有效。

EDIT:考虑到使用苔藓是必需的,这可能不是要走的路。虽然moss似乎有一些比较汇编的支持-也许编译到汇编器并提交给moss是一个选项(取决于您使用的编译器)。

您可以下载并尝试我们的C CloneDR重复代码检测器。即使变量名已经改变,它也能发现重复的代码。同一块中的多个更改只被视为一个;如果他们在所有地方一致地重命名变量,您将得到一个"一个克隆"的报告,其中包含精确的变量替换。

您可以在打开ignoreIdentifiers的情况下尝试复制粘贴检测器。在开始规范化苔藓的名称之前,您至少可以第一次使用它。或者,由于源代码是可用的,也许您可以让它吐出代码的内部规范化。

另一种方法是编译应用程序并比较它们的二进制文件,这样您的检查就不局限于变量/函数名称的更改。

HEX编辑器可以帮助您。我刚刚尝试了ExamDiff(不是free $),我对结果很满意。