Objective c 如何编译时检查传递给NSArray构造函数的nil对象
Objective c 如何编译时检查传递给NSArray构造函数的nil对象,objective-c,cocoa-touch,clang,clang-static-analyzer,Objective C,Cocoa Touch,Clang,Clang Static Analyzer,NSArray非常不喜欢将nil对象作为其构造函数的一部分传递: UIView *aView; UIView *aSecondView = [[UIView alloc] init]; NSArray *array = @[aView, aSecondView]; 将在创建数组时在运行时引发异常 clang是否有任何工具可以尝试检测这种错误?对于一些琐碎的情况(如上面的一个:从未分配给的堆栈局部变量),这似乎是静态分析器会遇到的问题;DR:-Wuninitialized捕获特定示例,函数/方法
NSArray
非常不喜欢将nil
对象作为其构造函数的一部分传递:
UIView *aView;
UIView *aSecondView = [[UIView alloc] init];
NSArray *array = @[aView, aSecondView];
将在创建数组时在运行时引发异常
clang
是否有任何工具可以尝试检测这种错误?对于一些琐碎的情况(如上面的一个:从未分配给的堆栈局部变量),这似乎是静态分析器会遇到的问题;DR:-Wuninitialized
捕获特定示例,函数/方法的参数的\uuuuuuu属性((非空))
通常有助于捕获作为参数的nil
对于此特定示例(未具体初始化的变量),您可以使用-Wuninitialized
捕捉这些用法:
○ xcrun clang a.m -F/System/Library/Frameworks -c -o a.o -Wuninitialized
a.m:6:22: warning: variable 'aView' is uninitialized when used here [-Wuninitialized]
NSArray *array = @[aView, aSecondView];
^~~~~
a.m:4:16: note: initialize the variable 'aView' to silence this warning
NSView *aView;// = nil;
^
= nil
1 warning generated.
对于将nullptr
/NULL
/nil
传递给函数/方法,\uuuuuu属性((非NULL))
应适用于大多数情况。由于这是苹果提供的API,您需要提交一个雷达文件,并希望他们添加它
p.S:实际上,\uuuu属性(非空))
在这种情况下不会“简单工作”(例如,如果您将aView
初始化为nil
。@[…]
序列似乎正在创建一个数组,并调用+[NSArray arrayWithObjects:count:]
,您可以将第一个参数标记为非空
,但不能标记它所指的内容。在任何情况下,为您提到的分析编写一个铿锵有力的过程应该相对简单。您应该提交一个雷达,因为这样的过程可以避免大量时间损失
p.p.S:似乎\uuuuu属性(非空))
没有传播太多信息,这是令人悲哀的。:-(如果您有一个函数f(类型arg\uu属性(非空)))
然后你将一个变量传递给它,你初始化为nil
,再也没有接触过它,它不会发出警告。我相信你是对的,Clang static analyzer将这个错误排除在外。它内置在Xcode中(我测试的是6 Beta版).Go生成设置>静态分析器-分析策略>将“生成”期间的分析设置为是。要手动执行,请转到产品>分析
静态分析器也可以在命令行中使用。在编译时进行分析的另一个选项是在编译源代码之前在构建阶段添加运行脚本。我没有想到要尝试Xcode 6 beta版,感谢指针!我会再次检查,但上次查看时,Xcode 5中的分析器没有发现这种情况。