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