可疑的 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
表达式 &foo->bar
获取 foo
的成员 bar
的地址,即 foo
的地址加上 bar
成员的偏移量。如果该偏移量不为零,则表达式 &foo->bar
仅当 foo
的地址为负时才等于 NULL
。虽然这种情况并非不可能,但只有在 foo
是一个显式转换为指针的负整数,或者 foo
是一个指向内核模式地址空间的指针时才会发生。由于这两种情况都不太可能发生,因此对 NULL
的检查是可疑的。
建议¶
对 NULL
的检查要么完全是多余的,要么是对错误的事物进行了检查。在前一种情况下,可以将检查替换为布尔值 true
或 false
,然后可以简化周围的上下文。在后一种情况下,请考虑哪些子表达式可能为 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.
}