我有以下代码摘录(摘自大项目),使用gcc 4.9.3
与-O2
或-O3
进行编译时,会在尝试取消引用s
时崩溃在if
块(s->someField
)内,因为s
是NULL
指针。
通过在gdb中反汇编代码,我注意到编译器实际上优化了空检查,这解释了崩溃。我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
中完全正常。在gdb中,在这种情况下,NULL
检查似乎不优化。
void someFunc(struct MyStruct *s)
{
if (s == NULL)
{
return;
}
cout << s->someField << endl;
delete s;
}
虽然我知道我可以更改代码使其工作,但它是一个大项目,我无法在任何地方更改类似的情况,是否有一些其他编译器标志来关闭编译器优化null校验?