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;
}
Хотя я знаю, что могу изменить код, чтобы он работал, но это большой проект, и я не могу изменить подобные случаи везде, есть ли другие флаги компилятора, чтобы отключить оптимизацию компилятора для проверки нуля?