解释clang静态分析器消息

时间:2009-12-23 02:10:29

标签: objective-c clang-static-analyzer

为什么Clang Static Analyzer(CSA)会输出以下消息:

  

虽然存储到'self'的值是   用于封闭表达式中   从来没有实际读取过的价值   '自我'

以下方法:

- (id)init
{
    return (self = [super initWithStyle:UITableViewStyleGrouped]);
}

代码按预期工作,所以我想知道从技术角度看代码是不正确的,这是CSA中的一个错误,或者我只是遗漏了一些非常明显的错误。

仅供参考,我正在使用此模式,因为我不希望创建此类实例的类能够指定表样式。

2 个答案:

答案 0 :(得分:2)

更“正确”的方法如下:

- (id)init
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    return self;
}

它应该满足静态分析器

修改

我最好猜测为什么Clang不喜欢那条线:

当您编写(self = [super initWithStyle:UITableViewStyleGrouped])时,init调用的结果存储在临时变量中,然后将其复制到self中,然后它就是实际的临时变量从方法中返回。

虽然这是完全合法且正常的行为(并且不会破坏您的应用),但静态分析器(正确)注意到self中存储的值永远不会被实际读取。

为了说明,以下代码:

- (id)init
{
    id temp = [super initWithStyle:UITableViewStyleGrouped];
    self = temp;
    return temp;
}

引发相同的静态分析器错误。

答案 1 :(得分:0)

它告诉你self =部分是不必要的。从“破碎或危险”的意义上说,这并不是错误的,但这是毫无意义的。变量self从未使用过,因此分配它是没有意义的。它可以简单地写成return [super initWithStyle:UITableViewStyleGrouped];而没有任何问题。