AUTOSAR C++14 Rule A12-1-1
Constructors shall explicitly initialize all virtual base classes, all direct non-virtual base classes and all non-static data members
説明
ルール定義
コンストラクターは、すべてのバーチャル基底クラス、すべての直接非バーチャル基底クラス、およびすべての非静的データ メンバーを明示的に初期化するものとします。
根拠
派生クラスがその基底クラスのコンストラクターを明示的に初期化しなければ、コンパイラにより、基底クラスが暗黙的に初期化されます。その場合、無効な状態のオブジェクトまたは意図しない初期値をもつオブジェクトが構築される可能性があり、実行時に予期せぬコードの動作が生じるリスクがあります。次のダイヤモンド クラス階層を考えてください。この階層では、基底クラス Parent に複数のコンストラクターがあります。
class Parent{
public:
Parent(){/*...*/}
Parent(int i){/*...*/}
};
class Child1: public virtual Parent{
public:
Child1(): Parent(2){/*...*/}
};
class Child2: public virtual Parent{
public:
Child2(): Parent(1){/*...*/}
};
class GrandChild: public Child1, public Child2{
public:
GrandChild(){/*...*/}
}GrandChild オブジェクトを構築するときに、1 または 2 のどちらを引数として使用してParent が構築されるのかが明白ではありません。Parent の初期化に使用するコンストラクターを GrandChild で明示的に指定すると、このあいまいさが解決されます。無効な状態または意図しない初期値を回避するには、派生クラス コンストラクターの初期化リスト内で必要な基底クラス コンストラクターを直接呼び出します。Polyspace 実装
Polyspace® は、派生クラス コンストラクターの初期化リストが次のようになっている場合、コンストラクターにフラグを設定します。
バーチャル基底クラスのコンストラクターを明示的に呼び出していない。
直接非バーチャル基底クラスのコンストラクターを明示的に呼び出していない。
非静的データ メンバーを明示的に初期化していない。
非静的データ メンバーが、分岐、ループ、または例外処理ステートメントの 1 つ以上のブランチで初期化される場合、Polyspace はそのデータ メンバーが初期化されると見なします。
Polyspace は、デリゲート コンストラクターが使用されている場合にこのルールに対する違反を報告しません。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 特殊なメンバー関数 |
| カテゴリ: Required、Automated |