На днях видел
прекрасное:
Доступны
корректирующие выпуски DNS-сервера BIND
9.10.0-P2, 9.9.5-P1 и 9.8.7-P1, в которых устранена
серия уязвимостей и решена проблема,
способная привести к краху процесса в
непредсказуемые моменты обработки
запросов. Примечательно, что проблема
проявляется только при сборке с
использованием GCC 4.9.0 и более новых
выпусков и вызвана изменением работы
оптимизатора GCC. В частности, начиная с
GCC 4.9 по умолчанию включается режим
удаления лишних операций сравнения с
указателями NULL
Какая прелесть!
Лишние операции проверки на NULL. Я понимаю,
некая сермяга в этом есть, конечно. Типа,
код надо писать правильно. Но скажите
мне, кто в состоянии написать хоть сотню
строк абсолютно правильно? А разработчики
компилятора в нас верят, очевидно.
Спасибо им за это.
Иллюстрация
того, что именно оптимизатор GCC 4.9 считает
лишними проверками на NULL:
The gcc optimization
level 2 or higher will delete null-pointer checks
beyond the first
use/test of a pointer. For targets such as the ARM7
that do not have a
hardware memory manager, this can cause silent
failures...for
example, consider the following code:
void bad_code(void *a) { int *b = a; int c = *b; static int d; if (b) { d = c; } }
If using -O2 or
higher, the conditional test for b will not be
performed (i.e. d=c
will always be executed regardless of whether a
value of 0 was
passed into the function).
This can be fixed by
using the compiler flag:
-fno-delete-null-pointer-checks
Используйте
этот флаг при компиляции с оптимизацией
-O2 или выше. А не то пожалеете :)
А вообще
прэлестно, да.
original post http://vasnake.blogspot.com/2014/07/fno-delete-null-pointer-checks.html
Комментариев нет:
Отправить комментарий