メインコンテンツ

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

未初期化ポインター チェックのレビューと修正

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

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

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

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

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

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

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

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

オレンジ チェックについては、ポインターが特定の実行パスで初期化されていない理由を特定します。

  1. ポインターに書き込み操作が実行される前のインスタンスを検索します。

  2. 書き込み操作ごとに、以下の場合に操作が発生するかどうかを判定します。

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

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

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

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

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

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

変数の性質に応じて、変数に対する前の操作を検索するために適切な方法を使用します。以下の手順は、Polyspace ユーザー インターフェイスでのみ実行できます。

変数変数に対する前の操作の検索方法

ローカル変数

次のいずれかの方法を使用してください。

  • 変数の検索。

    1. 変数を右クリックします。[すべての参照を検索] を選択します。

      変数のすべてのインスタンスは、現在のインスタンスが強調表示されて [検索] ペインに表示されます。

    2. [検索] ペインで前のインスタンスを選択します。

  • ソース コードの参照。

    1. [ソース] ペインで変数をダブルクリックします。

      変数のすべてのインスタンスは強調表示されます。

    2. 上にスクロールして前のインスタンスを検索します。

グローバル変数

変数を右クリックします。オプション [変数アクセス ビューで表示] が表示される場合、変数はグローバル変数です。

  1. オプション [変数アクセス ビューで表示] を選択します。

    変数の現在のインスタンスは [変数アクセス] ペインに表示されます。

  2. このペインで、変数の前のインスタンスを選択します。

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

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

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

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

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

  • このチェックを無効にできるのは、非ローカル ポインターについてのみです。Polyspace では、グローバル ポインター変数は ANSI® C 規格に従って NULL に初期化されると見なします。詳細は、グローバル変数の既定の初期化を無視するを参照してください。

  • このチェックは、他の初期化チェックと合わせて完全に無効にすることができます。このチェックを無効にすると、Polyspace は宣言で、ポインターは NULL になるかメモリ ブロックを不明なオフセットで指すと仮定します。詳細は、未初期化のチェックを無効にする (-disable-initialization-checks)を参照してください。