19

IBM AIXxlc编译器提供了一个标志,用于生成初始化局部变量存储的代码:

      initauto=<hh>
                  Initialialize automatic storage to <hh>. <hh> is a
                  hexadecimal value.  This generates extra code and
                  should only be used for error determination.

我认为 MSVC 编译器为调试构建做了类似的事情,但我的记忆在这一点上可能很模糊。

GCC有等效的选择吗?

4

3 回答 3

10

好的,我能提供的最佳答案。

http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html通过遗漏说“不”。没有将堆栈擦除代码注入输出的任何文档。

正如我猜想的那样,唯一可行的方法是将一些memset类似的代码(也许像几个mov操作一样简单,但尽管如此)注入到每个嵌入的词法框架的开头,其中创建了一个自动变量。据我所知——而且我不是 GCC 内部的专家,但是——似乎没有任何文件可以这样做。

在此之后,第 361 页的 GCC Internals ( http://gcc.gnu.org/onlinedocs/gccint.pdf ) 的 PDF gccint.pdf 定义了帧指针调整调用步骤的 GCC 名称进入函数是prologue。(但是,我真的不知道/理解这是否适用于函数中的其他词法范围。)由于这应该发生在机器定义(md)文件中,因此似乎必须为 CPU 架构定义任何此类选项. 我在http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/上查看了他们的在线 ViewCVS并找到(至少一个)prologuei386.md 的第 11,893 行左右的副本,该副本在播放 search-for 之后-the-function-expansion 几跳,似乎没有任何东西可以发出这样的条件代码。

但是这个 GCC 引擎盖下的东西有点整洁......

于 2012-05-10T03:32:20.447 回答
3

我找不到任何明确的参考,但似乎 GCC 的某些副本(特别是 GCC Fortran 编译器)可以-finit-local-zero选择自动将任何非显式初始化的局部变量或数组设置为零。

就标准 GCC 而言,我能找到的关于这个主题的唯一功能是-Wuninitialized对任何未初始化的变量发出警告(尽管我知道这不是你要找的)。

你有多需要这个?-finit-local-zero如果您有充分的理由,我想将代码复制到您的 GCC 版本不会那么难...

于 2012-05-10T03:12:11.960 回答
-1

C99:如果具有自动存储持续时间的对象未显式初始化,则其值不确定。

关于这个问题有一个话题。C 中声明的、未初始化的变量会发生什么?它有价值吗?.

于 2012-05-10T02:40:13.037 回答