Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有用于初始化局部变量存储的gcc标志?_C_Gcc_Local - Fatal编程技术网

是否有用于初始化局部变量存储的gcc标志?

是否有用于初始化局部变量存储的gcc标志?,c,gcc,local,C,Gcc,Local,IBM AIXxlc编译器提供了一个标志,用于生成初始化局部变量存储的代码: initauto=<hh> Initialialize automatic storage to <hh>. <hh> is a hexadecimal value. This generates extra code and should only be use

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.
initauto=
将自动存储初始化为。是一个
十六进制值。这会生成额外的代码和
应仅用于确定错误。
我认为MSVC编译器在调试构建中也做了类似的事情,但我的记忆在这一点上可能不清楚


GCC是否有等效选项?

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


关于这个问题有一个话题

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

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


你有多需要这个?如果你有一个很好的理由,我想把
-finit local zero
代码复制到你的GCC版本不会那么难…

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

通过省略表示“不”。没有任何文档可以将堆栈擦除代码注入到输出中

据我所知,唯一可行的方法是将一些类似于
memset
的代码(可能简单到一些
mov
操作,但无论如何)注入到创建自动变量的每个嵌入式词法框架的开头。据我所知——我远非GCC内部专家,但是——似乎没有任何文件证明这一点

在此之后,第361页GCC内部文件()的PDF gccint.PDF定义了函数入口上帧指针调整调用步骤的GCC名称为
序言
。(但是,我不知道/不理解这是否适用于函数中的其他词法作用域。)因为这应该发生在机器定义(md)文件中,任何这样的选项似乎都必须为CPU体系结构定义。我在他们的在线ViewCVS上搜索,在i386.md的第11893行找到了(至少一个)序言的副本,在对函数扩展进行了几次跳跃后,它似乎没有任何东西发出这样的条件代码


但这在GCC的帽子下的东西有点整洁

我理解语言规范不要求初始化具有自动存储持续时间的变量。但是,如果您要求,至少有一个编译器可以这样做。我的问题是GCC是否有类似的选项。
-Wextra
非常适合那些还没有300万行代码的新代码库。:)我不敢相信在编译器文档中initialize的拼写是“initialize”。@AndrewMarshall:Ha!我甚至没有注意到。它确实是这样拼写的,尽管xlc已经很旧了。当前没有这个错误。我不知道,我有点认为,
-Wextra
对于已经有几百万行代码的肮脏的旧代码库更好:-)那么谁需要TDD呢?O:-)它有点局限于FORTRAN前端,但是:。。。很好的发现,但是我担心这对基于C的代码没有帮助。目前这不是一个巨大的需求。我们的想法是,如果我们为xlc打开这样一个选项(有300多万行代码库),然后稍后迁移到gcc,那么代码可能依赖于明确的初始化,如果gcc中没有相应的选项,这是不会发生的。理想情况下,长期解决方案是将
-Wuninitalized
-Werror
一起使用(xlc也有相应的选项)。谢谢,这看起来最接近(当前)正确答案。毫无疑问,在实际实现中涉及到许多可能的细节,例如C99可变长度数组、局部变量空间的重用,以及类似
alloca()
的事情。