CXX.STDLIB.ILLEGAL_WRITE
当 getenv()、setlocale()、localeconv()、asctime() 或 strerror() 返回的指针不是常量限定指针时,CXX.STDLIB.ILLEGAL_WRITE 检查器会报告缺陷。
漏洞与风险
当对以上函数的调用所指向的对象被程序修改时,可能会导致未定义的行为。因为没有违反约束,所以编译器不会报告此问题。
缓解与预防
应该将 getenv()、setlocale()、localeconv()、asctime() 或 strerror() 返回的指针赋值给常量限定指针。如果代码尝试修改被赋值给常量限定指针的指针,那么编译器或者分析工具会报告问题。
漏洞代码示例
复制
void f()
{
char *s = setlocale( LC_ALL, 0 ); /* Non-compliant */
struct lconv *t = localeconv(); /* Non-compliant */
s[1] = 'A'; /* Undefined Behavior */
t->decimal_point = "^"; /* Undefined Behavior */
}
在此示例中,代码不会将返回的指针赋值给常量限定指针。
修正代码示例
复制
void f()
{
char s [64];
char *t = setlocale( LC_ALL, 0 );
(void) strcpy( s, t ); /* Compliant */
(void) strcpy( s, setlocale( LC_ALL, 0 ) ); /* Compliant */
}
在此修正代码示例中,通过调用 setlocale() 而返回的指针被赋值给常量限定指针。strcpy() 的第二个参数取常量字符 *。
相关检查器
- MISRA.STDLIB.ILLEGAL_WRITE.2012_AMD1