it-swarm.cn

是否有确定代码相似性的工具?

我不是在谈论差异工具。我真的在寻找一个项目是否包含可能已从另一个项目“重构”的代码。函数名称,变量名称和其他内容可能会更改。条件可以颠倒,等等。

37
siljoy

在我教授软件工程时,我在 斯坦福大学MOSS(软件相似性的衡量标准)。 =上使用了(免费)服务。] ==这使我能够发现学生项目之间的窃该系统还允许我输入在上课时使用的“已知良好”代码示例,这些示例将被忽略。

关于返回结果的最重要的事情(完全是附带问题)是,我们可以确定哪些学生在一起工作-即使他们没有公然复制代码,他们也充分讨论了问题,以至于他们的代码相似。可悲的是,找到了一个陌生的学生,没有其他任何代码可比。他们通常做得不好。

10
Peter K.

您也许可以使用 PMD工具 来查找所需内容。它旨在检测代码库中的剪切和粘贴,但是如果您包含可疑的Origin项目源,则可能会帮助您查看从中复制代码的位置。

8
busyspin

我所知道的与您寻找的最接近的东西是 克隆侦探。 这是一个Visual Studio插件。

Clone Detective是一个Visual Studio集成,它使您可以分析C#项目中的源代码,该源代码在其他地方重复。具有重复项很容易导致不一致,并且通常是代码分解欠佳的指标。

5
epotter

听起来好像您想计算两个抽象语法树(AST)之间的差异,所以您可能对 智能差异工具 感兴趣。

https://stackoverflow.com/questions/974855/Eclipse-abstract-syntax-tree-diff 上找到。

4
Matthew Rodatus

即使您不是在谈论差异工具,您仍然可以至少在某种程度上使用它。例如,如果我看到两段看起来相似的代码,我经常将它们都粘贴到BeyondCompare中,以查看通过重构通用功能来简化代码将进行多少工作。

另一方面,如果您不知道类似的代码在哪里,但是您只是想知道某个地方是否存在任何代码...您在寻找什么?自动检测tool窃的工具?我不确定是否存在这样的事情。

1
Mason Wheeler

这个主题上的 维基百科上的文章 还包含指向多个工具的链接,这些工具可用于查找相似或重复的代码。我们为此提供了一个内部工具,因此我对本文提到的外部工具不熟悉。

1
Alan

我真的很喜欢 CCFinderX 如何形象化相似性,因此您可能也想检查一下。支持相当多的语言,它是免费的,并且易于安装(Python 2.6)。

1
MaR

您真正想做的是查看是否在两个项目(两个项目都可能包含大量文件)中克隆(复制)了代码。您可以通过运行克隆检测工具来做到这一点。 Wikipedia 列出了其中的各种。

要大致确定是否有大量复制,您只需要匹配源代码行,并且那里有各种确切的源代码行克隆检测器。我相信PMD是其中之一。这些将不会做的是找到经过复制粘贴编辑的代码。他们会发现样板代码复制粘贴不变的代码可能包裹在复制粘贴编辑的内容周围。

如果要查看复制粘贴编辑代码的复制细节,则需要一个克隆检测器来查找“参数化”克隆。基于令牌的检测器会执行此操作,以便仅替换变量名或常量的编辑。

基于抽象句法树(AST)的检测器可用于涉及较大块的编辑,例如表达式,语句,插入,删除等。后者往往会给出更好的答案,因为与令牌检测器不同,它们可以使用计算机源代码的语言结构作为指南。

我们的 CloneDR 工具就是这样的检测器。

我不知道实际上会找到“等效”代码(逆向条件)等的工具。研究人员已经构建了可以执行类似操作的克隆检测器,但是组合程序使执行起来非常昂贵,并且研究原型的伸缩性很差。

1
Ira Baxter