指向常量字符串的指针应使用 const 声明
6.2.6 ID_constStrToNonConstPtr
常量字符串与非常量字符串指针的隐式转换是不安全的,一旦相关内存被修改会导致标准未定义的行为,这种转换在 C++ 标准中是过时的,在 C 代码中也不应出现。
指向常量字符串的指针应声明为 const chartype *,chartype 为常量字符串中的字符类型,如:
char、wchar_t、char16_t、char32_t
示例:
char* p = "...."; // Non-compliant
p[x] = '\0'; // Undefined behavior
例中非常量指针 p 指向常量字符串,通过 p 修改常量数据一般会引发“段错误”而导致崩溃,应改为:
const char* p = "...."; // Compliant
p[x] = '\0'; // Compile-time protected
改为常量字符串指针后,错误的操作无法通过编译。
又如:
void foo(char*);
void bar() {
foo("...."); // Non-compliant
}
应将 foo 的参数类型改为 const char*,或将常量字符串复制后传给 foo 函数。
相关
依据
ISO/IEC 9899:1999 6.4.5(6)-undefined
ISO/IEC 9899:2011 6.4.5(7)-undefined
ISO/IEC 14882:1998 D.4(1)-deprecated
ISO/IEC 14882:2003 2.13.4(2)-undefined
ISO/IEC 14882:2003 D.4(1)-deprecated
ISO/IEC 14882:2011 2.14.5(12)-undefined
ISO/IEC 14882:2017 5.13.5(16)-undefined
参考
MISRA C 2012 7.4
SEI CERT STR30-C