CXX.STDLIB.ILLEGAL_WRITE

CXX.STDLIB.ILLEGAL_WRITE チェッカーは、getenv()、setlocale()、localeconv()、asctime()、または strerror() によって返されたポインターが constant 修飾ポインターでない場合に、欠陥を報告します。

脆弱性とリスク

上記の関数の呼び出しによってポイントされたオブジェクトがプログラムによって変更されると、未定義の動作が発生する可能性があります。制約違反がないため、コンパイラはこの指摘を報告しません。

軽減と防止

getenv()、setlocale()、localeconv()、asctime()、または strerror() によって返されたポインターを、constant 修飾ポインターに割り当てる必要があります。constant 修飾ポインターに割り当てられたポインターをコードが変更しようとする場合、コンパイラまたは解析ツールが指摘を報告します。

脆弱コード例

コピー
  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  */
  }

この例では、コードは返されたポインターを const 修飾ポインターに割り当てていません。

修正コード例

コピー
  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() を呼び出すことで返されたポインターは、const 修飾ポインターに割り当てられます。strcpy() の 2 番目のパラメーターは定数 char * を受け取ります。

関連チェッカー

  • MISRA.STDLIB.ILLEGAL_WRITE.2012_AMD1