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 行目で違反が報告されます。