我正在寻找一个工具,寻找复制代码,因为复制和粘贴编程要运行在一个大型Ada代码库。我认为该工具中的Ada支持对于检测比忽略布局或标识符差异等琐碎的文本相似性更重要。
我在Ada支持下找到的工具如下:
你试过这些工具吗?我错过了其他感兴趣的吗?语言支持真的很重要吗?还是一个通用的文本工具就足够了?您对代码重复检测有什么经验?
提前谢谢。
发布于 2012-02-28 23:52:56
我是CloneDR的作者。阅读下面的理解我的偏见。
因此,了解克隆检测工具检测方法的差异以及检测结果的质量是非常重要的。
ConQAT是所谓的“基于令牌的”检测器的代表。它们匹配语言标记序列(运算符、标识符、括号、关键字等)。好消息是它们非常快(这不是什么大问题;你不会每30秒运行一次克隆检测,一周一次就足够了)。他们会发现一些克隆几乎没有找到,也就是说,另一个标识符或常量被替换为克隆中的标识符。坏消息是,他们不理解代码的结构,因此想报告如下
} void ID ( ID
作为克隆人。这是通过让检测器只搜索非常长的令牌序列(通常为30或更多)而失败的,这意味着基于令牌的检测器无法找到小而有趣的克隆,同时也会淹没在上面这样的假阳性中。
CloneDR的工作方式是解析代码(即使是Ada),就像编译器一样,构建抽象语法树,并将树匹配到一个差异点。它不能以愚蠢的方式提出一个跨越结构边界的克隆。它将发现与基于令牌的探测器几乎相同的错误,但它超出了这一范围。CloneDR将发现一致的替换(“反统一符”),这意味着克隆可以用克隆中许多地方使用的少量参数来解释,并且它会在代码中发现不匹配大于单个标记的变化,例如表达式、语句、声明、偶数块。因此,它产生较少的假阳性和更好的答案。比较克隆探测器类型的独立研究报告,特别是包括CloneDR在内,同意这一分析。。
在上面列出的克隆博士链接中有更详细的讨论。您可以看到许多语言检测到的克隆的例子(但是我们在网站上没有Ada报告)。
2012年3月19日编辑:
现在你可以下载Ada95 CloneDR的eval副本了。
发布于 2012-02-29 09:00:12
艾拉·巴克斯特描述得很好。
基于令牌的克隆检测工具对于我们的目的来说往往是足够好的,这通常是为了快速了解代码复制在我们以前从未见过的源代码中有多么糟糕,以及复制是如何在代码中分布的。
特别是,我们对CCFinderX很满意,因为它有一个很好的可视化前端。然而,它是错误的,没有维护,代码已经发布,但没有任何许可声明。
它为某些语言提供了特定于语言的预处理程序,但是我们通常只是禁用它们(它们也是错误的)。
如果您需要更好的准确性,那么您完全了解您需要解析的语言(例如,使用C或C++,情况并不总是如此),而且您可以找到一个完全解析该语言的工具(这也是C和C++的问题),基于解析的方法可能更好,正如Ira所写的那样。
https://stackoverflow.com/questions/9489510
复制相似问题