Coverity - 显式null取消引用

时间:2018-04-30 09:33:58

标签: c++ coverity

我有这样的场景:

int main() {
  int *p;
  int *q;
  bool cond1, cond2;

  // Does some processing and sets the cond1 and cond2

  if (cond1) {
     p = // Assign valid address
     q = NULL;
  } else {
     p = NULL;
     q = // Assign valid address
  }

  // Does something else but cond1 and cond2 remains untouched  

  if (cond2) {
    ***// Using 'q' data members.***
  }
}

我的代码中只有两个condidtions,cond1和cond2。首先,如果执行cond1,则执行cond2 ..一次只能有一个为真。我用粗体/斜体代码看到了覆盖缺陷。 Coverity抱怨以下消息:

CID 25469 (#1 of 1): Explicit null dereferenced (FORWARD_NULL)
9. var_deref_op: Dereferencing null pointer q.

我不明白为什么掩护在这里抱怨。在这种情况下,到时候,我进入'cond2',我已经设置了'q'。对?那是什么我不明白?

我建议的解决方案:

..如果我写这样的话就可以了!cond1就像这样:

if (!cond1) {
  // Using 'q' data members.
}

..如果我添加额外的支票会没问题:

if (cond2 && q != NULL) {
  // Using 'q' data members.
}

..这是假阳性吗?

还有别的吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

逻辑上,根据您所说的内容,并假设code1code2是互斥的,这是误报。但是,警告具有价值,因为它指向 [sic] q的安全性在你的函数逻辑中并不是显而易见的。

我至少会在assert(q)内加if (code2),但是:

  1. 断言通常只适用于调试时(因为我最近在发布版本中提醒运行时崩溃没有任何意义 - 毕竟,我到处都有断言安全,对吗?)
  2. 满足Coverity可能还不够。
  3. 理想情况下,你会坚持使用那个if / else并将所有逻辑放在那里。在中间执行的常见逻辑?将其分成可以调用的其他功能。

    这样做的另一个好处是,您可能不再需要pq,因此整个功能变得更加精益。

    如果code1code2可能都属实,那么你确实存在重大错误。