CodeQL 文档

可疑的 NULL 检查

ID: cpp/dubious-null-check
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - reliability
   - readability
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

表达式 &foo->bar 获取 foo 的成员 bar 的地址,即 foo 的地址加上 bar 成员的偏移量。如果该偏移量不为零,则表达式 &foo->bar 仅当 foo 的地址为负时才等于 NULL。虽然这种情况并非不可能,但只有在 foo 是一个显式转换为指针的负整数,或者 foo 是一个指向内核模式地址空间的指针时才会发生。由于这两种情况都不太可能发生,因此对 NULL 的检查是可疑的。

建议

NULL 的检查要么完全是多余的,要么是对错误的事物进行了检查。在前一种情况下,可以将检查替换为布尔值 truefalse,然后可以简化周围的上下文。在后一种情况下,请考虑哪些子表达式可能为 NULL,并对其进行测试。特别地,只需删除取地址符可能就可以得到一个更合适的表达式进行测试。

示例

struct person {
  int id;
  char* name;
};

bool hasName(person* p) {
  return  p       != NULL  // This check is sensible,
      &&  p->name != NULL  // as is this one.
      && &p->name != NULL; // But this check is dubious.
}
  • ©GitHub, Inc.
  • 条款
  • 隐私