メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

配列の初期化が不適切です

初期化子を使用した場合の配列の初期化が正しくない

説明

この欠陥は、初期化子を使用した配列の初期化が Polyspace® Bug Finder™ によって正しくないとみなされた場合に発生します。

この欠陥は、通常の初期化子と指示付きの初期化子に適用されます。C99 で指示付きの初期化子を用いると、配列初期化子の要素を任意の順序で配置でき、また、一部の配列要素を暗黙的に初期化できます。指示付きの初期化子は、配列インデックスを使用して、配列要素と配列初期化子要素間の対応関係を確立します。たとえば、ステートメント int arr[6] = { [4] = 29, [2] = 15 }int arr[6] = { 0, 0, 15, 0, 29, 0 } と等価です。

以下のいずれかの形で、初期化子が正しく使用されていない可能性があります。

問題リスク考えられる解決方法

1 次元配列に対する初期化子で、要素数が配列のサイズより多い。

未使用の配列初期化子要素は、コーディング エラーの可能性を示している。

配列サイズを大きくするか、余分な要素を削除する。

初期化子の値を囲む中かっこの位置が正しくない。

中かっこの配置が正しくないため、使用されない配列初期化子要素がある。

未使用の配列初期化子要素は、コーディング エラーの可能性を示している。

中かっこを正しく配置する。

指示付きの初期化子で、配列の最初の要素が明示的に初期化されていない。

配列の最初の要素の暗黙的な初期化は、コーディング エラーの可能性を示している。配列のインデックスが 0 から始まるという事実を見落としている可能性がある。

すべての要素を明示的に初期化する。

指示付きの初期化子で、1 つの要素を 2 回初期化している。

最初の初期化がオーバーライドされる。

冗長な最初の初期化は、コーディング エラーの可能性を示している。

冗長な初期化を削除する。

指示付きの初期化子と指示なしの初期化子を、同じ初期化で使用している。

本人または他の検証者は、検査によって配列のサイズを判定できない。

指示付きの初期化子か指示なしの初期化子のいずれかを使用する。

修正方法

修正方法は欠陥の根本原因によって異なります。上の表に記載されている修正と以下の修正付きのコード例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する


int arr[2][3]
= {{1, 2},
    {3, 4},
    {5, 6}
};

この例では、配列 arr{1,2,0,3,4,0} として初期化されます。初期化子に {5,6} が含まれているため、配列は初期化されて {1,2,3,4,5,6} になると想定されていた可能性があります。

修正 — 中かっこを正しく配置

1 つの修正方法として、中かっこを正しく配置し、すべての要素が明示的に初期化されるようにします。

int a1[2][3]
= {{1, 2, 3},
    {4, 5, 6}
};
int arr[5]
= {
    [1] = 2,      
    [2] = 3,
    [3] = 4,
    [4] = 5
};              

この例では、arr[0] が明示的に初期化されていません。配列のインデックスが 0 から始まるということを、プログラマが考慮しなかった可能性があります。

修正 — すべての要素を明示的に初期化

1 つの修正方法として、すべての要素を明示的に初期化します。

int arr[5]
= {
    [0] = 1,
    [1] = 2,      
    [2] = 3,
    [3] = 4,
    [4] = 5
};              
int arr[5]
= {
    [0] = 1,
    [1] = 2,      
    [2] = 3,
    [2] = 4,
    [4] = 5
};              

この例では、arr[2] が 2 回初期化されています。最初の初期化がオーバーライドされる。この場合、arr[3] が明示的に初期化されていないことから、プログラマは arr[2] の 2 回目の初期化に際して arr[3] を初期化するつもりであった可能性があります。

修正 — 冗長な初期化を修正

1 つの修正方法として、冗長な初期化を排除します。

int arr[5]
= {
    [0] = 1,
    [1] = 2,
    [2] = 3,
    [3] = 4,
    [4] = 5
};
int arr[]
= {
    [0] = 1,
    [3] = 3,
    4,
    [5] = 5,
    6
    };              

この例では、指示付きの初期化子と指示なしの初期化子を混ぜて使用しているため、検査では arr のサイズが判定しにくくなっています。

修正 — 指示付きの初期化子のみを使用

1 つの修正方法として、配列の初期化に指示付きの初期化子のみを使用します。

int arr[]
= {
    [0] = 1,
    [3] = 3,
    [4] = 4,
    [5] = 5,
    [6] = 6
};              

結果情報

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

バージョン履歴

R2015b で導入