类似的代码检测器
Similar code detector
我正在寻找一个可以比较源代码相似性的工具。
我们现在有一个非常微不足道的系统,它有大量的误报,真正的阳性很容易被埋没在其中。
我的要求是:
- 合理少量的误报
- 良好的检测率(是的,这些是相互对抗的)
- 理想情况下,输出比单个值更复杂
- 可用于 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://web.archive.org/web/20150219121637/http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html
您在计算机科学术语中的问题可能表示为源代码抄袭检测。一个好的开始是阅读这篇关于多布斯博士的文章:检测源代码抄袭。它列出了用于检测源代码中抄袭的算法。
注意:您所要求的确实是一个棘手的计算问题:)
可能是来自PMD的复制粘贴检测器?
我开始使用JPLAG(https://github.com/jplag/jplag)来检查代码相似性,并比较学生在Java和文本文件中的工作。检查相同的代码结构和变量替换效果很好。
试试duplo。它将找到共同的行。它具有忽略空格更改的某些功能,但不会检测具有重命名变量的代码,因此在检测抄袭时,它更像是一种清理辅助而不是帮助。
(回答很晚,但问题的相关性永远不会消失)
我遇到了类似的问题,并编写了一个基于Web的应用程序。
https://jefferey-cave.gitlab.io/miss/
我用javascript和python教学,所以这些是它处理的语言。它不处理 C/C++(当前)。我很想知道Javascript解释器如何处理C。
在 GitHub 上可用
<小时 />我面临的问题是跨国际边界提交学生代码是非法的(MOSS 是被禁止的),因此需要在本地运行的东西。实现是纯客户端浏览器。
有趣的是,我认为它可能以一种独特的方式满足您的"低误报"标准。作业之间总是有一些相似之处,但使用独特的技术来识别事物"开始看起来可疑"的点。
我发现它在确定课堂上的群体动态(谁在与谁一起工作/学习)方面更有用。
它有一些有趣的实时图形,因此在本科生提交第一份作业后向他们展示很有用。在第一次作业中总是有高度的相似性,所以现场展示它没有坏处(提交名称是匿名的)。
我总是讲述我认为(严重而公然)作弊的学生的故事。他们的工作与另一个学生非常独特的答案非常相似。将学生的作业与班上其他同学进行比较,显示与班上其他同学没有显着相似之处。它远低于"有趣"的门槛。这导致了对提交的更深入的调查......原来有一个教程,风格表现出来,但工作是独一无二的。
什么也没发生,那些学生也不知道他们离得有多近。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 类似的代码检测器