我有以下代码摘录(从一个大项目中摘录),当使用 or 编译gcc 4.9.3
时-O2
,-O3
当它尝试在块 ( )s
内取消引用时它会崩溃,因为它是一个指针。if
s->someField
s
NULL
通过在 gdb 中反汇编这段代码,我注意到 null 检查实际上是由编译器优化的,这解释了崩溃。我google了一下,发现有一个选项-fno-delete-null-pointer-checks
可以解决这个问题,但是在我用这个选项编译代码后,它的行为是一样的。
void someFunc(struct MyStruct *s)
{
if (s != NULL)
{
cout << s->someField << endl;
delete s;
}
}
这不会闯入gcc 4.7.2
。
另一个数据点是,如果我将代码更改为以下内容,它在gcc 4.9.3
. NULL
在 gdb 中,在这种情况下,检查似乎没有优化。
void someFunc(struct MyStruct *s)
{
if (s == NULL)
{
return;
}
cout << s->someField << endl;
delete s;
}
虽然我知道我可以更改代码以使其工作,但这是一个大项目,我无法在任何地方更改类似的情况,是否有一些其他编译器标志可以关闭编译器优化以进行空检查?