gcc 4.9.3:更积极的NULL指针检查删除

时间:2016-04-23 21:01:05

标签: gcc g++ gcc4.9 g++4.9

我有以下代码摘录(摘自大项目),使用gcc 4.9.3-O2-O3进行编译时,会在尝试取消引用s时崩溃在if块(s->someField)内,因为sNULL指针。

通过在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校验?

0 个答案:

没有答案