☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

确保字符串以空字符结尾

13.3 ID_improperNullTermination
目录 › next › previous

语言要求字符串以空字符结尾,程序应保证有足够的内存空间安置空字符,否则会破坏程序基本的执行机制,造成严重问题。

空字符指 '\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',说明输入字符串的长度符合要求,否则可作出相应的异常处理。

相关

ID_unsafeStringFunction

依据

ISO/IEC 9899:1999 7.21.2.4 ISO/IEC 9899:2011 7.24.2.4

参考

CWE-170 SEI CERT STR32-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.