我有这样的场景:
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.
}
..这是假阳性吗?
还有别的吗?提前谢谢。
答案 0 :(得分:0)
逻辑上,根据您所说的内容,并假设code1
和code2
是互斥的,这是误报。但是,警告具有价值,因为它指向 [sic] ,q
的安全性在你的函数逻辑中并不是显而易见的。
我至少会在assert(q)
内加if (code2)
,但是:
理想情况下,你会坚持使用那个if
/ else
并将所有逻辑放在那里。在中间执行的常见逻辑?将其分成可以调用的其他功能。
这样做的另一个好处是,您可能不再需要p
和q
,因此整个功能变得更加精益。
如果code1
和code2
可能都属实,那么你确实存在重大错误。