g ++可以用已知值填充未初始化的POD变量吗?

Bob*_*ied 9 c++ g++

我知道调试选项下的Visual Studio将使用已知值填充内存.g ++(任何版本,但gcc 4.1.2最有趣)是否有任何选项可以填充具有可识别值的未初始​​化的本地POD结构?

struct something{ int a; int b; };
void foo() {
    something uninitialized;
    bar(uninitialized.b);
}
Run Code Online (Sandbox Code Playgroud)

我希望uninitialized.b随机性不可预测; 显然是一个错误,如果打开优化和警告,很容易找到.但只用-g编译,没有警告.一位同事有一个案例,其中类似于此的代码起作用,因为它巧合地具有有效值; 当编译器升级时,它开始失败.他认为这是因为新的编译器将已知值插入到结构中(就像VS填充0xCC一样).根据我自己的经验,只是不同的随机值没有发生有效.

但现在我很好奇 - 是否有任何g ++设置会使它填满内存,标准会说这应该是未初始化的?

jwe*_*ich 3

我认为 gcc/g++ 中不存在这样的选项/功能。

例如,所有全局(和静态)变量都驻留在该.bss部分中,该部分始终初始化为零。.bss然而,为了兼容性,未初始化的被放置在 中的一个特殊部分中。

如果您也希望将它们归零,您可以将-fno-common参数传递给编译器。或者,如果您需要基于每个变量,请使用__attribute__ ((nocommon)).

对于堆,可以编写自己的分配器来完成您所描述的任务。但对于堆栈,我认为没有一个简单的解决方案。