メインコンテンツ

MISRA C++:2023 Rule 6.7.2

Global variables shall not be used

R2024b 以降

説明

ルール定義

Global variables shall not be used. 1

根拠

グローバル変数とは、次のようなものです。

  • グローバル名前空間を含め namespace スコープ内で宣言されている変数。

  • クラスの static データ メンバー。

このような変数のリンクに応じて、ソース ファイル内またはプログラム内の任意の位置から、この変数の読み取りまたは書き込みが可能です。このように非ローカル オブジェクトの利用可能性が高いことで、さまざまな問題が生じる可能性があります。

  • 多数の関数とエンティティがこれらのグローバル変数の読み取りや書き込みを行えるため、それらの交互作用が予測不可能になります。

  • 複数の関数がこれらのグローバル変数に同時にアクセスすることができるため、同時実行プログラムでデータ競合によって未定義の動作が発生するリスクがあります。

  • グローバル変数の初期化順序は C++ 標準で完全には指定されていないことから、グローバル変数が動的に初期化された場合に変数の値が予測不可能になる可能性があります。

このルールに違反しない次の変数を除き、グローバル変数の使用は避けてください。

  • constexpr 変数

  • 静的な初期化によって初期化される const 変数

  • ラムダ キャプチャのないラムダを保持する変数

Polyspace 実装

次のいずれかのオブジェクトを宣言すると、Polyspace® はこのルールの違反を報告します。

  • constconstexpr のいずれでもないグローバル変数または名前空間スコープ変数

  • 動的に初期化された const グローバル変数または名前空間スコープ変数

  • static クラス メンバー

トラブルシューティング

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

すべて展開する

この例では、以下に対して Polyspace がこのルールの違反を報告します。

  • グローバル名前空間で宣言された非 const 変数 (nonConstGlobalthreadLocalGlobal など)

  • 動的な初期化を使用して初期化された const グローバル変数 (constGlobalDynamicAlloc など)

  • 名前空間スコープ変数 (namespaceScopeVar など)

  • 静的クラス メンバー (myClass::staticClassMember など)

 int getVal();
constexpr int getConstexprVal(){return 5;}

int nonConstGlobal; //Noncompliant - variable declared in global namespace scope
thread_local unsigned int threadLocalGlobal= 1; //Noncompliant 
                                             // global variable is local to a thread
constexpr int  constantExpressionGlobal {0}; //Compliant by exception

int const constGlobal{0}; //Compliant by exception
int const constGlobalDynamicAlloc{getVal()}; //Noncompliant

namespace{
int namespaceScopeVar; //Noncompliant - variable declared in namespace scope
constexpr int namespaceScopeConstexprVar{getConstexprVal()}; //Compliant by exception
}

class myClass{
static int staticClassMember; //Noncompliant - static data mmeber
};

auto globalLambdaNoCapture = [](){/**/}; //Compliant by exception

Polyspace は、このルールの次の例外に対しては違反を報告しません。

  • constexpr 変数 (constantExpressionGlobal または namespaceScopeConstexprVar など)

  • 静的に初期化された const 変数 (constGlobal など)

  • ラムダ キャプチャのないラムダを保持する変数 (globalLambdaNoCapture など)

チェック情報

グループ: Basic Concepts
カテゴリ: Required

バージョン履歴

R2024b で導入


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.