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