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