我正在寻找一种工具来查找重复代码,因为复制和粘贴编程可以在大型Ada代码库上运行。我认为Ada对该工具的支持对于检测多个琐碎的文本相似性非常重要,即忽略布局或标识符差异等。
我在Ada支持中找到的工具如下:
你试过这些工具吗?我错过了任何其他感兴趣的东西吗?语言支持真的很重要还是一般的文本工具就足够了?您对代码重复检测的体验是什么?
提前致谢。
答案 0 :(得分:3)
我是CloneDR的作者。阅读以下理解我的偏见。
了解克隆检测工具检测方法的差异以及结果的质量非常重要。
ConQAT是所谓“基于令牌”探测器的代表。它们匹配语言标记序列(运算符,标识符,括号,关键字等)。好消息是它们非常快(这不是一个大问题;您不会每30秒运行一次克隆检测,每周一次就足够了)。在另一个标识符或常量替换克隆中的标识符的意义上,他们会发现一些接近未命中的克隆。坏消息是他们不了解您的代码结构,因此想要报告
之类的内容 } void ID ( ID
作为克隆。通过使探测器仅捕获非常长的令牌序列(通常为30或更多)来解决这个问题,这意味着基于令牌的探测器无法找到小而有趣的克隆,而不会像上面那样淹没你的误报。
CloneDR通过解析代码(即使对于Ada)来操作,就像编译器一样,构建抽象语法树,并将树匹配到差异点。它无法提出以愚蠢的方式跨越结构边界的克隆。它会发现与基于令牌的探测器相同类型的近乎未命中,但它超出了这个范围。 CloneDR将找到一致的替换(“反整数”),这意味着克隆可以通过克隆中许多地方使用的少量参数来解释,并且它会发现错误大于a的代码中的变化单个标记,例如表达式,语句,声明,偶数块。因此它产生更少的误报和更好的答案。 Independent research reports that compare types of clone detectors, specifically including CloneDR, agree with this analysis
您在上面列出的克隆医生链接中有更详细的讨论。您可以查看针对多种语言检测到的克隆的示例(但我们在网站上没有Ada报告)。
编辑2012年3月19日:
答案 1 :(得分:0)
Ira Baxter有一个很好的描述。
基于令牌的克隆检测工具往往足以满足我们的目的,这通常是为了快速概述我们以前从未见过的源代码体中代码重复的错误,以及如何分发重复跨过那段代码。
特别是,我们对CCFinderX感到满意,因为它有一个很好的可视化前端。 但是,它有缺陷,没有维护,代码已经发布但没有任何许可声明。
它为某些语言提供了语言特定的预处理器,但我们通常只是禁用它们(它们也有错误)。
如果您需要更高的准确性,您确切地知道需要解析的语言(例如,使用C或C ++,情况并非总是这样),并且您可以找到一种能够完全解析该语言的工具(这也是一个问题)使用C和C ++),基于解析的方法可能会更好,正如艾拉写道。