相似代码检测器

Posted

技术标签:

【中文标题】相似代码检测器【英文标题】:Similar code detector 【发布时间】:2012-06-10 08:36:28 【问题描述】:

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

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

我的要求是:

相当少量的误报 良好的检测率(是的,这些是相互矛盾的) 理想情况下,输出比单个值更复杂 可用于 C (C99) 和 C++(C++03 和最佳 C++11) 仍然维护 可用于比较两个源文件 可在非交互模式下使用

编辑:

为避免混淆,以下两个代码 sn-ps 是相同的,应该这样检测:

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;

【问题讨论】:

diff 是否满足您的某些需求? @HighPerformanceMark LOL,不,它没有。 它看起来好像你想要一个工具来比较 2 个代码的语义相似性,而不是句法。我怀疑这是一个未解决的问题,SO 将很难为您找到满意的解决方案。我认为,正如所写的那样,您最初的问题会误导很多读者,就像它误导了我一样。我也认为你应该完全重写它,清楚地说明你对什么样的比较感兴趣。 莫斯呢? theory.stanford.edu/~aiken/moss 【参考方案1】:

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

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

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

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

available on gitlab


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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

我过去使用过 MOSS:http://theory.stanford.edu/~aiken/moss/ 来检测抄袭代码。由于它在语义级别上工作,因此它将检测您上面介绍的情况。该工具是语言感知的,因此在分析中不考虑 cmets,并且它在检测通过变量和/或函数名称的简单搜索和替换修改的代码方面大有帮助。

注意:几年前,我在研究生院教授计算机科学时使用了该工具,它在检测从互联网上下载的代码方面表现出色。这是类似应用程序的详细记录:http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

如果您在 Google 上搜索“衡量软件相似性”,您应该会发现一些更有用的结果: http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html

【讨论】:

fie1012.org 的链接似乎不再有效。你能提供一个替代链接吗?【参考方案6】:

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

【讨论】:

以上是关于相似代码检测器的主要内容,如果未能解决你的问题,请参考以下文章

代码相识度检测工具

Linux下如何检测硬盘和内存(源代码)

java学到哪才可以检测两个文本的相似度?

相似数据检测算法汇总

供应链安全——二进制层面的检测技术

基于CNN的人脸相似度检测