2012-05-10 55 views
17

的IBM AIX xlc编译器提供了生成代码初始化本地变量存储一个标志:是否有gcc标志来初始化局部变量存储?

 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等的选项?

+0

'-Wextra'是伟大的,不已经有3个万行代码的新代码库。 :) –

+0

我不能相信初始化拼写文件中的“初始化”。 –

+0

@AndrewMarshall:哈!我甚至没有注意到这一点。它确实拼写这种方式,虽然这个xlc是相当古老的。目前[在线帮助](http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Fcompiler%2Fref%2Fruoptini。HTM)没有这个错误。 –

回答

10

好的,我可以提供。

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

尽可能接近我可以猜到,只是这可能是工作的方式,就是要注入一些memset样的代码(可能几mov操作一样简单,但仍然)到每个嵌入式词汇帧的开始,其中自动变量被创建。由于靠近我可以告诉 - 我从GCC的内部专家,但是 - 似乎有什么记录会这么做。

在接下来的内容中,第361页的GCC内部函数的PDF gccint.pdf(http://gcc.gnu.org/onlinedocs/gccint.pdf)定义了在进入函数时帧指针调整调用步骤的GCC名称为prologue。 (我真的不知道/了解这是否适用于其他词法作用域的函数内,但是。)由于应在一个机器定义(MD)的文件的时候,任何这样的选择会似乎有一个被定义CPU架构。我在他们的在线ViewCVS戳在http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/,发现prologue(至少一个)副本周围i386.md的11893线,打搜寻 - 的 - 功能扩展了几跳后,似乎不有什么发出这样的条件代码。

但这下GCC's罩的东西还挺整齐...

+0

谢谢,这看起来像最接近(当前)正确的答案。毫无疑问,在实际实现中涉及许多可能的细节,例如C99可变长度数组,局部变量空间的重用以及'alloca()'之类的东西。 –

0

C99:如果具有自动存储持续时间的对象没有被明确初始化,它的值是不确定的。

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

+5

我知道语言规范不需要初始化具有自动存储持续时间的变量。但是,如果您要求,至少有一个编译器具有*选项*。我的问题是GCC是否有类似的选择。 –

3

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

就标准GCC而言,我能找到的这个主题的唯一特征是-Wuninitialized在任何未初始化的变量上发出警告(尽管我知道这不是你正在寻找的)。

你有多需要这个?如果你有一个很好的理由,我认为它不可能很难复制-finit-local-zero代码到您的GCC版本...

+0

但是它有点本地化到FORTRAN前端,但是:http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html ...很好找,但恐怕它不会帮助使用基于C的代码 – BRFennPocock

+2

目前这不是一个巨大的需求。我们的想法是,如果我们为xlc(以这3百万行代码为基础)开启了这样一个选项,然后再迁移到gcc,那么代码可能依赖于明确的初始化,如果没有gcc中的对应选项。理想情况下,长期的解决方案是使用'-Wininitalized'和'-Werror'(xlc也具有相同的选项)。 –