メインコンテンツ

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

CERT C: Rec.ARR02-C

Explicitly specify array bounds, even if implicitly defined by an initializer

説明

ルール定義

初期化子が暗黙的に定義されている場合でも、配列範囲を明示的に指定します。1

Polyspace 実装

ルール チェッカーは、"配列の初期化が不適切です" をチェックします。

すべて展開する

問題

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して逆のトレースを行い、これまでの関連するイベントを確認できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈も参照してください。

以下の修正例を参照してください。

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

例 - 中かっこの配置が正しくない (C のみ)


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

この例では、配列 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
};               //Noncompliant

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

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

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

int arr[5]
= {
    [0] = 1,
    [1] = 2,      
    [2] = 3,
    [3] = 4,
    [4] = 5
};              
例 - 要素を 2 回初期化
int arr[5]
= {
    [0] = 1,
    [1] = 2,      
    [2] = 3,
    [2] = 4, //Noncompliant
    [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
    };               //Noncompliant

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

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

1 つの修正方法として、配列の初期化に指定された初期化子のみを使用し、配列のサイズを明示的に指定することができます。

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

チェック情報

グループ: Rec.06.配列 (ARR)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.