メインコンテンツ

string 配列での null 値の欠落

文字列が null 文字で終了していない

説明

この欠陥は、null 文字 '\0' で終了するだけの十分なスペースが文字列にない場合に発生します。

この欠陥は C のプロジェクトのみに当てはまります。

リスク

暗黙的な NULL 終端を仮定せずに文字列を配列にコピーすると、バッファー オーバーフローが発生する可能性があります。

修正方法

文字配列をリテラルで初期化する場合、配列範囲の指定を避けます。

char three[]  = "THREE";
コンパイラが自動的に NULL 終端の領域を割り当てます。前述の例では、コンパイラは 5 つの文字と NULL 終端のために十分な領域を割り当てます。

初期化後に問題が発生した場合、NULL 終端を考慮するために配列のサイズを 1 だけ増やさなければならない場合があります。

特定の状況では、文字列の代わりに文字のシーケンスを使用して文字配列を初期化することが必要な場合があります。この場合、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

void countdown(int i)
{
    static char one[5]   = "ONE";
    static char two[5]   = "TWO";
    static char three[5] = "THREE";
}

文字配列 three のサイズは 5 で、5 つの文字は 'T''H''R''E' および 'E' です。three の大きさは 5 バイトしかないため、最後に null 文字を入れる余地がありません。

修正 — 配列のサイズを増加

1 つの修正方法として、配列のサイズを変更して 5 つの文字と null 文字が入るようにできます。

void countdown(int i)
{
    static char one[5]   = "ONE";
    static char two[5]   = "TWO";
    static char three[6] = "THREE";
}
修正 — 初期化の方法を変更

1 つの修正方法として、配列のサイズを空白にしたままで文字列を初期化することができます。この初期化方法では、5 つの文字と終端の null 文字のために十分なメモリが割り当てられます。

void countdown(int i)
{
    static char one[5]   = "ONE";
    static char two[5]   = "TWO";
    static char three[]  = "THREE";
}

結果情報

グループ: プログラミング
言語: C
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: MISSING_NULL_CHAR
影響度: Low

バージョン履歴

R2013b で導入