由于复制粘贴而使用啥工具来查找重复的 Ada 代码
Posted
技术标签:
【中文标题】由于复制粘贴而使用啥工具来查找重复的 Ada 代码【英文标题】:What tool to use for finding duplicated Ada code due to copy&paste由于复制粘贴而使用什么工具来查找重复的 Ada 代码 【发布时间】:2012-02-28 20:49:09 【问题描述】:由于要在大型 Ada 代码库上运行复制和粘贴编程,我正在寻找一种用于查找重复代码的工具。我认为该工具中的 Ada 支持对于检测比琐碎的文本相似性更重要的是,即忽略布局或标识符差异等。
我发现支持 Ada 的工具如下:
-
Clone Doctor,商业产品,支持多种语言,包括 Ada。 http://www.semdesigns.com/Products/Clone/index.html
ConQAT:商业支持的开源产品,包括自 2011 年 9 月起支持 Ada 的 CloneDetection 工具http://conqat.cs.tum.edu/index.php/CloneDetectionTutorial
您尝试过这些工具吗?我是否错过了其他任何感兴趣的内容?语言支持真的很重要还是通用文本工具就足够了?您对代码重复检测有何经验?
提前致谢。
【问题讨论】:
AdaCore 最近做了一些related work 【参考方案1】:我是 CloneDR 的作者。阅读以下内容了解我的偏见。
了解克隆检测工具检测方法的差异以及结果的质量非常重要。
ConQAT 是所谓的“基于令牌”检测器的代表。它们匹配语言标记序列(运算符、标识符、括号、关键字等)。好消息是它们非常快(这不是一个大问题;您不会每 30 秒运行一次克隆检测,每周一次就足够了)。他们会发现一些几乎未命中的克隆,因为另一个标识符或常量被替换为克隆中的标识符。坏消息是他们不了解您的代码结构,因此想要报告诸如
void ID ( ID
作为克隆。这被让检测器只寻找非常长的令牌序列(通常是 30 或更多)来解决这个问题,这意味着基于令牌的检测器无法找到小而有趣的克隆,而不会像上面那样让您陷入误报。
CloneDR 通过解析代码(甚至对于 Ada 而言)就像编译器一样进行操作,构建抽象语法树,并将树匹配到不同点。它不能提出以愚蠢的方式跨越结构边界的克隆。它会发现与基于令牌的检测器相同类型的未遂事件,但它不仅限于此。 CloneDR 将找到一致的替换(“反统一器”),这意味着可以通过在克隆中许多地方使用的少量参数来解释克隆,并且它会发现代码中的不匹配大于单个标记,例如,表达式、语句、声明,甚至块。所以它产生更少的误报和更好的答案。 Independent research reports that compare types of clone detectors, specifically including CloneDR, agree with this analysis.
您在上面列出的克隆医生链接中有更详细的讨论。您可以查看针对多种语言检测到的克隆示例(但我们的网站上没有 Ada 报告)。
2012 年 3 月 19 日编辑:
现在你可以download an eval copy of an Ada95 CloneDR。
【讨论】:
感谢您提供宝贵的信息。我已经向管理层报告了这两种工具,最终的选择不是我的。我还添加了另一个选项,我不知道它是否可行:结合这两个工具为前者添加 Ada 支持:CloneDigger 作为检测器 - clonedigger.sourceforge.net/documentation.html 和 Avatox 作为抽象语法树生成器 - mckae.com/avatox.html 如果有人对此选项有一些见解,请发表评论。谢谢。 @Gneuromante:Ada XML AST 输出可能适用于 CloneDigger。我不认为(Avatox)ASIS 输出是 AST,尽管您可以从中提取类似 AST 的东西,形成 CloneDigger 想要的形式。所以这个选项实际上是一个你想要做多少工作来获得检测答案的问题。在 CloneDigger 的另一个方面,据我所知,它不计算 克隆集,而是计算 克隆对。这对 90% 的克隆(成对出现)无关紧要,但是当您克隆代码的 N 个实例时,您会得到 O(N^2) 个克隆对而不是一个克隆集。【参考方案2】:Ira Baxter 的描述很好。
基于令牌的克隆检测工具往往足以满足我们的目的,这通常是为了快速了解代码重复在我们以前从未见过的源代码中的严重程度,以及重复是如何分布的跨越该代码。
特别是,我们对CCFinderX 很满意,因为它有一个很好的可视化前端。 然而,它有缺陷,无人维护,而且代码已经发布,但没有任何许可声明。
它具有针对某些语言的语言特定预处理器,但我们通常只是禁用它们(它们也有问题)。
如果您需要更高的准确性,您确切地知道您需要解析的语言(例如,使用 C 或 C++,情况并非总是如此),并且您可以找到一个工具来准确解析该语言(这也是一个问题使用 C 和 C++),正如 Ira 所写,基于解析的方法可能会更好。
【讨论】:
以上是关于由于复制粘贴而使用啥工具来查找重复的 Ada 代码的主要内容,如果未能解决你的问题,请参考以下文章