このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
未初期化ポインター チェックのレビューと修正
このトピックでは、Polyspace® Code Prover™ で [未初期化ポインター] チェックの結果を体系的にレビューする方法を説明します。
[未初期化ポインター] チェックの修正を判断するまでこれらの手順の 1 つ以上に従います。このチェックを修正する方法は複数あります。チェックおよびコードの例については、未初期化ポインター
を参照してください。
特にオレンジ チェックに対して、チェックが実際のエラーを表すのではなく、コードに該当しない Polyspace 前提条件を表していると判定できます。前提条件を緩和するのに解析オプションを使用できる場合、そのオプションを使用して検証を再実行します。それ以外の場合は、結果またはコードにコメントおよび正当化情報を追加できます。
すべてのチェックに適用される一般的なワークフローについては、Polyspace デスクトップ ユーザー インターフェイスでの Code Prover の結果の解釈またはPolyspace Access Web インターフェイスでの Code Prover の結果の解釈 (Polyspace Access)を参照してください。
手順 1: チェック情報の解釈
[結果のリスト] ペインで、チェックを選択します。[結果の詳細] ペインで、チェックに関する詳細を入手します。
手順 2: チェックの根本原因の判定
ポインター変数を右クリックし、[定義に移動] を選択します。変数を定義するときに初期化します。定義時に初期化しない場合、読み取りの前で変数を初期化するために適したポイントを特定します。
オレンジ チェックについては、ポインターが特定の実行パスで初期化されていない理由を特定します。
ポインターに書き込み操作が実行される前のインスタンスを検索します。
書き込み操作ごとに、以下の場合に操作が発生するかどうかを判定します。
[未初期化ポインター] オレンジ チェックを含む読み取り操作の前。
考えられる解決方法: 書き込み操作が読み取り操作の後に発生する場合、これらの操作を逆の順序で実行することを意図していたかどうかを確認します。
到達不能コードのブロック内。
考えられる解決方法: コード ブロックが到達不能な理由を調べます。到達不能コード チェックのレビューと修正を参照してください。
特定の実行パスにある到達されていないコード ブロック内。たとえば、操作は関数の
if
ブロック内で発生するとします。特定の関数入力はif
ブロックに入っていません。考えられる解決方法: すべての実行パスで書き込み操作を実行します。前述の例では、
if ... elseif ... else
ステートメントのすべての分岐内で書き込み操作を実行します。
変数の性質に応じて、変数に対する前の操作を検索するために適切な方法を使用します。以下の手順は、Polyspace ユーザー インターフェイスでのみ実行できます。
変数 | 変数に対する前の操作の検索方法 |
---|---|
ローカル変数 | 次のいずれかの方法を使用してください。
|
グローバル変数 変数を右クリックします。オプション [変数アクセス ビューで表示] が表示される場合、変数はグローバル変数です。 |
|
手順 3: Polyspace の前提条件へのチェックをトレース
コードの前方で発生する Polyspace 前提条件にオレンジ チェックをトレースできるかどうかを確認します。前提条件があてはまらない場合、結果またはコードにコメントまたは正当化情報を追加します。Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処またはPolyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access)を参照してください。
このチェックを無効にする
このチェックは次の 2 つの方法によって無効にすることができます。
このチェックを無効にできるのは、非ローカル ポインターについてのみです。Polyspace では、グローバル ポインター変数は ANSI® C 規格に従って
NULL
に初期化されると見なします。詳細は、グローバル変数の既定の初期化を無視するを参照してください。このチェックは、他の初期化チェックと合わせて完全に無効にすることができます。このチェックを無効にすると、Polyspace は宣言で、ポインターは
NULL
になるかメモリ ブロックを不明なオフセットで指すと仮定します。詳細は、未初期化のチェックを無効にする (-disable-initialization-checks)
を参照してください。