gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:37:17 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

一种可能性是使用 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 阶段,这是最后一个阶段(注意:生成的文件按照生成每个文件的阶段的顺序编号,因此当您转储所有阶段时,很明显哪些是早期阶段生成的,哪些是后期阶段生成的)。


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

关于c++ - 如何判断两个源文件是否生成功能相同的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38054565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com