Почему разыменование null не приводит к сбою моей программы?

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

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

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

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

 Josh Caswell30 апр. 2012 г., 02:35
Другие варианты возникновения аварии, если они вам нужны: Сбой C без кастинга

Ответы на вопрос(3)

Решение Вопроса

оно не должно вызывать сбой.

При этом, если у вас есть два варианта компиляции в двух проектах, у вас есть хороший шанс получить различное поведение в этих случаях. Посмотри этоLLVM сообщение в блоге о неопределенном поведении.

 Jens Ayton30 апр. 2012 г., 05:11
Совет по использованию изменчивых переменных - единственная плохая вещь в этом посте. Если вы действительно хотите вызвать крах под Clang, используйте__builtin_trap().
 pepsi30 апр. 2012 г., 02:33
Спасибо, я понятия не имел. Эта ссылка помогла мне привести к сбою: «Если вы используете компилятор на основе LLVM, вы можете разыменовать нулевой указатель« volatile », чтобы получить сбой, если это то, что вы ищете, так как энергозависимые загрузки и хранилища обычно оптимизатор не тронул. "
 Rob Keniger30 апр. 2012 г., 03:37
Вероятно, стоит указать тем, кто не очень знаком с C, это означает, что вам нужно объявитьnullp какvolatile int *nullp = NULL;.
 MByD30 апр. 2012 г., 02:35
Это сообщение открыло мне глаза, когда я впервые прочитал его (около месяца или двух назад)
 Peter Hosey30 апр. 2012 г., 05:41
Или, более переносимо,raise(SIGTRAP) илиabort(). Последний что делает Clang на архитектурах, в которых нет инструкции ловушки.

или int * nullp = 0 одинаковы, это означает, что указатель nullp не указывает на область памяти. Так как NULL == 0, он печатает ноль и не падает

т. Е. Не существует правила, которое говорит этодолже сбой вашего приложения.

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

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

 Mark Ransom22 февр. 2018 г., 05:59
Пока запись в нулевой указатель равна скорее всего для создания аварии, это все еще не гарантируется. Undefined также означает непредсказуемость, по крайней мере, со 100% гарантией, если вы не очень хорошо знакомы с архитектурой компилятора и процессора - и ни один из них не меняется.

Ваш ответ на вопрос