メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

初期化コードでグローバル変数に値が割り当てられていません

プログラムの初期化セクションでグローバル変数に値が割り当てられていない

説明

このチェックでは、宣言時、または初期化コードとして指定されたコードのセクションで、すべての非 const グローバル変数 (およびローカルの静的変数) に値が明示的に割り当てられているかどうかを判別します。

初期化コードの最後を示すには、次の行を入力します。

#pragma polyspace_end_of_init
この行は、main 関数に入力します。初期化コードは main の先頭から始まり、このプラグマまで継続します。このチェックを有効にするには、オプション [ウォーム リブート後にグローバル変数が初期化されることをチェック] (-check-globals-init) を使用します。

グローバル変数に対するチェックは、次のようになります。

  • 変数が宣言時に明示的に初期化されず、初期化コードでも初期化されない (または初期化コード内のデッド コードで初期化される) 場合は、レッドになります。

  • 変数が初期化コードの特定の実行パスで初期化されない場合は、オレンジになります。たとえば、変数が条件付きステートメントの if 分岐では初期化されるが、else 分岐では初期化されない場合などです。

  • 初期化コードが実行を完了した後、変数が常に初期化されている場合は、グリーンになります。

ウォーム リブートでは、時間短縮のため、プログラムのデータ セグメント (以前の状態の変数値を保持している可能性がある領域) が読み込まれません。代わりに、プログラムが実行前にすべての非 const 変数を明示的に初期化することが想定されています。このチェックは、すべての非 const グローバル変数がウォーム リブートで実際に初期化されることを検証します。

このチェックの診断

[変数アクセス] ペイン (または Polyspace® Access Web インターフェイスの [グローバル変数] ペイン) で、初期化されていない変数または初期化されない可能性がある変数のすべてのインスタンスを参照します。プラグマ polyspace_end_of_init が検出される前に参照が行われているかどうかを確認します。

Polyspace デスクトップ ユーザー インターフェイスの [変数アクセス]も参照してください。

すべて展開する

int aVar;
const int aConst = -1;
int anotherVar;

int main() {
      aVar = aConst;
#pragma polyspace_end_of_init
      return 0;
}

この例では、初期化コード セクションでグローバル変数 aVar は初期化されますが、anotherVar は初期化されません。

int var;
 
int checkSomething(void);
int checkSomethingElse(void);

int main() {
    int local_var;
    if(checkSomething())
    {
        var=0;
    }
    else if(checkSomethingElse()) {
        var=1;
    }
    #pragma polyspace_end_of_init
    var=2;
    local_var = var;
    return 0;
}

if および else if ステートメントがスキップされたときに var が初期化されないままになる可能性があるため、var に対するチェックはオレンジになります。

int aVar;
int anotherVar;

int checkSomething();

init0() {
  if (checkSomething())
      aVar = 0;
}
init1() {
  anotherVar = aVar; //Orange check: Non-initialized variable
}
main() {
  init0();
  init1();
#pragma polyspace_end_of_init
}

この例では、変数 aVaranotherVar の両方が初期化されたもの (グリーン チェック) として表示されます。しかし、次のパスでは両方の変数が初期化されない可能性があります。

  • init0if ステートメントがスキップされ、aVar が初期化されない。

  • aVar が初期化されない場合、anotherVar も初期化されない (予測不能な値で初期化される)。

この問題は、別のチェック ([未初期化変数]) で強調表示されます。このチェックは次の行でオレンジになります。

anotherVar = aVar;
オレンジ チェック以降、aVar が初期化されない実行パスは考慮対象から除外されます。この除外により、anotherVar はすべてのチェックに従って初期化されたもの (グリーン) として表示され、aVar はチェック [初期化コードでグローバル変数に値が割り当てられていません] に従って初期化されたもの (グリーン) として表示されます。

初期化に関するグリーンの結果の紛らわしい解釈を避けるには、次を行います。

チェック情報

グループ: データ フロー
言語: C
頭字語: GLOBAL_SET_AT_INITIALIZATION