如何判断两个源文件是否生成功能相同的代码?

How can I tell if two source files produce functionally identical code?

我正在使用 uncrustify 格式化一个充满 C 和 C++ 代码的目录。我需要确保 uncrustify 不会更改生成的代码;我无法对目标文件或二进制文件进行比较,因为目标文件具有时间戳,因此永远不会相同。我不能一一检查文件的来源,因为我已经在这里待了很多年。

该项目使用 make 进行构建过程,所以我想知道是否有某种方法可以在那里输出可以检查的内容。

我搜索了 SO 和 Google 无果,如果这是重复的,我深表歉意。

编辑:我正在使用 gcc/g++ 并针对 32 位进行编译。

一种可能是用 CLang 编译它们,并将输出作为 LLVM IR。如果没记错的话,这应该是 -S -emit-llvm.

的命令行参数

要对 gcc/g++ 做同样的事情,您可以使用其标志之一在编译的某个阶段生成包含其中间表示的文件。早期阶段仍会显示与白色 space 等变化的差异,但快速测试表明,在 SSA 阶段,此类非操作性变化已从 IR 中消失。

g++ -c -fdump-tree-ssa foo.cpp

除了正常的目标文件之外,这将生成一个名为 foo.cpp.018t.ssa 的文件,代表源文件中的语义操作。

如上所述,虽然我还没有测试过这个广泛的——有可能在这个阶段,一些非操作性的改变仍然会产生不同的输出文件(虽然我有点怀疑)。如有必要,您可以使用 -fdump-tree-all 所有 个编译阶段 1 获取输出。作为一个简单的经验法则,我希望后期阶段更不受格式等变化的影响,所以如果 ssa 阶段不起作用,我的下一个选择可能是 optimized 阶段,即最后阶段之一(注意:生成的文件按照生成每个文件的阶段的顺序编号,因此当您转储所有阶段时,很明显哪些阶段由早期阶段生成,哪些由后期阶段生成)。


1. 请注意,这会产生相当多的文件,其中许多文件都非常大。第一次执行此操作时,您可能想单独对目录中的单个源文件执行此操作,可以这么说,以免淹没在文件中。另外,当以这种方式编译比正常情况下花费更长的时间时,请不要感到惊讶。