2012-04-30 4 views
4

Я написал следующий код, чтобы вызвать сбой (я тестируя некоторые issues с CrashReporter):Почему не происходит разыменование нулевой ошибки моей программы?

int *nullp = NULL; 
int val = *nullp;  
NSLog(@"Hello world %d", val); 

В новом проекте (я положил его в приложение делегата applicationDidFinishLaunching:) он выходит из строя, как и ожидалось. Но когда я добавляю его в один из моих существующих проектов, он не падает! Фактически, он заканчивает печать «Hello world 0» в системном журнале.

Это не имеет никакого смысла для меня. Почему нулевое разыменование не вызывает сбоев?

+2

Другие варианты вызывает сбой, если вы нуждаетесь в них: [Make C аварии без литья] (HTTP://stackoverflow.com/questions/5556183/make-c-crash-without-casting) –

ответ

8

Dereferncing NULL имеет неопределенное поведение, оно не должно вызывать сбоев.

Если у вас есть разные параметры компилятора в двух проектах, у вас есть хороший шанс получить другое поведение для этих случаев. См. Это LLVM blog post о неопределенных поведении.

+0

Спасибо, я понятия не имел. Эта ссылка помогла мне заставить ее потерпеть крах: «Если вы используете компилятор на основе LLVM, вы можете разыменовать« volatile »нулевой указатель, чтобы получить сбой, если это то, что вы ищете, поскольку волатильные нагрузки и магазины обычно не затронутый оптимизатором ». – pepsi

+1

Это сообщение открыло мне глаза, когда я впервые прочитал (около месяца или два назад) – MByD

+0

Возможно, стоит обратить внимание на тех, кто не знаком с C, это означает, что вам нужно объявить 'nullp' как' volatile int * nullp = NULL; '. –

2

Вывод нулевых указателей является неопределенным поведением - т.е. нет правила, которое говорит об этом должно свернуть ваше приложение.

Различные компиляторы будут давать разные результаты - и различные параметры компилятора (например, версии отладки отладки) также будут влиять на вещи.

Если вы пытаетесь заставить аварии вы всегда можете начать запись в нулевой указатель ...

+0

При написании нулевого указателя * скорее всего, для генерации сбоя, он все равно не гарантируется. Undefined также означает непредсказуемое, по крайней мере, 100% гарантию, если вы не знакомы с архитектурой компилятора и процессора - и ни один из них не меняется. –