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

防止Xcode/clang在故意有缺陷的代码上引发逻辑错误,xcode,macos,clang,objective-c++,clang-static-analyzer,Xcode,Macos,Clang,Objective C++,Clang Static Analyzer,仅出于测试目的,我包含一个故意使我的应用程序崩溃的函数(测试我的应用程序对意外崩溃的处理)。为此,我使用了: strcpy(0, "crash"); 当然,在分析代码时,Xcode会在调用字符串复制函数时报告逻辑错误Null指针参数。我尝试过这样包装有问题的代码: #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnonnull" strcpy(0, "crash"); #pragma clang dia

仅出于测试目的,我包含一个故意使我的应用程序崩溃的函数(测试我的应用程序对意外崩溃的处理)。为此,我使用了:

strcpy(0, "crash");
当然,在分析代码时,Xcode会在调用字符串复制函数时报告逻辑错误
Null指针参数
。我尝试过这样包装有问题的代码:

#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,“崩溃”)

这将起作用,因为编译器不允许在读取时假设x是任何值;这意味着任何可能硬编码的检查都应该被忽略。

这对我来说很有效(不需要添加警告抑制)。它通过了Xcode/clang的分析,仍然导致我想要的崩溃:

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

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

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

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

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

谢谢您的建议。Xcode/clang仍然抱怨使用您的代码(2个警告和相同的错误):警告:不兼容的整数到指针转换将“volatile int”传递给“const void*”类型的参数警告:不兼容的整数到指针转换将“volatile int”传递给“char*”类型的参数问题:调用字符串复制函数时指针参数为空抱歉-可能int不起作用,请尝试char*。。。如果有效,我会更新答案。如果没有,我将删除它:)没有,我尝试了
char*x=0;strcpy(x,“崩溃”)虽然消除了警告,但逻辑错误仍然存在。再次感谢您的建议。@Jon with the volatile?或者,
volatile int x=0;int crash=5/x是目标C++ +<代码>(char *)@“0”。代码>?如果是这样的话,你可能想重新标记这个问题。谢谢你的建议,但这只会导致一个异常,而不是像我上面发布的代码那样导致硬崩溃,因为我需要测试我的应用程序在后续发布时如何处理崩溃。也谢谢你的编辑。你有注册的异常处理程序吗?我不知道你在“硬崩溃”和“仅一个异常”之间做了什么区别,因为异常的标准结果是中止。在macOS上,如果我使用你建议的代码,它会中止方法的其余部分,但用户不一定看到任何问题,应用程序会保持运行。我想要的是应用程序完全崩溃,导致它意外退出,并创建崩溃报告。我发布的代码满足了这个问题,它通过了静态分析器,并导致应用程序完全崩溃,启动了一个崩溃报告,我可以在随后的启动中测试它。即使我在有缺陷的strcpy代码周围放置了一个异常处理程序,
EXC\u BAD\u ACCESS
错误也会杀死应用程序。这很有趣。。。对不起,我已经假定了;但我也不认为它在Mac电脑上的表现会有所不同。