【问题标题】:Is there a gcc flag to initialise local variable storage?是否有 gcc 标志来初始化局部变量存储?
【发布时间】:2012-05-10 02:03:08
【问题描述】:

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

      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 是否有等效选项?

【问题讨论】:

  • -Wextra 非常适合尚未拥有 300 万行代码的新代码库。 :)
  • 我不敢相信在编译器文档中初始化拼写为“initialize”。
  • @AndrewMarshall:哈!我什至没有注意到这一点。它确实是这样拼写的,虽然那个 xlc 已经很老了。当前的online help 没有那个错误。
  • 我不知道,我觉得-Wextra 更适合已经有几百万行代码的破旧、讨厌的旧代码库 :-) 那么谁需要 TDD? O:-)

标签: c gcc local


【解决方案1】:

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

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

据我猜测,唯一可行的方法是将一些memset-like 代码(可能像几个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 并在 i386.md 的第 11,893 行附近找到了(至少一个)prologue 的副本,在搜索功能扩展几跳之后,似乎没有有任何东西可以发出这样的条件代码。

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

【讨论】:

  • 谢谢,这看起来最接近(当前)正确答案。毫无疑问,在实际实现中涉及到很多可能的细节,例如 C99 变长数组、局部变量空间的重用,以及诸如alloca() 之类的东西。
【解决方案2】:

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

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

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

【讨论】:

  • 它有点本地化到 FORTRAN 前端,但是:gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html ... 不错的发现,但恐怕它对基于 C 的代码没有帮助
  • 目前这不是一个巨大的需求。想法是,如果我们为 xlc 启用这样的选项(使用这 3+ 百万行代码库),然后稍后迁移到 gcc,则代码可能依赖于明确的初始化,如果没有 gcc 中的相应选项,则不会发生这种情况.理想情况下,长期解决方案是使用-Wuninitalized-Werror(xlc 也有相同的选项)。
【解决方案3】:

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

关于这个问题有一个话题。 What happens to a declared, uninitialized variable in C? Does it have a value?.

【讨论】:

  • 我了解语言规范不需要初始化具有自动存储持续时间的变量。但是,如果您要求,至少有一个编译器有一个 option 可以这样做。我的问题是 GCC 是否有类似的选择。
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 2016-09-07
  • 1970-01-01
  • 2012-10-03
  • 2017-05-14
  • 2016-01-14
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多