メインコンテンツ

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

無限ループ チェックのレビューと修正

このトピックでは、Polyspace® Code Prover™[無限ループ] チェックの結果を体系的にレビューする方法を説明します。

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

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

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

for または while などのループ キーワードにカーソルを置きます。

ツールヒントから次の情報を取得します。

  • ループが無限である、あるいはランタイム エラーを含んでいるかどうか。

    次の例では、ループは無限である可能性があります。

  • ループにランタイム エラーが含まれている場合のループの反復回数。Polyspace はランタイム エラー発生時に実行が停止すると見なすため、この数値からどのループ反復にエラーが含まれているのかを特定できます。

    次の例では、ループにランタイム エラーが含まれている可能性があります。エラーは 31 回目のループ反復で発生する可能性があります。

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

  • ループが無限である場合、ループ終了条件が満たされることがない理由を特定します。

    コード内の無限ループが周期的なアプリ用など意図的なものである場合、結果またはコードにコメントおよび正当化情報を追加できます。Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処またはPolyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access)を参照してください。

  • ループにランタイム エラーが含まれている場合、[無限ループ] チェックの原因となるエラーを特定します。エラーを修正します。

    ループ本体内では通常、ランタイム エラーは操作に対して別のタイプのオレンジ チェックとして発生します。このチェックはオレンジであり、レッドではありません。操作が通常、最初の数回のループ反復でチェックをパスし、後の反復でのみ失敗するためです。ただし、失敗はループが実行されるたびに発生するため、ループ キーワードの [無限ループ] チェックはレッドです。

    反復が数回のループでは、ランタイム エラーを起こしている操作にループ キーワードから直接移動できます。

    • エラーのソースを見つけるには、[ソース] ペインで赤いループ キーワードを選択します。[結果の詳細] ペインで、ランタイム エラーを起こしている操作につながる完全な履歴が表示されます。

    • ループ本体でエラーのソースまで移動します。ループ キーワードを右クリックして、オプションがあれば [原因に移動] を選択します。

    チュートリアルについては、ランタイム エラーのあるループ操作の特定を参照してください。

手順 3: チェックの一般的な原因の検索

  • ループが無限の場合、次の手順に従います。

    • ループ終了条件をチェックします。

    • ループ本体内部で、ループ終了条件に含まれる変数の少なくとも 1 つを変更するかどうかを確認します。

      たとえば、ループ終了条件が while (count1 + count2 < count3) である場合、ループ内の count1count2 または count3 の少なくとも 1 つを変更しているかどうかを確認します。

    • ループ終了条件に含まれる変数を変更している場合、正しい方向に変数を変更しているかどうかを確認します。

      たとえば、ループ終了条件が while(i<10)i をデクリメントする場合、ループは終了しません。i をインクリメントしなければなりません。

  • ループにランタイム エラーが含まれる場合、次の手順に従います。

    • ループ制御変数が配列インデックスである場合、ループ本体内に [範囲外の配列インデックス] オレンジ エラーがあるかどうかを確認します。

    • ループ制御変数が関数に渡される場合、関数本体内でレッドの [無限ループ] エラーをオレンジ エラーに関連付けられるかどうかを確認します。