RNPD.DEREF

在 NULL 检查前对指针进行可疑的取消引用

尝试使用空指针访问数据将导致运行时错误。当程序取消引用某个预期为有效但结果为空值的指针,就会发生空指针取消引用。发生空指针取消引用缺陷通常是由于错误处理或争用情况无效,而且往往会导致程序异常中止。在 C/C++ 代码中对指针取消引用之前,必须对其进行检查以确认它不为空值。

NPD 检查器会查找那些对空指针或可能为空的指针进行取消引用的实例。

RNPD.DEREF 检查器查找那些在空值检查前就对指针取消引用的实例。当在取消引用和检查之间的轨迹上没有指针变化时,可能是因为指针在取消引用时为空值,或空值检查不正确。

漏洞与风险

空指针取消引用通常会导致进程失败。这些问题通常是因为无效的异常处理而发生的。

在空值检查前取消引用可能导致:

  • 如果指针是空值,则出现运行时错误
  • 如果编写的条件不正确,则导致出现意外的程序结果
  • 如果存在冗余的检查,则生成没有必要的代码

缓解与预防

要避免该漏洞:

  • 对所有将返回值的函数进行空值检查
  • 确保所有外部输入都经过验证
  • 明确初始化变量
  • 确保对不同寻常的异常进行正确处理

漏洞代码示例

复制
  void rnpd_1(int* t, int v) {
      *t = 0;  // t is dereferenced unconditionally
      if (v < 0) v = -v;
      if (t) *t = v;  // t is verified before dereference
  }

在本示例中,代码对 t 取消引用了两次,一次在第 2 行,没有任何验证;一次在第 4 行,以空值检查作为保护。Klocwork 标记了第 4 行,因为在取消引用之后于此行进行了空值检查。当然,如果指针为空值,则应用程序将在第一次取消引用之后就崩溃。

相关检查器

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。