2

我有以下代码摘录(从一个大项目中摘录),当使用 or 编译gcc 4.9.3-O2-O3当它尝试在块 ( )s内取消引用时它会崩溃,因为它是一个指针。ifs->someFieldsNULL

通过在 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;
}

虽然我知道我可以更改代码以使其工作,但这是一个大项目,我无法在任何地方更改类似的情况,是否有一些其他编译器标志可以关闭编译器优化以进行空检查?

4

0 回答 0