メインコンテンツ

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

誤ったオブジェクト指向プログラミング チェックのレビューと修正

このトピックでは、Polyspace® Code Prover™[誤ったオブジェクト指向プログラミング] チェックの結果を体系的にレビューする方法を説明します。

[誤ったオブジェクト指向プログラミング] チェックの修正を判断するまでこれらの手順の 1 つ以上に従います。チェックおよびコードの例については、誤ったオブジェクト指向プログラミングを参照してください。

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

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

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

以下を表示できます。

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

    • 値が NULL であるか、無効なメンバー関数を指す関数ポインターをデリファレンスしている。

      引数または戻り値の型がポインターの引数または戻り値の型と一致しない場合、そのメンバー関数は無効となります。

    • クラスの純粋な virtual メンバー関数をクラスのコンストラクターまたはデストラクターから呼び出している。

    • メンバー関数の呼び出しで使用している this ポインターが正しくない。

      this ポインターが正しくならない理由を確認するには、誤ったオブジェクト指向プログラミングを参照してください。

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

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

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

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

エラー根本原因の検出方法
値が NULL の関数ポインターをデリファレンスしている。

関数ポインターを右クリックし、[すべての参照を検索] を選択します。関数ポインターに NULL を割り当てているインスタンスを探します。

無効なメンバー関数を指す関数ポインターをデリファレンスしている。

関数ポインターの引数および戻り値の型をその関数ポインターが指しているメンバー関数と比較します。

  1. [ソース] ペインで関数ポインターを右クリックし、[すべての参照を検索] を選択します。次のインスタンスを探します。

    • 関数ポインターの定義。

    • 関数ポインターへのメンバー関数のアドレスの代入。

  2. メンバー関数の定義を探します。[ソース] ペインでメンバー関数名を右クリックし、[定義に移動] を選択します。

純粋な virtual メンバー関数をコンストラクターまたはデストラクターから呼び出している。

メンバー関数の宣言を探し、意図的に virtual 関数または純粋な virtual 関数として宣言しているかどうかを確認します。あるいは、純粋な virtual 関数の呼び出しを別の操作 (別のメンバー関数の呼び出しなど) に置き換えられないかどうかを確認します。

  1. [ソース] ペインで関数名を右クリックし、[すべてのソース ファイル内で function_name を検索] を選択します。

  2. 検索結果から関数の宣言を探します。

    純粋な virtual 関数は次のように宣言されています。

    virtual void func() = 0;

メンバー関数の呼び出しで使用している this ポインターが正しくない。

this ポインターが正しくない理由を特定します。

たとえば、レッドの [誤ったオブジェクト指向プログラミング] チェックが関数呼び出し ptr->func() に対して表示され、this ポインターが正しくないことを示すメッセージが表示された場合は、ptr のデータ フローをトレースします。

  • [ソース] ペインで関数ポインターを右クリックし、[すべての参照を検索] を選択します。

  • ポインターに対するすべての書き込み操作を参照します。次の問題を探します。

    • 関連しない型のポインター間のキャスト。

    • 割り当てられたバッファー (配列の範囲など) の範囲外のポインターを取るポインター演算。

レッドの [誤ったオブジェクト指向プログラミング] チェックが関数呼び出し obj.func() に対して表示された場合は、obj のデータ フローをトレースします。obj が前もって初期化されていないかどうかを確認します。