AUTOSAR C++14 Rule A3-3-2
Static and thread-local objects shall be constant-initialized
説明
ルール定義
静的オブジェクトとスレッド ローカル オブジェクトは定数初期化するものとします。
根拠
静的オブジェクトとスレッド ローカル オブジェクトは、コード実行の開始時点で初期化されます。C++ 言語標準では、複数の静的オブジェクトまたはスレッド ローカル オブジェクトの初期化順序が部分的にしか定義されず、ビルドごとに順序が変化する可能性があります。静的オブジェクトまたはスレッド ローカル オブジェクトを別のそのようなオブジェクトから初期化する場合は、オブジェクトが初期化される前に、コンパイラが後者のオブジェクトにアクセスする可能性があります。初期化前のアクセスを回避するには、コンパイル時に定数に評価されるオブジェクトを使用して、静的オブジェクトとスレッド ローカル オブジェクトを初期化します。定数を使用した初期化は、変数を使用した初期化の前に行われ、多くはコンパイル時に行われます。
このルールは、グローバル変数、静的変数、静的クラス メンバー変数、および静的関数スコープ変数に適用されます。
Polyspace 実装
Polyspace® は、コンパイル時に定数に評価されない初期化子とコンストラクターを使用した静的オブジェクトまたはスレッド ローカル オブジェクトの初期化にフラグを設定します。静的オブジェクトまたはスレッド ローカル オブジェクトを定数初期化するには、以下を使用します。
定数引数のみを使用する
constexprコンストラクター定数式
値
文字列オブジェクトでは不明なサイズの動的メモリ割り当てが使用されるため、コンパイラはそれらをコンパイル時に評価できません。Polyspace は、初期化子が指定されているかどうかに関係なく、文字列オブジェクトの初期化にフラグを設定します。
クラスのコンストラクターが constexpr ではない場合、そのクラスのグローバル、静的、またはスレッド ローカル インスタンスを定数初期化できないため、違反が発生します。たとえば、このコードではクラス myClass に constexpr コンストラクターがありません。このクラスのグローバル、static、またはスレッド ローカル インスタンスは違反となります。
class myClass
{
public:
myClass() {} //no a constexpr
};
namespace
{
myClass myObject{}; //Noncompliant
} // namespace
void foo()
{
static myClass myStaticObject{}; // Noncompliant
}トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 基本概念 |
| カテゴリ: Required、Automated |
バージョン履歴
R2020a で導入