这可能看起来像一个微不足道的问题。对不起,在这种情况下,我无法找到实际的方式。我知道自动变量是未初始化的。因此,下面提供的代码段可能会在块2中转储
char *p;
if(NULL == p)
{
//do something block-1 statement
}
else
{
//do something else block-2 statement
}
现在,在大多数平台中,自动变量的默认值为0或NULL,尤其是SUSE Linux风格。
一个。是否有任何编译器标志或任何其他选项,如果未初始化,将强制将局部变量设置为“垃圾”值?
PS:我知道静态分析工具很容易就能检测到问题。我只是想知道是否可以在运行时通过一些标志/选项设置来完成。
我正在使用SUSE 10 / HP-UX和AIX平台。
答案 0 :(得分:6)
您不需要静态分析工具 - 只需使用-Wall标志进行编译即可让编辑器向您发出有关问题的警告。并且不要寻找“创可贴”解决方案 - 只需自己初始化变量。
答案 1 :(得分:1)
首先,为什么要在运行时使用编译器警告或静态分析器更快更容易地捕获它?
我不知道编译器标志可以做你想做的事情,但我很确定外部工具如valgrind和Purify可以监控这些事情。
答案 2 :(得分:1)
你在这里看到的是一个关于如何将内存分配给Unix上的进程的工件。
由于堆栈段未存储在可执行文件的磁盘文件映像中,因此OS必须在程序启动时将新页面分配给堆栈。这些最初为零填充,与.bss
相同。堆栈的初始零填充是历史的。有人企图“简化”它而不是那样做。太多的节目破了,所以放弃了这一举动。
运行你的程序一段时间,进行多个函数调用, - 你最终会在堆栈上看到“垃圾”:)