メインコンテンツ

AUTOSAR C++14 Rule A8-5-2

Braced-initialization {}, without equals sign, shall be used for variable initialization

説明

ルール定義

変数の初期化では、等号のない中かっこ {} による初期化を使用するものとします。

根拠

中かっこによる初期化:

classType Object{arg1, arg2, ...};
これは、他の形式の初期化に比べてあいまいさがありません。中かっこによる初期化には次のような利点があります。

  • double から float への変換などの暗黙的な狭い型への変換を防ぐことが可能。

  • 最も厄介な解析の問題につながるあいまいな構文の回避が可能。

    たとえば、次の宣言を考えます。

    ResourceType aResource();
    aResourceResourceType 型の変数を返す関数なのか、ResourceType 型のオブジェクトなのか、すぐには理解できません。

    詳細は、不明瞭な宣言の構文を参照してください。

このルールは初期化での = 記号の使用も禁止しています。= 記号は、実際には呼び出されていない状況でも代入またはコピー コンストラクターが呼び出されている印象を与える可能性があるためです。

Polyspace 実装

一般的に、チェッカーは次のような形式を使用したデータ型 Type のオブジェクト obj1 の初期化にフラグを設定します。

  • Type obj1 = obj2;
  • Type obj1(obj2);

チェッカーは、次のようなケースの例外を許容します。

  • 定数、変数、ラムダ式、標準初期化子リスト、または関数呼び出しへの単純な代入を使用した auto 型の変数の初期化。

  • 単純な代入を使用した参照型の初期化

  • Type a() の形式を使用したグローバル スコープの宣言。ここで、Type は既定のコンストラクターを使用したクラス型です。解析では、aType 型を返す関数として解釈されます。

  • OpenMP 並列 for ループ内、つまり、#pragma omp parallel for の直後の for ループ ステートメント内のループ変数の初期化

チェッカーは、C++11 以降の C++ バージョンを指定した場合にのみ有効になります。C++ 標準バージョン (-cpp-version) を参照してください。

トラブルシューティング

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

すべて展開する

class ResourceType {
      int memberOne;
      int memberTwo;
    public:
      ResourceType() {memberOne = 0; memberTwo = 0;}
      ResourceType(int m, int n) {memberOne = m; memberTwo = n;}
      ResourceType(ResourceType &anotherResource) {
          memberOne = anotherResource.memberTwo;
          memberTwo = anotherResource.memberOne;
      }
};

void func() {
    ResourceType aResourceOne(); //Noncompliant
    ResourceType aResourceTwo(1, 2); //Noncompliant
    ResourceType aResourceThree = {1,2};   //Noncompliant
     
    ResourceType aResourceFour{1,2}; //Compliant

}

この例で、関数 funcResourceType 型の 4 つのオブジェクトを宣言しています。aResourceFour の宣言のみが、このルールに違反しません。

aResourceOneaResourceTwo、および aResourceThree の宣言はルールに違反しています。特に以下に注意してください。

  • aResourceOne の宣言では、最も厄介な解析の問題が発生します。aResourceOneResourceType 型のオブジェクトなのか、ResourceType 型のオブジェクトを返す関数なのかが明確ではありません。

  • aResourceThree の宣言は、初期化のためにコピー コンストラクター ResourceType(ResourceType &) を呼び出していることを示しているように見えます。このコピー コンストラクターは、データ メンバー memberOne を 2 に初期化し、memberTwo を 1 に初期化します。しかし、コンストラクター ResourceType(int, int) が呼び出されます。このコンストラクターがデータ メンバー memberOne を 1 に初期化し、memberTwo を 2 に初期化しています。

チェック情報

グループ: 宣言子
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入