字符串复制中可能错误的缓冲区大小¶
ID: cpp/bad-strncpy-size
Kind: problem
Security severity: 9.3
Severity: warning
Precision: medium
Tags:
- reliability
- correctness
- security
- external/cwe/cwe-676
- external/cwe/cwe-119
- external/cwe/cwe-251
Query suites:
- cpp-security-extended.qls
- cpp-security-and-quality.qls
标准库函数 strncpy
将源字符串复制到目标缓冲区。第三个参数定义要复制的最大字符数,并且应该小于或等于目标缓冲区的大小。形式为 strncpy(dest, src, strlen(src))
或 strncpy(dest, src, sizeof(src))
的调用错误地将第三个参数设置为源缓冲区的大小。执行此类型的调用可能会导致缓冲区溢出。缓冲区溢出可能导致从段错误到安全漏洞的各种问题。
建议¶
仔细检查突出显示的函数调用,并确保大小参数是从目标缓冲区的大小而不是源缓冲区的大小得出的。
示例¶
在以下示例中,源缓冲区的大小被错误地用作 strncpy
的参数
char src[256];
char dest1[128];
...
strncpy(dest1, src, sizeof(src)); // wrong: size of dest should be used
char *dest2 = (char *)malloc(sz1 + sz2 + sz3);
strncpy(dest2, src, strlen(src)); // wrong: size of dest should be used
更正后的版本使用目标缓冲区的大小或包含目标缓冲区大小的变量作为 strncpy
的大小参数
char src[256];
char dest1[128];
...
strncpy(dest1, src, sizeof(dest1)); // correct
size_t destSize = sz1 + sz2 + sz3;
char *dest2 = (char *)malloc(destSize);
strncpy(dest2, src, destSize); // correct