可疑的“sizeof”使用¶
ID: cpp/suspicious-sizeof
Kind: problem
Security severity: 8.8
Severity: warning
Precision: medium
Tags:
- reliability
- correctness
- security
- external/cwe/cwe-467
Query suites:
- cpp-security-extended.qls
- cpp-security-and-quality.qls
此规则查找对数组类型函数参数获取大小的表达式。在 C 中,数组类型函数参数被视为具有相应指针类型,因此它们的大小始终是指针类型的大小(通常是 4 或 8)。特别地,不能以这种方式确定作为参数传递的内存缓冲区的大小。如果开发人员打算获取数组的大小而不是指针的大小,则对指针类型使用 sizeof
运算符会导致意外结果。
建议¶
修改函数以接收一个额外的参数来指示缓冲区大小。
示例¶
void f(char s[]) {
int size = sizeof(s); //wrong: s is now a char*, not an array.
//sizeof(s) will evaluate to sizeof(char *)
}
参考资料¶
Comp.lang.c,常见问题解答:问题 6.3:那么 C 中的“指针和数组等价”是什么意思?.
通用弱点枚举:CWE-467.