为什么不解除引用null崩溃我的程序?

pep*_*psi 4 macos cocoa objective-c

我编写了以下代码来引发崩溃(我正在测试CrashReporter的一些问题):

int *nullp = NULL;
int val = *nullp;    
NSLog(@"Hello world %d", val);
Run Code Online (Sandbox Code Playgroud)

在一个全新的项目中(我将它放在app delegate中applicationDidFinishLaunching:),它会按预期崩溃.但是当我将它添加到我现有的一个项目中时,它不会崩溃!实际上,它最终会将"Hello world 0"打印到系统日志中.

这对我没有任何意义.为什么空取消引用不会导致崩溃?

MBy*_*ByD 8

去除NULL具有未定义的行为,它不必导致崩溃.

话虽这么说,如果你在两个项目中有不同的编译器选项,你很有可能为这些情况获得不同的行为.请参阅此LLVM博客文章,了解未定义的行为.

  • 使用volatile变量的建议是该帖子中唯一的坏处.如果你真的想在Clang下强制崩溃,请使用`__builtin_trap()`. (3认同)
  • 或者,更方便的是,"raise(SIGTRAP)"或"abort()".后者是[Clang在没有陷阱指令的架构上做的事情](http://clang.llvm.org/docs/UsersManual.html#opt_ftrap-function). (2认同)