メインコンテンツ

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

未初期化変数チェックのレビューと修正

このトピックでは、Polyspace® Code Prover™[未初期化変数] チェックの結果を体系的にレビューする方法を説明します。

[未初期化変数] チェックの修正を判断するまでこれらの手順の 1 つ以上に従います。このチェックを修正する方法は複数あります。チェックおよびコードの例については、未初期化変数を参照してください。

特にオレンジ チェックに対して、チェックが実際のエラーを表すのではなく、コードに該当しない Polyspace 前提条件を表していると判定できます。前提条件を緩和するのに解析オプションを使用できる場合、そのオプションを使用して検証を再実行します。それ以外の場合は、結果またはコードにコメントおよび正当化情報を追加できます。

すべてのチェックに適用される一般的なワークフローについては、Polyspace デスクトップ ユーザー インターフェイスでの Code Prover の結果の解釈またはPolyspace Access Web インターフェイスでの Code Prover の結果の解釈 (Polyspace Access)を参照してください。

手順 1: チェック情報の解釈

[結果のリスト] ペインで、チェックを選択します。[結果の詳細] ペインで、チェックに関する詳細を入手します。

次の情報を取得します。

  • [結果の詳細] ペインで説明されている場合、考えられるチェックの原因。

    前述の例では、グローバル変数 globVar[未初期化変数] オレンジ チェックがあります。

    ソフトウェアはチェックがパス関連の問題である可能性を検出します。したがって、グローバル変数は特定の実行パスでのみ未初期化である可能性があります。たとえば、if ブロック内のグローバル変数は初期化されたが、対応する else ブロック内では変数が初期化されなかったとします。

    考えられる解決方法: グローバル変数が初期化されない可能性のあるパスを特定します。

  • グローバル変数の値 (初期化される場合)。

    前述の例では、初期化時にグローバル変数 globVar の値は 0 になります。

手順 2: チェックの根本原因の判定

以下の手順は、Polyspace ユーザー インターフェイスでのみ実行できます。

変数を右クリックし、[定義に移動] を選択します。変数を定義するときに初期化します。定義時に初期化しない場合、読み取りの前で変数を初期化するために適したポイントを特定します。

チェックがオレンジの場合、変数が特定の実行パスで未初期化である理由を特定します。

  1. 変数を右クリックします。[変数アクセス ビューで表示] を選択します。

  2. [変数アクセス] ペインで変数に対する各書き込み操作を選択します。

    書き込み操作は で示され、読み取り操作は で示されます。

  3. 次の場合に、書き込み操作が発生するかどうかを判定します。

    • [未初期化変数] オレンジ チェックを含む読み取り操作の前。

      考えられる解決方法: 書き込み操作が読み取り操作の後に発生する場合、これらの操作を逆の順序で実行することを意図していたかどうかを確認します。

    • 到達不能コードのブロック内。

      考えられる解決方法: コード ブロックが到達不能な理由を調べます。到達不能コード チェックのレビューと修正を参照してください。

    • 特定の実行パスにある到達されていないコード ブロック内。たとえば、操作は関数の if ブロック内で発生するとします。特定の関数入力は if ブロックに入っていません。

      考えられる解決方法: すべての実行パスで書き込み操作を実行します。前述の例では、if ... elseif ... else ステートメントのすべての分岐内で書き込み操作を実行します。

手順 3: Polyspace の前提条件へのチェックをトレース

コードの前方で発生する Polyspace 前提条件にオレンジ チェックをトレースできるかどうかを確認します。前提条件があてはまらない場合、結果またはコードにコメントまたは正当化情報を追加します。Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処またはPolyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access)を参照してください。

このチェックを無効にする

このチェックは次の 2 つの方法によって無効にすることができます。

  • グローバル変数は初期化済みであると認識されるように指定できます。Polyspace では、グローバル変数は ANSI® C 規格に従って初期化されると見なします。既定値は、以下のとおりです。

    • int では 0

    • char では 0

    • float では 0.0

    詳細は、グローバル変数の既定の初期化を無視するを参照してください。

  • このチェックは、他の初期化チェックと合わせて無効にすることができます。このチェックを無効にすると、Polyspace は宣言で、変数はその型で許容される全範囲の値を取ると仮定します。詳細は、未初期化のチェックを無効にする (-disable-initialization-checks)を参照してください。