用于识别 C 和 C++ 函数之间逻辑相似性的工具
Posted
技术标签:
【中文标题】用于识别 C 和 C++ 函数之间逻辑相似性的工具【英文标题】:Tool to identify the similarities in logic between a function of C and C++ 【发布时间】:2010-06-26 15:54:01 【问题描述】:在 Linux/Windows 中是否有工具可以让我们确定 C 中特定函数的逻辑是否与 C++ 中特定函数的逻辑相同?
【问题讨论】:
“逻辑”在什么意义上?相同的控制结构? 考虑一下 C 中的 addElement() 使用特定逻辑在链表的开头添加一个元素。因此,该工具应该能够确定/识别 C++ 中的特定函数是否也使用相同的逻辑王将元素添加到链表的开头。 男:所以您正在寻找流程图生成器?在 C 和 C++ 中实现这一点的不同方法呢?请参阅下面 Fred 的回答。 对不起,我无法抗拒:“使用武力 - 阅读代码”。 @Imsasu +1。 :-) 除了阅读代码的简单方法之外,如何对这些函数进行单元测试?使用相同的输入调用它们,并在函数调用后比较结果和后置条件。这似乎比尝试生成显示控制流的图表并比较它们的等效性要简单得多。 【参考方案1】:一般来说,图灵机的等价物是undecidable,所以不是。
【讨论】:
这个问题通常是不可能的并不能证明一个有用的工具(即可以得到简单案例的工具)是不可能的...... 事实上,dmckee 指出,匹配代码的 AST 给出了答案的近似值,至少对于复制和粘贴的代码是这样。【参考方案2】:如果您只是在谈论控制结构、if/else、代码块、swtich/case、while、for 等,并且如果您愿意接受“gettign a good feel for it”,而不是100%准确,那么一张图片可能是一千个字,你可能会看一个代码到流程图程序。
我不会推荐任何东西,因为我不太了解它们(但一直想尝试一下,尤其是往返旅行时。找到免费的东西可能并不容易。一般来说,你会看到像这样的东西...alt text http://www.ezprog.com/wp-content/uploads/flowchart.gif
这就是你的想法吗?对 C 和 C++ 版本都这样做,你可以粗略地感受一下逻辑的相似性。
也许您可以告诉我们更多您在寻找什么?帮助我们帮助你?谢谢。
【讨论】:
比“查看流程图”更复杂的方法是构建程序依赖图(带/不带静态单一赋值)并尝试图匹配。本文使用这个想法来查找代码克隆:Jens Krinke: Identification Similar Code with Program Dependence Graphs。 WCRE 2001: 301-309 好消息是它在一定程度上起作用。坏消息是它不能扩展到真正的大系统。更具可扩展性的方法使用词法标记匹配或 AST 匹配。【参考方案3】:您可以想象一个工具,它在编译器完成初始转换为抽象表示后或经过多次优化后比较 ASTs 的结构。
这可能
-
错过了一些真正的匹配(即产生假阴性)
识别一些虚假匹配(即生成误报)
通过调整,您可以强制第二种情况更常见。我不知道作为vgrep 进程的前端会有多好。
但情况会变得更糟,因为您要求跨语言实现,而这将使其变得更加困难。尽管如此,gcc 对所有事物都使用相同的抽象表示,所以它并没有超出想象。
也就是说,我不知道这样的工具。
【讨论】:
有一个工具可以完全做到这一点。它被称为 CloneDR (semanticdesigns.com/Products/Clone),它比较源代码的 AST 以验证“相似性”。 CloneDR 处理许多语言,包括 C 和 C++ 您几乎不需要跨语言实现; C 通常足够接近以被 C++ 解析器吞下,并且更容易对 C 代码进行细微更改,而不是发明这样的跨语言工具。 @Ira:谢谢……哇!该网站提出了一些非常强烈的主张。有谁知道它在现实生活中的效果如何? 我是作者。我认为它运作良好。你必须形成你自己的意见。您可以下载评估版来执行此操作。 你好像是个物理学家。我可以让您与 FermiLab 的人员联系,他们已经查看了 CloneDR 以将其应用于他们的 C++ 建模代码。我的电子邮件地址可以在我的 SO 图标上找到。【参考方案4】:我认为有这样一个工具,叫做汇编列表。
【讨论】:
以上是关于用于识别 C 和 C++ 函数之间逻辑相似性的工具的主要内容,如果未能解决你的问题,请参考以下文章