@throw NSInternalInconsistencyException;
[self performSelector:@selector(die_die)];
@[][666];
刚写
assert(NO)
。这将检查给定的条件为参数,如果应用程序为false。
exit(0)
还将做技巧
int* p = 0;
*p = 0;
gives a
EXC_BAD_ACCESS (code=2, address=0x0)
格雷格·帕克斯(Greg Parkers)评论说,允许编译器优化上述陈述,这使我对上述陈述进行了更彻底的思考,以及格雷格·帕克(Greg Parker)为何正确:
实际上,在C和C ++中,null指针的指定为“未定义的行为”(另请参见C99§6.5.3.2/4)。 这是指上述陈述的效果取决于编译器。这种“不确定的行为”也意味着,允许编译器应用几个优化,这可能具有上述陈述将“优化外节”的效果 - 正如Greg Parker所言。
韦尔,这让我很好奇Clang实际上会做什么:这是一个小测试程序:
int main(int argc, const char * argv[])
{
int* p = 0;
*p = 0;
return 0;
}
0x100000f90: pushq %rbp
0x100000f91: movq %rsp, %rbp
0x100000f94: ud2
where
ud2
`EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)`
(也许@gregparker可以评论为什么clang选择这种方法?)
尽管这很有趣,但它指的是“删除零指针”。如果我们有这个:
int* p = (int*)1;
*p = 0;
程序按预期崩溃 - 但需要硬件拒绝写入此(无效)地址的“先决条件”。
我认为范围内的好旧数组索引保证了“成功崩溃”,因此在这里我最喜欢的列表:
swift4:
[][0]
fatalError()
对象c
@[][0];
int *x = nil; *x = 0;
尽管解决了您的问题,但是一个例外(不是崩溃),因此可能是caught的。
我经常发现启动应用程序,做一些事情,然后在10秒后崩溃很有用。在这种情况下(对于Objective-C),我使用:
@throw NSInternalInconsistencyException;
对此的次要好处是,编译器不会对未找到选择器提出任何警告(如果使用Objective-C)。 :)
[self performSelector:NSSelectorFromString(@"crashme:") withObject:nil afterDelay:10];
更受控的方法是实际提出一个例外:
self.perform("crashme:", with: nil, afterDelay: 10)
检查更多例外。
对于Swift,这些对我有用:
@throw [NSException exceptionWithName:NSGenericException reason:@"" userInfo:nil];
和此:
NSException.h
assert(false, "sdf")
givesexc_bad_access