确保字符串以空字符结尾
13.3 ID_improperNullTermination
语言要求字符串以空字符结尾,程序应保证有足够的内存空间安置空字符,否则会破坏程序基本的执行机制,造成严重问题。
空字符指 '\0'、L'\0'、u'\0'、U'\0',分别对应 char*、wchar_t*、char16_t*、char32_t* 等字符串类型。
示例:
void foo(const char* p) {
char a[4];
strncpy(a, p, sizeof(a));
printf("%s\n", strupr(a)); // To upper case and print, dangerous
}
例示代码将字符串复制到数组中,转为大写并打印,然而如果 p 所指字符串的长度超过 3,strncpy 不会在数组的结尾安置空字符 '\0',导致 strupr 内存访问越界,程序可能会崩溃,也可能打印出本该隐藏的敏感数据。
应改为:
void foo(const char* p) {
char a[4] = ""; // Initialize all to '\0'
strncpy(a, p, sizeof(a));
if (a[3] == '\0') {
printf("%s\n", strupr(a)); // OK
} else {
.... // Handle string length exceptions
}
}
将所有数组元素初始化为 '\0',调用 strncpy 后如果数组最后一个元素是 '\0',说明输入字符串的长度符合要求,否则可作出相应的异常处理。
相关
依据
ISO/IEC 9899:1999 7.21.2.4
ISO/IEC 9899:2011 7.24.2.4