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

时间:2016-06-27 12:54:54

标签: c++ c format diff uncrustify

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

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

我搜索过SO和Google无济于事,所以如果这是重复的话我会道歉。

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

1 个答案:

答案 0 :(得分:2)

一种可能性是用CLang编译它们,并将输出作为LLVM IR。如果内存服务,这应该是-S -emit-llvm的命令行参数。

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

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

除了普通的目标文件外,还会生成一个名为foo.cpp.018t.ssa的文件,代表源文件中的语义操作。

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

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