【问题标题】:Coverity -- Explicit null dereferenceCoverity——显式空解引用
【发布时间】:2018-04-30 09:33:58
【问题描述】:

我有这样一个场景:

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.***
  }
}

我的代码中只有两个条件,cond1 和 cond2。首先 if 为 cond1 执行,else 为 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.
}

.. 是误报吗?

还有什么?提前谢谢你。

【问题讨论】:

  • 如果cond1 && cond2 == true 怎么办?至少从您显示的代码来看,显然也是为了隐蔽,目前尚不清楚为什么不能发生这种情况。
  • 从显示的代码来看,cond2p/q 的值无关。
  • 旁白——我建议将你的指针初始化为nullptr,然后如果在 cond1 测试中不需要,就不要触摸它们
  • 无法从该代码中判断 cond2 为真是否意味着 q 不为空。
  • @HemantBhargava - 您可能知道,但您向我们展示的代码并不能确保这一点。 Coverity 会倾向于解释你的代码,而不是读懂你的想法。

标签: c++ coverity


【解决方案1】:

从逻辑上讲,根据您所说的,并假设 code1code2 是互斥的,这是误报。但是,警告是有价值的,因为它指出 [sic] 指出 q 的安全性从您的函数逻辑中并不明显。

我至少会在if (code2) 中添加一个assert(q),但是:

  1. 断言通常只在调试时应用(最近有人提醒我,发布版本中的运行时崩溃毫无意义 - 毕竟,我到处都有断言安全性,对吧?)
  2. 可能仍然不足以满足 Coverity。

理想情况下,您会坚持使用if/else 并将所有逻辑都放在那里。中间执行的通用逻辑?将其分离为您可以调用的不同函数。

这样做的额外好处是您可能不再需要pq,因此整个函数变得更加精简。

如果code1code2 可能都为真,那么你确实有一个严重的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多