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