掩护 - 明确的无效解雇
Coverity -- Explicit null dereference
我有这样的场景:
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中只有两个凝结。首先,如果执行cond1,否则执行cond2。我看到具有粗体/斜体代码的覆盖性缺陷。封面抱怨以下消息:
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.
}
..是假阳性吗?
还有什么吗?预先感谢您。
从逻辑上讲,基于您所说的话,并且假设code1
和code2
是相互排斥的,这是一个假阳性。但是,警告具有值,因为它指向 [sic] q
的安全性在您函数的逻辑上并不明显。
我至少会在if (code2)
中放置一个assert(q)
,但是:
- 断言通常仅适用于调试时间(因为最近我想起了发行版的运行时崩溃,这毫无意义地;毕竟,我到处都有断言安全,对吗?(
- 这可能仍然不足以满足掩护。
理想情况下,您会坚持使用一个if
/else
,然后将所有逻辑放入其中。在中间执行的常见逻辑?将其分成可以调用的其他功能。
添加的好处是您可能不再需要p
和q
,因此整个功能变得更加精简。
如果code1
和code2
都可能是正确的,那么您确实有一个很大的错误。
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 数组下标的类型"float*[float]"无效
- 掩护 - 明确的无效解雇