我正在寻找一种可以比较相似源代码的工具。
我们现在有一个非常微不足道的系统,它有大量的误报,真正的积极因素很容易被埋没在其中。
我的要求是:
编辑:
为避免混淆,以下两个代码段是相同的,应按原样检测:
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;
答案 0 :(得分:16)
我过去曾使用过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
答案 1 :(得分:6)
您在计算机科学术语中的问题可能被称为源代码抄袭检测。一个好的开始是阅读Dobbs博士的这篇文章:Detecting Source-Code Plagiarism。它列出了源代码中用于检测抄袭的算法。
注意:您所要求的确实是一个棘手的计算问题:)
答案 2 :(得分:3)
可以是PMD的复制粘贴检测器吗?
答案 3 :(得分:1)
您可以尝试duplo。它会找到共同的线条。它有一些忽略空白变化的能力,但是没有用重命名的变量来检测代码,所以它更像是一种清理帮助,而不是检测抄袭时的帮助。
答案 4 :(得分:1)
我开始使用JPLAG(https://github.com/jplag/jplag)来检查代码相似性,并比较学生使用Java和文本文件。 它可以很好地检查相同的代码结构和变量替换。
答案 5 :(得分:0)
(响应迟到了,但问题的相关性从未消失)
我遇到了类似的问题,并编写了一个基于Web的应用程序。
https://jefferey-cave.gitlab.io/miss/
我当时使用javascript和python进行教学,因此这些语言可以处理。 (当前)它不处理C / C ++。我很想知道Javascript解释器如何处理C。
我面临的问题是跨国际边界提交学生代码是非法的(禁止使用MOSS),因此需要可以在本地运行的代码。该实现是纯客户端浏览器。
我发现它对于确定教室中的小组动态(谁在与谁一起学习/与谁一起学习)更有用。
它具有一些有趣的实时图形,因此在他们提交首次作业后向Undergrad班级展示非常有用。第一次作业始终具有高度的相似性,因此在现场展示它(对提交的名称进行匿名化)时没有任何害处。
我总是讲一个我以为(粗俗地)作弊的学生的故事。他们的作品与另一个学生的独特答案有着惊人的相似之处。将学生的作品与班级其余成员进行比较,发现与班级其余部分相比无显着相似性。这导致对提交的内容进行了更深入的调查。。。事实证明,这里有一个教程,其风格得以体现,但这项工作是独一无二的。
什么也没发生,那些学生从来没有接近他们。