Вопрос по macos, objective-c, cocoa – Почему разыменование null не приводит к сбою моей программы?

4

Error: User Rate Limit Exceededпроблемы с CrashReporter):

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

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

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

Error: User Rate Limit ExceededMake C crash without casting Josh Caswell

Ваш Ответ

3   ответа
8

Этот пост открыл мне глаза, когда я впервые прочитал его (около месяца или двух назад)
Тем, кто не очень знаком с C, вероятно, стоит указать, что это означает, что вы должны объявитьnullp какvolatile int *nullp = NULL;.
Совет использовать изменчивые переменные - единственная плохая вещь в этом посте. Если вы действительно хотите вызвать крах под Clang, используйте__builtin_trap().
Спасибо, я понятия не имел. Эта ссылка помогла мне привести к ее аварийному завершению: «Если вы используете компилятор на основе LLVM, вы можете разыменовывать« volatile ». нулевой указатель для получения сбоя, если это то, что вы ищете, так как оптимизатор обычно не затрагивает изменчивые нагрузки и хранилища. & quot; pepsi
Или, более переносимо,raise(SIGTRAP) или жеabort(), Последний являетсяwhat Clang does on architectures that don't have a trap instruction.
0

2

must

Во время записи в нулевой указательmore likely чтобы генерировать сбой, это все еще не гарантировано. Undefined также означает непредсказуемость, по крайней мере, со 100% гарантией, если вы не очень хорошо знакомы с архитектурой компилятора и процессора - и ни один из них не изменится.

Похожие вопросы