Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何编译时检查传递给NSArray构造函数的nil对象_Objective C_Cocoa Touch_Clang_Clang Static Analyzer - Fatal编程技术网

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中的分析器没有发现这种情况。