2012-02-10 138 views
3

我试图对抄袭做一些算法比较。我发现很多TEXT比较剽窃。如何混淆C++变量和函数

但是在算法中它是非常不同的。假设某些算法使用了大量的变量,函数和用户定义的结构。如果有人从别人那里复制源代码,他至少会改变变量和函数名称。通过简单的文本比较算法,函数和变量字母之间的这种差异将被视为“差异”,从而使算法为抄袭提供“假”。

我想要做的是在C++源代码中“泛化”(我不知道这是否是正确的词)所有变量,函数和用户定义的结构名称。所以这些变量将被命名为“a”,“b”,对于函数“... fa(...)”,“... fb(...)”也是如此。 我有PHP中的字符串变量的C++源码算法进行比较。

我知道应该对许多其他事情进行分析以获得准确的源代码比较,但这对我来说就足够了。

回答

1

这是一个有趣的问题。然而,取决于算法的复杂程度,可能是变量名称会导致剽窃。例如,您可以真正编码树遍历的方法有多少种?

我认为几年前有一篇文章通过他们的风格来识别编码器 - 查看所有的小东西,比如空白,其中放置了{}等。谁知道,但也许这是要走的路,看看对学生以前的风格进行否定匹配,而不是与已知来源的匹配。这样说,学生在学习的早期阶段不可能已经开发出非常个人化的编码风格。

想一想 - 用什么语言写的例子?它可以编译?如果编译C然后对可执行文件进行二进制比较,那么具有不同局部变量名称的相同程序是否具有完全相同的二进制文件? (虽然全球变量和函数不会)。

+0

我也想给在换行符一些额外的重要性, “;”后面的换行符,以及大括号的位置。我知道某些类型的算法很难以某种“不同的方式”制作,例如在一些简单的初始示例中,“2个值的总和”。 但全文比较也是一个问题。 而且由于它在Web主机上运行,​​我无法编译代码。 – IPValverde 2012-02-10 12:01:06

0

我以前用过MOSS:http://theory.stanford.edu/~aiken/moss/来检测剽窃的代码。由于它在语义层面上工作,因此它将检测您在上面显示的情况。该工具是语言感知的,所以在分析中不考虑注释,并且在通过简单的搜索和替换变量和/或函数名称来检测已被修改的代码方面有很长的路要走。

注意:几年前,当我在研究生院教授计算机科学时,我使用了该工具,它在检测从互联网上跳出的代码时非常有效。这是一个证据充分的考虑类似的应用:http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

如果谷歌“测量软件相似性”,你应该多找几个有用的结果:http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html