gcc 4.9.3: более агрессивное удаление проверки указателя NULL

У меня есть следующий фрагмент кода (извлечение из большого проекта) при компиляции с использованием gcc 4.9.3 с -O2 или же -O3сбой при попытке разыменования s внутри if блок (s->someField) так как s это NULL указатель.

Разобрав этот код в gdb, я заметил, что проверка нуля фактически оптимизирована компилятором, что объясняет сбой. Я немного погуглил и нашел там вариант -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;
}

Хотя я знаю, что могу изменить код, чтобы он работал, но это большой проект, и я не могу изменить подобные случаи везде, есть ли другие флаги компилятора, чтобы отключить оптимизацию компилятора для проверки нуля?

0 ответов

Другие вопросы по тегам