メインコンテンツ

無効な C++ に固有の演算チェックのレビューと修正

このトピックでは、Polyspace® Code Prover™[無効な C++ に固有の演算] チェックの結果を体系的にレビューする方法を説明します。

[無効な C++ に固有の演算] チェックの修正を判断するまでこれらの手順の 1 つ以上に従います。レッド チェックまたはオレンジ チェックを修正する方法は複数あります。チェックおよびコードの例については、無効な C++ に固有の演算を参照してください。

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

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

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

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

以下を表示できます。

  • チェックの直接の原因。次に例を示します。

    • 配列のサイズが厳密に正ではない。

      たとえば、ステートメント arr = new char [num] を使用して配列を作成している場合があります。num はゼロまたは負になる可能性があります。

      考えられる解決方法: 配列サイズとして num を使用するのは、正になる場合だけにします。

    • typeid 演算子が NULL の可能性があるポインターをデリファレンスする。

      考えられる解決方法: ポインターで typeid 演算子を使用する前に、NULL についてポインターをテストします。

    • dynamic_cast 演算子が無効なキャストを実行する。

      考えられる解決方法: 無効なキャストがあると、ポインターの戻り値が NULL になったり、参照で std::bad_cast 例外が発生したりします。無効なキャストは避けるようにしてください。あるいは、無効なキャストがポインターにある場合は、デリファレンスの前に dynamic_cast の戻り値を NULL についてテストします。無効なキャストが参照にある場合は、try-catch ステートメントで std::bad_cast 例外をキャッチします。

  • チェックの考えられる根本原因 (示されている場合)。

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

チェック情報に基づいて根本原因を判定できない場合、ユーザー インターフェイスのナビゲーション ショートカットを用いて根本原因に移動します。

エラーの性質に基づいて、次のいずれかの方法で根本原因を特定します。

エラー根本原因の検出方法
配列サイズが非正である。
  1. サイズ変数のデータ フローをトレースします。

    [ゼロ除算] チェックと同じ根本原因の調査手順に従います。ゼロ除算チェックのレビューと修正を参照してください。

  2. 配列サイズの変数を正の値に制約できるポイントを特定します。

typeid 演算子が NULL の可能性があるポインターをデリファレンスする。
  1. ポインター変数のデータ フローをトレースします。

    [不適切にデリファレンスされたポインター] チェックと同じ根本原因の調査手順に従います。不適切にデリファレンスされたポインター チェックのレビューと修正を参照してください。

  2. NULL についてポインターをテストできるポイントを特定します。

dynamic_cast 演算子が無効なキャストを実行する。

関連するクラスの定義に移動します。クラス間の継承関係を確認します。

  1. Polyspace ユーザー インターフェイスの [ソース] ペインで、クラス名を右クリックします。

  2. [定義に移動] を選択します。

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

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

たとえば、配列サイズの変数をスタブ関数 getSize から取得するとします。ここで、次のようにします。

  1. Polyspace では、getSize の戻り値が全範囲の値を取ると仮定されます。この範囲には非正の値も含まれます。

  2. この変数を動的メモリ割り当てで配列サイズとして使用すると、オレンジの [無効な C++ に固有の演算] の原因になります。

  3. 変数が正の値を取るとわかっている場合、コメントおよび正当化情報を追加し、コードを変更しなかった理由を説明します。

詳細については、Code Prover 解析の前提条件を参照してください。

メモ

オレンジ チェックを正当化する前に、コード設計を改善できるかどうかを十分に検討してください。