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

时间:2018-01-09 17:02:10

标签: xcode macos clang objective-c++ clang-static-analyzer

仅出于测试目的,我提供了一个故意崩溃我的应用程序的功能(测试我的应用程序处理无意的崩溃)。为此,我正在使用:

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

3 个答案:

答案 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];

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