查找文件的两个修订版之间的功能更改(编译差异?)

时间:2012-01-15 20:38:24

标签: c merge diff

我正在寻找一种工具,检查两个(C)源代码文件是否生成相同的二进制文件,以便我可以找到两个文件之间的实际功能变化,而忽略单纯的编码样式更改。 如果这对于不同的变更集在一个文件中工作会很好,所以某些地方的编码风格可能已经改变,但也添加了一个功能补丁。

5 个答案:

答案 0 :(得分:1)

编写一个程序来计算另一个程序的“功能”结果非常困难。这样的程序听起来像是必要的。我猜想计算机程序本身对于我们甚至描述功能的最紧凑和机器可读的方式是正确的,因此编写一个分析程序并生成“更好”描述的程序是很困难的。

以某种方式抽象和“理解”编码风格差异不影响功能也听起来非常非常困难。当我以某种方式手动阅读其他人的代码时,我发现很难,因为风格的差异可能非常大,即使最终结果可能与“我的风格”相同。

如果解决方案不需要halting problem的解决方案,我会感到惊讶,这对于一般情况来说是不可能的。

答案 1 :(得分:1)

唯一的方法是使用相同的编译器选项编译它们并执行二进制差异。

这不仅仅是您需要注意的风格变化;有人可能已将代码提取到在优化构建中内联的函数中。这可能会,也可能不会,取决于编译器选项和版本,给出相同的二进制文件。

答案 2 :(得分:0)

  • 将二进制映射回源到“高级功能” - 不太可能。

  • 比较两个源文件与“高级功能”(忽略编码风格) - 可能:

    http://cscope.sourceforge.net/

  • 替代建议:

    编写一个“规范化”源文件的工具 - 将相同的格式应用于两个代码集。

    这很容易实现自动化。

    例如:

    1)从版本控制中结帐,

    2)应用“标准格式”,

    3)比较

答案 3 :(得分:0)

如果您感兴趣的是它们是否“生成相同的二进制文件”,那么最简单的解决方案就是生成两个二进制文件,并进行比较。

但是,请注意,即使它们在功能上完全相同,但有些事情会导致二进制文件有点不同:

  • 更改外部函数名称
  • 的优化
  • 重新排序非依赖代码段

答案 4 :(得分:0)

计算机科学的一个分支涉及并发和并行过程。 其中一个应用是决定两个系统是否在行为上是等效的(在某种bisimulation关系中(弱或强))。

虽然在计算上很难确定两个大型系统在行为上是否相同。该用途主要用于验证我们无法承受失败的小型关键应用程序。