9

抱歉,如果这是题外话,但这是您减少本网站上“家庭作业”问题数量的机会:-)

我正在教授一门 C 编程课程,学生们在其中使用 C 中的一个小型数字例程库。今年,来自几组学生的源文件中有大量的代码重复。

(下至同样拼错的printf调试语句。我的意思是,你能有多笨。)

我知道 Git 可以检测到两个源文件何时彼此相似超过某个阈值,但我从来没有管理过它来处理两个不在 Git 存储库中的源文件。

请记住,这些不是特别成熟的学生。他们不太可能会麻烦更改变量/函数名称。

有没有办法可以使用 Git 来检测重要的字面代码重复,也就是抄袭?或者您是否可以为此推荐其他一些工具

4

5 回答 5

3

为什么要使用 git?一个简单但有效的技术是比较所有不同提交之间的差异大小,然后手动检查和比较差异最小的那些。

于 2012-01-21T05:50:33.833 回答
2

Moss是由斯坦福计算机科学教授开发的工具。我认为他们也在那里使用它。这就像源代码的差异。

于 2012-01-21T05:54:46.300 回答
1

您可以使用diff并检查这两个文件是否相似

diff -iEZbwB -U 0 file1.cpp file2.cpp

这些选项告诉diff忽略空格更改并制作git-likediff文件。在两个样本上试一试。

于 2012-01-21T05:52:56.900 回答
1

添加到其他答案中,您可以使用diff- 但我认为答案本身不会有用。你想要的是匹配的行数,减去非空行的数量,为了自动得到它,你需要做一些魔术wc -lgrep计算文件长度的总和,减去长度diff 文件的数量,减去diff匹配的空白行数。即便如此,您也会错过一些情况,diff即由于在它们之前插入了不同的东西而导致相同的行不匹配。

更好的选择是https://stackoverflow.com/questions/5294447/how-can-i-find-source-code-copying(或https://stackoverflow.com/questions/4131900 /how-to-detect-plagiarized-code,尽管答案似乎重复)。

于 2012-01-21T05:59:12.320 回答
1

除非您想冒险进入组合地狱领域,否则使用 diff 绝对不是一个好主意:

  • 如果你有 2 个提交,你必须执行 1 diff 来检查抄袭,
  • 如果你有 3 个提交,你必须执行 2 diff 来检查抄袭,
  • 如果你有 4 个提交,你必须执行 6 个 diff 来检查抄袭,
  • ...
  • 如果您有 n 个提交,则必须执行(n-1)!diff !

另一方面,已经在另一个答案中提出的Moss使用了完全不同的算法。基本上,它为每个文档的重要 k-gram 计算一组指纹。指纹实际上是用于对文档进行分类的哈希,当两个文档最终在同一个桶中排序时,就会检测到可能的抄袭。

于 2015-12-30T12:37:58.200 回答