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

12

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

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

4个回答

3
一个真正的“语义差异”是不可能的。更接近的工具将比较两个源文件,看一个如何通过抽象编辑操作(删除、复制、移动、重命名)对程序结构(变量、表达式、语句、方法)进行编辑来从另一个派生出来。 请参见我们的Smart Differencer 工具,它可以为几种语言执行此操作,C++即将推出。 2013年3月:支持C++11的GCC / MS方言。

2010年3月:它已经可用了几个月,刚回到这个特定的SO问题。 - Ira Baxter
1
2011年1月:Smart Differencer现在可用于Java、C#、C++、C、COBOL、JavaScript、VB.net、Python等编程语言。 - Ira Baxter
你知道是否有一个用于此的Clang插件吗? - gnzlbg
我不知道有一个用于此的clang插件。 - Ira Baxter

2

@Brad:他们谈论语义补丁,但似乎他们所说的是“模式匹配”,这些匹配对文件的多个版本中的空格、变量名等变化不敏感,但并不清楚他们是否比较两个文件以确定它们是否相似。你能具体指出他们在哪里说了吗? - Ira Baxter
你可以使用spdiff工具来推断语义补丁 http://www.diku.dk/hjemmesider/ansatte/jespera/doc.html。 - LB40

-2

一般情况下是不可能的。一个程序甚至无法判断另一个程序是否会终止(著名的停机问题)。对于更有限制的程序(有限循环等),你可以做更多的事情,但这是重量级的东西,语言必须是不那么棘手的东西,是一个有限的子集或者一个更简单的语言。这可能就是为什么你找不到已经开始的东西的原因。


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

但那将是ISO第8层信息处理,而不是使用工具。 - CsTamas
真的。每个版本控制都可以显示带有注释的历史记录,但我从未见过它集成到合并工具中,以每个更改为基础。这可能会成为一个非常有用的功能...另一方面,可能会与代码中的注释冲突。 - ima
集成到合并工具中?像 Git 一样? - greyfade
我可能误解了你的意思,但 git merge 处理合并时与简单提交一样干净、简单,具有完整的历史记录和来自源代码库的提交。通过良好的提交注释(以及评审者使用 --signoff),跟踪特定问题的历史记录相当容易。与问题/缺陷跟踪器的集成会很不错,但只需使用几个 Perl 脚本即可添加,应该不难。 - greyfade
请在发布问题之前阅读问题 - 即使是 Git 用户也可以做到。“git merge”处理分支,但问题是关于文件的。 - ima
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接