17

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

我们现在有一个非常琐碎的系统,它有大量的误报,而真正的正则很容易被埋没。

我的要求是:

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

4

6 回答 6

18

我过去使用过 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

于 2012-06-06T10:43:07.697 回答
6

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

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

于 2012-06-06T10:37:45.493 回答
3

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

于 2012-06-06T10:33:56.453 回答
2

我开始使用 JPLAG ( https://github.com/jplag/jplag ) 来检查代码相似性并比较学生在 Java 和文本文件中的作品。它可以很好地检查相同的代码结构和变量替换。

于 2017-03-24T07:41:16.150 回答
1

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

于 2012-06-06T11:03:46.493 回答
1

(回复迟了,但问题的相关性永远不会消失)

我遇到了类似的问题并编写了一个基于 Web 的应用程序。

https://jefferey-cave.gitlab.io/miss/

我在教 javascript 和 python,所以这些是它处理的语言。它不处理 C/C++(当前)。我很想知道 Javascript 解释器如何处理 C。

在 gitlab 上可用


我面临的问题是跨国际边界提交学生代码是非法的(禁止使用 MOSS),因此需要可以在本地运行的东西。该实现是纯客户端浏览器。

有趣的是,我认为它可能会以独特的方式满足您的“低误报”标准。分配之间总是有一些相似之处,但使用一种独特的技术来识别“开始看起来可疑”的点。

我发现它在确定课堂中的团队动态(谁与谁一起工作/学习)时更有用。

它有一些有趣的实时图形,因此在本科生提交第一份作业后展示给他们很有用。第一个作业总是有高度的相似性,所以现场演示它没有坏处(提交名称匿名)。

我总是讲述我认为(严重和公然)作弊的学生的故事。他们的工作与另一个学生非常独特的答案非常相似。将该学生的作业与班上其他人进行比较,结果表明与班上其他人没有显着的相似性。它远低于“有趣”的门槛。这导致了对提交的更深入的调查......原来有一个教程,风格表现出来,但工作是独一无二的。

什么都没有发生,那些学生从来不知道他们离他们有多近。

于 2019-07-26T11:26:48.970 回答