我有几个简单的 C++ 作业,我知道学生共享代码。这些都是聪明的学生,他们知道如何欺骗苔藓。我正在寻找一种可以根据变量的类型重命名变量的工具(第一个 int 类型的变量将是 int1,第一个 int 数组将是 intptr1 ...),或者做一些我现在想不到的类似事情。你知道一个快速的方法来做到这一点吗?
编辑:我需要使用 moss 并报告 90% 匹配
谢谢
我有几个简单的 C++ 作业,我知道学生共享代码。这些都是聪明的学生,他们知道如何欺骗苔藓。我正在寻找一种可以根据变量的类型重命名变量的工具(第一个 int 类型的变量将是 int1,第一个 int 数组将是 intptr1 ...),或者做一些我现在想不到的类似事情。你知道一个快速的方法来做到这一点吗?
编辑:我需要使用 moss 并报告 90% 匹配
谢谢
是的,您正在寻找的工具称为编译器。:)
严重的是,如果提交的程序除了标识符名称之外完全相同,那么编译(没有调试信息)应该会产生完全相同的输出。
如果您在调试打开的情况下执行此操作,编译器可能会将元数据留在每个可执行文件不同的可执行文件中,因此有关确保它关闭的注释。这也是为什么这对 Java 程序不起作用的原因——无论是否处于调试模式(出于动态自省的目的),这种信息都存在。
编辑:我从添加到问题的评论中看到,您正在观察一些提交的内容,这些提交内容的不同不仅仅是标识符名称。如果程序在结构上仍然是等效的,这应该仍然有效。
编辑:鉴于使用苔藓是一项要求,这可能不是要走的路。我似乎确实 moss 对比较汇编有一些支持——也许编译到汇编器并将其提交给 moss 是一种选择(取决于您使用的编译器)。
您可以下载并试用我们的C CloneDR重复代码检测器。即使变量名已更改,它也会找到重复的代码。同一块中的多个更改被视为一个;如果他们在所有地方一致地重命名变量,您将得到一份带有精确变量替换的“一个克隆”的报告。
您可以尝试打开复制粘贴检测器。ignoreIdentifiers
您至少可以将它用于第一次通过,然后再进行 moss 名称的规范化。或者,既然源是可用的,也许你可以让它吐出它的内部规范化代码。
另一种方法是编译应用程序并比较它们的二进制文件,因此您的检查不仅限于更改变量/函数名称。
十六进制编辑器可以帮助您。我刚刚尝试了 ExamDiff(不是免费的 $),我对结果很满意。