2

运行 XCode 4.6 的分析器和新的 clang 编译器,我看到很多警告

被调用的 C++ 对象指针为空

即使对于像这样的受保护的表达

- (BOOL) validate: (Node*) node
{
    if (!self.hypertext) return YES;
    return self.hypertext->HasNode(node);
}

1)我怎样才能让静态分析仪相信这是得到妥善保护的?2) 在某些情况下,我可能想断言指针不会为空。如何?

4

2 回答 2

6

这里的问题是您没有使用指针,而是使用 ObjC 调用的结果。

虽然不太可能,但分析器会看到以下情况:第一次调用返回的指针不为空,因此测试通过,第二次调用返回的指针为空。

您应该能够使用局部变量来解决问题。

- (BOOL) validate: (Node*) node
{
    YourType ht = [self hypertext];
    if (!ht) return YES;
    return ht->HasNode(node);
}
于 2013-02-15T19:06:19.143 回答
1

clang 静态分析器显然支持函数的“非空”属性,用于声明指针不应为空。不过,我不确定是否将其应用于 Obj-C 方法。

int bar(int*p, int q, int *r) __attribute__((nonnull(1,3)));

http://clang-analyzer.llvm.org/annotations.html#attr_nonnull

于 2013-02-08T19:41:28.093 回答