NPD.GEN.MIGHT
分配的空指针常数值可能被取消引用
尝试使用空指针访问数据将导致运行时错误。当程序取消引用某个预期为有效但结果为空值的指针,就会发生空指针取消引用。发生空指针取消引用缺陷通常是由于错误处理或争用情况无效,而且往往会导致程序异常中止。在 C/C++ 代码中对指针取消引用之前,必须对其进行检查以确认它不为空值。
NPD 检查器会查找那些对空指针或可能为空的指针进行取消引用的实例。
NPD.GEN.MIGHT 检查器会标记出那些在本地被分配了空常数值的指针,之后可能被明确取消引用,或被传递给某个不进行空值检查就可能对其取消引用的函数的情况。
漏洞与风险
空指针取消引用通常会导致进程失败。这些问题通常是因为无效的异常处理而发生的。
缓解与预防
要避免该漏洞:
- 对所有将返回值的函数进行空值检查
- 确保所有外部输入都经过验证
- 明确初始化变量
- 确保对不同寻常的异常进行正确处理
漏洞代码示例
复制
void xstrcpy(char *dst, char *src) {
if (!src) return;
dst[0] = src[0];
}
char global_buf[256];
void npd_gen_might(int flag, char *arg) {
char *p = global_buf;
if (flag) p = NULL;
if (arg) { p = arg; }
xstrcpy(p, "Hello");
}
Klocwork 针对第 3 行生成问题报告,表明被取消引用的指针 dst 可能为空。在条件 flag 为真的情况下分配给 p 的空常数可能被传递给函数 xstrcpy,并在此被取消引用。因此,NPD.GEN.MIGHT 检查器发现代码对一个可能等于空值的指针进行了取消引用。在本示例中,报告了 MIGHT 问题而非 MUST 问题,因为如果条件 arg 为 true,p 的值可能变化。该类型漏洞会产生无法预料的意外结果。
修正代码示例
复制
void xstrcpy(char *dst, char *src) {
if (!src) return;
if (!dst) return;
dst[0] = src[0];
}
char global_buf[256];
void npd_gen_might(int flag, char *arg) {
char *p = global_buf;
if (flag) p = NULL;
if (arg) { p = arg; }
xstrcpy(p, "Hello");
}
在此修正代码示例中,如果指针 dst 为空,函数 xstrcpy 将在第 3 行返回,这将防止在第 4 行取消引用可能存在的空指针。
相关检查器
外部指导
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。