代码之家  ›  专栏  ›  技术社区  ›  Oliver White

解释Clang静态分析器消息

  •  2
  • Oliver White  · 技术社区  · 15 年前

    为什么Clang静态分析仪(CSA)输出以下消息:

    尽管存储到“self”的值是 在封闭表达式中使用, 实际上从未从中读取值 “自我”

    对于以下方法:

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

    代码按预期工作,所以我想知道从技术角度看,代码是否不正确,这是CSA中的一个bug,或者只是缺少一些非常明显的东西。

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   James Eichele Bernard Igiri    15 年前

    一个更“合适”的方法是:

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

    应满足静态分析仪的要求

    编辑:

    我对Clang为什么不喜欢这句话的最佳猜测是:

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

    尽管这是完全合法和正常的行为(并且不会破坏你的应用程序),静态分析器(正确地)注意到存储在 自己 从来没有读过。

    举例来说,以下代码:

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

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

        2
  •  0
  •   Chuck    15 年前

    它告诉你 self = 部分是不必要的。从“破碎或危险”的意义上来说,这并不是不正确的,但在这一点上,这是毫无意义的。变量 self 只是从未使用过,所以没有必要分配给它。它可以简单地写为 return [super initWithStyle:UITableViewStyleGrouped]; 没问题。