没有空间用于零终止符¶
ID: cpp/no-space-for-terminator
Kind: problem
Security severity: 9.8
Severity: error
Precision: high
Tags:
- reliability
- security
- external/cwe/cwe-131
- external/cwe/cwe-120
- external/cwe/cwe-122
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
此规则识别对 malloc
的调用,这些调用会调用 strlen
来确定所需的缓冲区大小,但不会为零终止符分配空间。
建议¶
突出显示的代码段创建了一个缓冲区,但未确保其足够大以容纳复制的数据。这使得代码容易受到缓冲区溢出攻击,这会导致从程序崩溃到恶意代码执行的任何后果。
将分配的缓冲区大小增加 1,或将 malloc
、strcpy
对替换为对 strdup
的调用。
示例¶
void flawed_strdup(const char *input)
{
char *copy;
/* Fail to allocate space for terminating '\0' */
copy = (char *)malloc(strlen(input));
strcpy(copy, input);
return copy;
}
参考资料¶
CERT C 编码标准:MEM35-C. 为对象分配足够的内存。
常见弱点枚举:CWE-131。
常见弱点枚举:CWE-120。
常见弱点枚举:CWE-122。