我不是在谈论差异工具。我真的在寻找一个项目是否包含可能已从另一个项目“重构”的代码。函数名称,变量名称和其他内容可能会更改。条件可以颠倒,等等。
我不是在谈论差异工具。我真的在寻找一个项目是否包含可能已从另一个项目“重构”的代码。函数名称,变量名称和其他内容可能会更改。条件可以颠倒,等等。
Answers:
当我教授软件工程时,我在斯坦福大学使用了称为MOSS(软件相似性度量)的(免费)服务。 这使我很容易发现学生项目之间的窃。该系统还允许我输入在课堂上使用的“已知良好”代码示例,这些示例将被忽略。
关于返回结果的最重要的事情(完全是附带问题)是,我们可以确定哪些学生在一起工作-即使他们没有公然复制代码,他们也充分讨论了问题,以至于他们的代码相似。可悲的是找到了一个陌生的学生,没有其他任何代码可比。他们通常做得不好。
您也许可以使用PMD工具查找所需的内容。它旨在检测代码库中的剪切和粘贴,但是如果您包括可疑的原始项目源,则可能会帮助您查看从中复制代码的位置。
听起来好像您想计算两个抽象语法树(AST)之间的差异,所以您可能对Smart Differencer工具感兴趣。
在https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff上找到。
您真正想要做的是查看是否在两个项目(两个项目都可能包含大量文件)中克隆(复制)了代码。您可以通过运行克隆检测工具来执行此操作。 维基百科列出了各种各样的内容。
要大致确定是否有大量复制,您只需要匹配源代码行,并且那里有各种确切的源代码行克隆检测器。我相信PMD是其中之一。这些将不会做的是找到经过复制粘贴编辑的代码。他们会发现样板代码复制粘贴不变的代码可能包裹在复制粘贴编辑的内容周围。
如果要查看复制粘贴编辑代码的复制细节,则需要一个克隆检测器来查找“参数化”克隆。基于令牌的检测器会执行此操作,以便仅替换变量名或常量的编辑。
基于抽象句法树(AST)的检测器可用于涉及较大块的编辑,例如表达式,语句,插入,删除等。后者往往会给出更好的答案,因为与令牌检测器不同,它们可以使用计算机源代码的语言结构作为指南。
我们的CloneDR工具就是这种检测器。
我不知道实际上会找到“等效”代码(逆向条件)等的工具。研究人员已经构建了执行类似操作的克隆检测器,但是组合程序使执行此操作非常昂贵,并且研究原型的伸缩性很差。