您的位置:首页 > Web前端

静态分析中”Potential null dereference”的处理

2015-08-26 09:02 766 查看

我们在写一个方法时,如果希望在方法执行出错时,获取一个NSError对象,我们通常会像下面这样来定义我们的方法

+ (NSString )checkStringLength:(NSString *)str error:(NSError **)error {
  if (str.length <= 0) {
          *error = [NSError errorWithDomain:@"ErrorDomain" code:-1 userInfo:nil];
      return nil;
  }
  return str;
}
这段代码看着没啥问题,至少在语法上是OK的,所以在编译时,编译器并不会报任何警告。
如果我们用以下方式去调用的话,也是一切正常的:
NSError *error = nil;
[Test checkStringLength:@"" error:&error];
不过我们如果就静态分析器来分析一下,发现会在”*error = …“这行代码处报如下的警告:
Potential null dereference. According to coding standards in ‘Creating and Returning NSError Objects’ the parameter may be null
这句话告诉我们的是这里可能存在空引用。实际上,如果我们像下面这样调用方法的话,程序是会崩溃的:
[Test checkStringLength:@"" error:NULL];
因为此时在方法中,error实际上是NULL,*error这货啥也不是,对它赋值肯定就出错了。
这里正确的姿式是在使用error之前,先判断它是否为NULL,完整的代码如下:
+ (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;
}
实际上,对此这种方式的传值,我们始终需要去做非空判断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: