我搜索工具,可以比较源代码的相似性。
我们有一个非常平凡的系统现在有误报的巨量和真实阳性可以很容易地埋在其中。
我的要求是:
- 误报的合理少量
- 良好的检测率(是的,这些都是违背对方)
- 理想的不仅仅是单个值更复杂的输出
- 可用于C(C99)和C ++(C ++ 03和最佳C ++ 11)
- 仍保持
- 可用于比较两个源文件彼此抵靠
- 在非交互式模式可用
编辑:
为了避免混淆,以下两个代码段是相同的,应该这样来检测:
for (int i = 0; i < 10; i++) { bla; }
int i; while (i < 10) { bla; i++; }
和这里一样:
int x = 10; y = x + 5;
int a = 10; y = a + 5;
我用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
您在计算机科学术语的问题也许表述为源代码抄袭检测。 一个良好的开端是读这篇文章多布斯医生: 检测源代码抄袭 。 它列出了在源代码中检测剽窃的算法。
注意:你问什么确实是一个艰难的计算问题:)
你可以尝试杜普洛 。 它会找到共同线。 它忽略空白的变化一定的能力,但不检测与重命名变量的代码,所以它更是一个清理援助不是检测抄袭的时候帮助。
我开始使用JPLAG( https://github.com/jplag/jplag )来检查代码相似性,并比较学生工作在Java和文本文件。 它的工作原理以及检查相同的代码结构和变量替换。