为XCode 4.6和新的clang编译器运行分析器,我发出警告
被调用的C ++对象指针为空
即使是像
这样的守卫表达- (BOOL) validate: (Node*) node
{
if (!self.hypertext) return YES;
return self.hypertext->HasNode(node);
}
1)我怎样才能说服静态分析仪对它进行了适当的保护? 2)在某些情况下,我可能希望断言指针不为空。怎么样?
答案 0 :(得分:6)
这里的问题是你没有使用指针但是使用了ObjC调用的结果。
虽然不太可能,分析器会看到以下情况:第一次调用中返回的指针不为空,因此测试通过,第二次调用返回的指针为空。
您应该能够使用局部变量解决问题。
- (BOOL) validate: (Node*) node
{
YourType ht = [self hypertext];
if (!ht) return YES;
return ht->HasNode(node);
}
答案 1 :(得分:1)
clang静态分析器显然支持函数的'nonnull'属性,用于声明指针不应为null。我不确定是否将其应用于Obj-C方法。
int bar(int*p, int q, int *r) __attribute__((nonnull(1,3)));
http://clang-analyzer.llvm.org/annotations.html#attr_nonnull