3

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

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

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

编辑:我正在使用 gcc/g++ 并为 32 位编译。

4

1 回答 1

2

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

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

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

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

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


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

于 2016-06-27T13:53:08.313 回答