是否有适用于 C++ 的语义差异工具?

Posted

技术标签:

【中文标题】是否有适用于 C++ 的语义差异工具?【英文标题】:Is there a working Semantic Diff tool for C++? 【发布时间】:2010-11-18 10:08:54 【问题描述】:

我只发现了废弃的项目、理论和功能列表。 但我找不到可以比较两个 C++ 源文件并显示语义差异的工具。

当然,我不会比较两个不相关的文件,或者在 10 年的开发和维护过程中积累的变化。但是,通常在代码审查中讨论的更改会更容易理解,如果与正确的含义一起呈现,而不是在字符/单词/行级别的文本更改

【问题讨论】:

【参考方案1】:

真正的“语义差异”是不可能的。 Closer 将是一个工具,它比较两个源文件,以查看一个是如何通过对程序结构(变量、表达式、语句、方法)进行抽象编辑操作(删除、复制、移动、重命名)从另一个导出的。 请参阅我们的Smart Differencer,了解可以为几种语言执行此操作的工具,C++ 即将推出。

2013 年 3 月:支持 C++11 的 GCC/MS 方言。

【讨论】:

2010 年 3 月:它已经可用了几个月,刚刚回到这个特定的 SO 问题。 2011 年 1 月:Smart Differencer 现在可用于 Java、C#、C++、C、COBOL、javascript、VB.net、Python... 你知道是否有一个clang插件可以做到这一点? 我不知道有一个clang插件可以做到这一点。【参考方案2】:

Linux 内核开发人员使用的 C 语言有一个。但不适用于 C++

http://coccinelle.lip6.fr

【讨论】:

@Brad:他们谈论语义补丁,但似乎他们的意思是“模式匹配”,对文件的多个版本中的空格、变量名等的变化不敏感,但是不清楚他们比较两个文件以确定它们是否相似。你能具体指出他们是在哪里说的吗? 你有 spdiff 工具来推断语义补丁diku.dk/hjemmesider/ansatte/jespera/doc.html【参考方案3】:

一般来说,这是不可能的。一个程序甚至无法判断另一个程序是否会终止(著名的Halting Problem)。对于更有限的程序(有限有界循环,可能还有其他约束),您可以做更多,但它是繁重的东西,并且语言必须是,不是 C++,而是一些不太棘手的东西,一个有限的子集或更简单的语言。这可能就是为什么你发现什么都不是已经开始了。

【讨论】:

【参考方案4】:

是的,它被称为“为提交编写 cmets”和“问题跟踪”。将其视为用于语义分析的元数据。

【讨论】:

但这将是 ISO 8 层信息处理,而不是使用工具 是的。每个版本控制都可以使用 cmets 显示历史记录,但我从未见过它在每次更改的基础上集成到合并工具中。可能会成为一个非常有用的功能……另一方面,可能会与代码中的 cmets 发生冲突。 集成到合并工具中了吗?喜欢 Git? Git 中的合并工具中集成了哪些问题跟踪? Git 既没有与问题跟踪的半体面集成,也没有内置的合并工具,所以我只能猜测它没有集成这两者。 我可能误解了你,但git merge 处理合并就像处理简单提交一样干净简单,具有来自源存储库的完整历史记录和提交。使用良好的提交 cmets(以及使用 --signoff 的审阅者),跟踪特定问题的历史非常容易。与问题/错误跟踪器集成会很好,但添加几个 Perl 脚本应该不难。

以上是关于是否有适用于 C++ 的语义差异工具?的主要内容,如果未能解决你的问题,请参考以下文章

语义版本控制是不是适用于源或二进制兼容性?

C++ 中的值语义技巧

你把你的语义信息挂在哪里,html?

qsort 在 C++ 中不适用于哪些类型?

是否可以在 C++ 中将返回值移动语义与受保护的复制构造函数一起使用?

属性和字段之间的语义差异及其含义