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

时间:2010-04-16 14:15:05

标签: c++ g++

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

struct something{ int a; int b; };
void foo() {
    something uninitialized;
    bar(uninitialized.b);
}

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

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

3 个答案:

答案 0 :(得分:4)

任何C ++编译器都可以使用以下语法将任何POD类型初始化为其“零”值:

int i = int();
float f = float();
MyStruct mys = MyStruct();
// and generally:
T t = T();

如果你想谈谈调试那是另一回事......

(顺便说一句,我认为在<调试模式下,VS将所有未初始化的内存初始化为0xCC,这样无论你跳到哪里(例如调用一个坏的函数指针)都没有碰巧是实际的程序代码/数据int3被引发。)

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

我不相信g ++会检测到这样的所有情况,但Valgrind肯定会。