メインコンテンツ

MISRA C++:2008 Rule 8-5-2

Braces shall be used to indicate and match the structure in the nonzero initialization of arrays and structures.

説明

ルール定義

配列および構造体の非ゼロによる初期化では、構造を指示して一致させるために中かっこが使用されます。 1

根拠

初期化子リストで入れ子にされた中かっこを使用して、配列、共用体、struct オブジェクトに含まれる入れ子にされたオブジェクトの構造体と一致させると、複雑なデータ型が初期化される順序を考慮するよう促されるため、より読みやすいコードになります。たとえば、ex1 の初期化で入れ子にされた中かっこを使用すると、ex1 に含まれる入れ子にされた配列 arr1 および arr2 がどのように初期化されるのかを確認しやすくなります。

struct Example
{
    int num;
    int arr1[2];
    int arr2[3];
};

//....
struct Example ex1 {1, {2, 3}, {4, 5, 6}}; //Compliant

たとえば次のように、入れ子にされた構造体が含まれる、最上位にある配列、共用体、または struct オブジェクトのゼロ初期化を行う場合、このルールは入れ子にされた中かっこの使用を要件としません。

struct Example ex1 {}; //Compliant

Polyspace 実装

入れ子にされた構造体が含まれる配列、共用体、または struct オブジェクトの非ゼロ初期化を行う場合、入れ子にされた構造体を反映するために入れ子にされた中かっこを使用していなければ、Polyspace® は初期化子リストの最初の入れ子にされた構造体に含まれる最初の要素に対する違反を報告します。たとえば、このコードでは、Polyspace は数値 2 に対する違反を報告します。これが、ex1 に含まれる入れ子にされた構造体 arr1 の最初の要素に対応するためです。

struct Example
{
    int num;
    int arr1[2];
    int arr2[3];
};

//....
struct Example ex1 {1, 2, 3, 4, 5, 6}; // Noncompliant

Polyspace は、標準テンプレート ライブラリ (STL) によって実装されたコンテナーに対し、このルールの違反を報告しません。

配列または構造体をゼロ初期化する場合は、最初の要素のみをゼロまたは NULL に初期化します。配列またはstruct オブジェクトを部分的に非ゼロの値に初期化し、オブジェクトのそれ以外の部分については暗黙的なゼロ初期化に依存した場合、違反が発生します。たとえば、このコードでは部分的な初期化が違反として報告されます。

int16_t array[5] = {1,2,3}; //Noncompliant
int8_t map[2][2] = {{},{1,1}}; //Noncompliant

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

char arr1[2][3] {'a', 'b', 'c', 'd', 'e', 'f'}; //Noncompliant
char arr2[2][3] {{'a', 'b', 'c'}, {'d', 'e', 'f'}}; //Compliant
char arr_top_level[2][3] { }; //Compliant
char arr_sub_level[2][3] { {}, {'d', 'e', 'f'}}; //Noncompliant

この例では、2 次元配列 arr1 の初期化子リストが、この配列の入れ子にされた構造 (それぞれ 3 つの要素からなる 2 つの配列) を反映していません。したがって、この 2 次元配列の初期子リストは、このルールに違反しています。arr2 の初期化は、入れ子にされた中かっこを使用して配列の入れ子にされた構造を反映しているため、準拠しています。同様に、arr_top_level の初期化は、入れ子にされた構造の最上位にある配列のゼロ初期化を行うため、準拠しています。arr_sub_level の初期化は、配列の最初の部分のみをゼロ初期化する一方、配列の 2 番目の部分の要素はすべて明示的に初期化するため、このルールに違反します。

チェック情報

グループ: Declarators
カテゴリ: 必要

バージョン履歴

R2013b で導入

すべて展開する


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.