类似的代码检测器

我正在寻找一种可以比较相似源代码的工具。

我们现在有一个非常微不足道的系统,它有大量的误报,真正的积极因素很容易被埋没在其中。

我的要求是:

  • 相当少量的误报
  • 良好的检测率(是的,这些是相互对立的)
  • 理想情况下,输出比单个值更复杂
  • 可用于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

您在计算机科学术语中的问题可能被称为源代码抄袭检测。 一个好的开始是阅读关于Dobbs博士的文章: 检测源代码抄袭 。 它列出了在源代码中检测抄袭的算法。

注意:您所要求的确实是一个棘手的计算问题:)

可能是PMD的复制粘贴检测器?

你可以试试duplo 。 它会找到共同的线条。 它有一些忽略空白变化的能力,但不会检测具有重命名变量的代码,因此在检测抄袭时它更像是一种清理辅助而不是帮助。

我开始使用JPLAG( https://github.com/jplag/jplag )检查代码相似性,并比较学生使用Java和文本文件。 它适用于检查相同的代码结构和变量替换。