我们在写一个方法时,如果希望在方法执行出错时,获取一个NSError对象,我们通常会像下面这样来定义我们的方法
1 2 3 4 5 6 7 |
+ (NSString )checkStringLength:(NSString *)str error:(NSError **)error {
if
(str.length <= 0) {
*error = [NSError errorWithDomain:@
"ErrorDomain"
code:-1 userInfo:nil];
return
nil;
}
return
str;
}
|
这段代码看着没啥问题,至少在语法上是OK的,所以在编译时,编译器并不会报任何警告。
如果我们用以下方式去调用的话,也是一切正常的:
1 2 |
NSError *error = nil;
[Test checkStringLength:@
""
error:&error];
|
不过我们如果就静态分析器来分析一下,发现会在”*error = …“这行代码处报如下的警告:
1 |
Potential
null
dereference. According to coding standards
in
‘Creating and Returning NSError Objects’ the parameter may be
null
|
这句话告诉我们的是这里可能存在空引用。实际上,如果我们像下面这样调用方法的话,程序是会崩溃的:
1 |
[Test checkStringLength:@
""
error:NULL];
|
因为此时在方法中,error实际上是NULL,*error这货啥也不是,对它赋值肯定就出错了。
这里正确的姿式是在使用error之前,先判断它是否为NULL,完整的代码如下:
1 2 3 4 5 6 7 8 9 |
+ (NSString )checkStringLength:(NSString *)str error:(NSError **)error {
if
(str.length <= 0) {
if
(error != NULL) {
*error = [NSError errorWithDomain:@
"ErrorDomain"
code:-1 userInfo:nil];
}
return
nil;
}
return
str;
}
|
实际上,对此这种方式的传值,我们始终需要去做非空判断。
更多推荐
静态分析中”Potential null dereference”的处理
发布评论