Visual studio 2005:有没有一个编译器选项可以将所有基于栈的变量初始化为零?

问题描述 投票:2回答:4

这个问题之前就已经问过了,所以我很想再问一次,但是我在google和stackoverflow上搜索都找不到。

我正在把一堆linux的代码移植到windows上,其中有很大一部分是假设所有的东西都自动初始化为0或null。

int whatever;
char* something;

...然后马上做一些可能会让 "某物 "为空的事情,并对 "某物 "进行测试。

if(something == NULL)
{
.......
}

我真的很想不用再回到这段代码中去说。

int whatever = 0;
char* something = NULL;

即使这是处理它的正确方法, 只是非常耗费时间。

否则,我声明一个变量,如果我自己不设置它,它就会被初始化成一些疯狂的东西。

visual-studio compiler-construction variables initialization
4个回答
6
投票

这个选项在MSVC中并不存在,老实说,不管是谁给你的应用程序编码,都犯了一个大错误。那段代码是不可移植的,因为CC++说未初始化的变量有一个未定义的值。我建议设置 "将警告视为错误 "选项并重新编译;MSVC 每当一个变量在没有初始化的情况下被使用时,都会给你一个警告。


3
投票

不,MSVC中没有这样的选项。

调试构建会用其他的东西来初始化它们(我想是0xcc),但不是零。 不幸的是,你的代码有问题,需要修正(当然这只适用于自动变量--对于静态和全局变量,假设它们是零初始化也可以)。我很惊讶有任何编译器支持这种行为--如果GCC中有这样的选项,我没有听说过(但我不是GCC尘封角落的专家)。

你可能会听说MSVC的早期版本会在调试构建中把变量初始化为零(类似于VS 2005中使用0xcc的方式),但据我所知这是不真实的。

编辑----------。

好吧,我真该死--GCC确实(或曾经?-finit-local-zero 选项。 我想,它的存在主要是为了支持Fortran。

我建议使用编译器关于使用未初始化变量的警告来帮助你发现99%的问题。我知道这不是什么了不起的工作,但如果可能的话,应该这样做。


0
投票

我最后做的是改用w4。 在这个层面上,它抓住了大多数 "是的,这将是一个问题 "的初始化领域。 否则,从初始化时的0xcccccccc到我看到的0x00000000,没有什么可以改变一切。

大量感谢大家的回答,是的,我们会在未来收紧它。


0
投票

有趣的是,MSVC现在 是否 有能力做到这一点。微软安全团队在博客中写了一篇关于它的文章 此处,还有一个CppCon的演讲。此处.

遗憾的是,这个选项似乎并没有暴露在公众面前。本页 列出了一系列 "隐藏的MSVC标志",其中包括一个叫做 -initall所以,可能就是这样。

© www.soinside.com 2019 - 2024. All rights reserved.