CERT.STR.ASSIGN.CONST_TO_NONCONST

const char ポインターを非 const char ポインターに代入しないでください。

脆弱性とリスク

文字列リテラルは、コンパイル時に、十分な長さを持ち、かつ null で終了するように作成されます。文字列リテラルのどの部分であっても、プログラムによって変更が試みられると、動作は不定になります。理想的には、それらを const char または const whar_t のポインター (または配列) にのみ代入することが望まれます。

このチェッカーは、非 const ポインターへの文字列リテラルまたは const 文字列ポインターの代入を探します。

このチェッカーは、最初のパラメーターが定数または文字列リテラルの場合、返されるポインターを strpbrk()、strchr()、strrchr()、strstr()、wcspbrk()、wcschr()、wcsrchr()、wcsstr()、memchr()、wmemchr() の呼び出しの定数としても扱います。

軽減と防止

ポインターによって文字列が変更されてはならない場合、ポインター宣言で "const" を使用してください。

コピー
  const char *get_dirname_v1(const char *pathname) {
    char *str = "string literal";
    str[0] = 'S';
    char *slash;
    slash = strrchr(pathname, '/');
    if (slash) {
      *slash = '\0'; /* 定義されていない動作 */
    }
    return pathname;
  }

2 行目と 5 行目で違反が報告されます。