NPD.CHECK.MUST
之前检查过的空指针被取消引用
尝试使用空指针访问数据将导致运行时错误。当程序取消引用某个预期为有效但结果为空值的指针,就会发生空指针取消引用。发生空指针取消引用缺陷通常是由于错误处理或争用情况无效,而且往往会导致程序异常中止。在 C/C++ 代码中对指针取消引用之前,必须对其进行检查以确认它不为空值。
NPD 检查器会查找那些对空指针或可能为空的指针进行取消引用的实例。
NPD.CHECK.MUST 检查器会标记那些经空值检查的指针在之后被明确取消引用,或通过不进行空值检查的函数调用来取消引用的情况。
漏洞与风险
空指针取消引用通常会导致进程失败。这些问题通常是因为无效的异常处理而发生的。
缓解与预防
要避免该漏洞:
- 对所有将返回值的函数进行空值检查
- 确保所有外部输入都经过验证
- 明确初始化变量
- 确保对不同寻常的异常进行正确处理
漏洞代码示例
复制
void npd_check_must() {
char *p = getSomeValue();
if (p != NULL) { }
p[0] = 0;
}
虽然在第 3 行对 *p 进行了空值检查,但在第 4 行在没有进行空值检查的情况下对其显式取消引用。(本示例让缺陷明显暴露出来,但在更为典型的应用程序代码中,很难发现此类取消引用。)该类型漏洞会产生无法预料的意外结果。
修正代码示例
复制
void npd_check_must() {
char *p = getSomeValue();
if (p != NULL) {p[0] = 0;}
}
在经修复的版本中,取消引用取决于空值检查。
相关检查器
外部指导
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。