仅出于测试目的,我提供了一个故意崩溃我的应用程序的功能(测试我的应用程序处理无意的崩溃)。为此,我正在使用:
strcpy(0, "crash");
当然,在分析我的代码时,Xcode会报告逻辑错误Null pointer argument in call to string copy function
。我试过像这样包装有问题的代码:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
strcpy(0, "crash");
#pragma clang diagnostic pop
但Xcode(v9.2(9C40b))仍然抱怨(这不是警告,这是一个逻辑错误,我理解)。还有其他方法可以阻止Xcode / clang标记此代码吗?有没有更好的方法来引发可以防止Xcode / clang分析错误的崩溃?
答案 0 :(得分:2)
这对我有用(无需包含警告抑制)。它通过Xcode / clang的分析,仍然导致我想要的崩溃:
char *x = (char *)@"0".integerValue; strcpy(x, "crash");
答案 1 :(得分:0)
volatile char* x=0; strcpy(x, "crash")
这可以工作,因为编译器不允许假设读取的x是任何值;意味着任何可能硬编码的检查都应该被忽略。
答案 2 :(得分:0)
在我看来,打败静态分析的最好方法是做一些动态的事情。 Objective-C本质上有很多选项,因为编译器不能保证消息发送和方法之间的一对一对应。
最简单的事情可能是触发索引错误:
[@"" characterAtIndex:0]; // or
[@[] objectAtIndex:0];
即使分析器知道这些方法的默认实现引发了越界访问的异常,它也无法知道您在运行时没有将它们换出来优雅地处理问题的实现。