無効な 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: チェックの根本原因の判定
チェック情報に基づいて根本原因を判定できない場合、ユーザー インターフェイスのナビゲーション ショートカットを用いて根本原因に移動します。
エラーの性質に基づいて、次のいずれかの方法で根本原因を特定します。
| エラー | 根本原因の検出方法 |
|---|---|
| 配列サイズが非正である。 |
|
typeid 演算子が NULL の可能性があるポインターをデリファレンスする。 |
|
dynamic_cast 演算子が無効なキャストを実行する。 | 関連するクラスの定義に移動します。クラス間の継承関係を確認します。
|
手順 3: Polyspace の前提条件へのチェックをトレース
コードの前方で発生する Polyspace 前提条件にオレンジ チェックをトレースできるかどうかを確認します。前提条件があてはまらない場合、結果またはコードにコメントまたは正当化情報を追加します。Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処またはPolyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access)を参照してください。
たとえば、配列サイズの変数をスタブ関数 getSize から取得するとします。ここで、次のようにします。
Polyspace では、
getSizeの戻り値が全範囲の値を取ると仮定されます。この範囲には非正の値も含まれます。この変数を動的メモリ割り当てで配列サイズとして使用すると、オレンジの [無効な C++ に固有の演算] の原因になります。
変数が正の値を取るとわかっている場合、コメントおよび正当化情報を追加し、コードを変更しなかった理由を説明します。
詳細については、Code Prover 解析の前提条件を参照してください。
メモ
オレンジ チェックを正当化する前に、コード設計を改善できるかどうかを十分に検討してください。