防止 Xcode/clang 在故意有缺陷的代码上引发逻辑错误

Prevent Xcode/clang from raising logic error on intentionally flawed code

仅出于测试目的,我添加了一个故意使我的应用程序崩溃的功能(测试我的应用程序对意外崩溃的处理)。为此,我使用:

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 分析错误的崩溃?

怎么样volatile char* x=0; strcpy(x, "crash")

这行得通,因为不允许编译器假设读取时的 x 是任何值;这意味着应该忽略任何可能硬编码的检查。

这对我有用(无需包含警告抑制)。它通过了 Xcode/clang 的分析,但仍然导致我想要的崩溃:

char *x = (char *)@"0".integerValue; strcpy(x, "crash");

在我看来,打败静态分析的最好方法是做一些动态的事情。 Objective-C,就其本质而言,有很多选择,因为编译器不能保证消息发送和方法之间的一对一对应关系。

最简单的方法可能是触发索引错误:

[@"" characterAtIndex:0]; // or
[@[] objectAtIndex:0];

即使分析器知道这些方法的 default 实现引发了越界访问异常,它也无法知道您没有交换它们在运行时输出一个可以优雅地处理问题的实现。