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

时间:2011-05-03 22:42:45

标签: c++ refactoring plagiarism-detection

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

编辑:我需要使用moss并报告90%匹配

由于

4 个答案:

答案 0 :(得分:4)

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

说真的,如果提交的程序完全相同,除了标识符名称,那么编译(没有调试信息)应该会产生完全相同的输出。

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

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

编辑:鉴于需要使用moss,这可能不是可行的方法。我确实看起来苔藓有一些支持比较汇编 - 可能编译汇编程序并将其提交到moss是一个选项(取决于你正在使用的编译器)。

答案 1 :(得分:3)

您可以下载并试用我们的C CloneDR重复代码检测器。即使变量名已被更改,它也会找到重复的代码。同一块中的多个更改仅被视为一个;如果他们在任何地方都一致地重新命名变量,你就会得到一个带有精确变量替换的“一个克隆”的报告。

答案 2 :(得分:3)

您可以在ignoreIdentifiers开启时尝试Copy Paste Detector。你可以至少使用它作为第一遍,然后才能为苔藓的名称标准化。或者,由于源是可用的,也许你可以让它吐出代码的内部规范化。

答案 3 :(得分:2)

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

HEX编辑器可以帮助您。我刚试过ExamDiff(不是免费的$),我对结果感到满意。