3

我一直在研究基于 MOSS(软件相似度测量)背后的学术论文的抄袭检测引擎的实现

链接到MOSS

为了为 C/C++/Java 等语言设计噪声过滤器,我需要做出一些决定。

关键字是否与检测剽窃相关或应该被删除?相同语言的源文件必须共享相同的关键字集。论文没有讨论如何处理它们。

如何处理标识符?用单个字符“V”替换所有关键字,使匹配独立于变量名是有意义的。

如何处理包导入和库包含?

空格、注释和标点符号一定要去掉。

我想知道在完成所有操作后,源文件将只是一堆“V”和其他一些乱码。

噪声滤波器应该执行哪些操作?

关于处理噪音的最佳方法的见解和意见?

4

2 回答 2

1

对于单个函数:编译它们,并比较生成的汇编代码或对象。对于整个程序:对所有函数执行上述操作并创建模糊搜索以在已知函数和片段的数据库中找到片段。

因此,基本上,您需要构建一个编译器,它会发出其输入的规范化表示,类似于 P 代码,但最好是人类可读的。

有些片段比其他片段更有特征,片段

for (i=0; i < 12345; i++) {
  array[i] = 54321;
  }

可能会以某种形式出现在每个程序中。它与 100% 功能相同

j=0;
while ( j < 12345) {
  foobar[j++] = 54321;
  }

,并且编译器可能会产生相同的代码。

变量名、数字常量、地址常量等等都可能存在差异。但是关键字的“骨架”(-> {比较、循环、表达式、赋值、函数调用})将是相同的。所以:不要丢弃关键字,它们是程序的脚手架。

于 2011-12-17T13:37:53.257 回答
0

如果您搜索“文本指纹瓦”,可以在 Google 上找到很多内容。shingle 是一个 x 字(在许多研究项目中 x=7)。您逐字构建一组所有带状疱疹。

您在带状疱疹上构建哈希,然后比较文本中的 1000 个带状疱疹。这很简单。有一些东西,比如你肯定在这个上下文之外没有听说过的特殊哈希函数等。

例如,从阅读开始,这不是真正的火箭科学,但也不是微不足道的。

“以有效方式检测文本来源”Besnik Fetahu,Andreas Frische http://resources.mpi-inf.mpg.de/d5/teaching/ws10_11/hir/reports/BesnikFetahu.pdf

“重复文件的算法”,Andrei Broder http://www.cs.princeton.edu/courses/archive/spr05/cos598E/bib/Princeton.pdf

于 2015-11-03T20:50:28.693 回答