是否有确定代码相似性的工具?[关闭]


37

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


5
这是上课还是什么?
TheLQ 2010年

1
@TheLQ-在课堂设置之外,我想到了不止一种情况,我去寻找“剪切和粘贴在重复使用,对吧?”。大队经历了。
MIA 2010年

别忘了史蒂夫·史密斯(Steve Smith)的《阿托米克(Atomiq)》
Jim G.

注释和输出消息(例如错误等)通常可以比实际代码更好地指纹代码。
Bork Blatt

他们一直在Uni威胁我们,这很有趣,看看这种工具是否确实存在。
杰克

Answers:


10

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

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


谢谢,我一直在找这样的东西:)
Ulrich Dangel 2013年

8

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


是的-我们在代码中使用了来自PMD的CPD
JoseK 2010年

但是PMD仅适用于Java,对吗?
Janusz Lenar

5

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

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


4

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

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


(感谢您对我的工具的称赞)。SmartDifferencer查找特定文件对之间的差异。相似性是差异的补充,因此,我同意这是一个正确的主意,但这需要您标识一对文件才能提供,如果您的系统包含许多文件,这将很痛苦。真正需要的是补充:找到相似点,并且无需亲自识别文件对即可完成。有关此类工具,请参见同一线程中的CloneDR答案。是的,它使用了相关技术。
伊拉·巴克斯特

1

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

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


如果是这样,SCO可能会击败IBM :-)

1

关于该主题的Wikipedia上的这篇文章还包括指向一些可用于查找相似或重复代码的工具的链接。我们为此有一个内部工具,因此我对本文提到的外部工具不熟悉。


1

您真正想要做的是查看是否在两个项目(两个项目都可能包含大量文件)中克隆(复制)了代码。您可以通过运行克隆检测工具来执行此操作。 维基百科列出了各种各样的内容。

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

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

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

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

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


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.