Main Content

未実行コードおよび定数が畳み込まれたコードの検出

テスト ファイルのシミュレーション中に、MATLAB® Coder™ アプリは未実行コードまたは定数が畳み込まれたコードを検出します。テスト ベンチで実行されないコードは、到達不能コードまたはデッド コードである可能性があります。アプリは、浮動小数点の MATLAB コードから固定小数点の MATLAB コードにコードを変換するときに、コード カバレッジ情報を使用します。コード カバレッジの結果を確認すると、テスト ファイルがアルゴリズムを適切に実行しているか検証できます。

実行されない領域と変換されない領域に印を付けるために固定小数点コードにはインライン コメントが挿入されます。生成される固定小数点変換 HTML レポートにコード カバレッジ情報が追加されます。アプリのエディターで、コードの左側に色分けされたバーが表示されます。次の表では色分けを説明します。

カバレッジ バーの色意味

以下のいずれかに該当します。

  • エントリポイント関数が複数回実行され、コードが 1 回を超えて実行される。

  • エントリポイント関数が 1 回実行され、コードが 1 回実行される。

さまざまな緑の色調は、行の実行回数の各範囲を示しています。最も濃い緑の色調は、最大の範囲を示しています。

オレンジエントリポイント関数が複数回実行され、コードが 1 回実行される。
コードが実行されない。

未実行コードとは

未実行コードとは、シミュレーション中にテスト ベンチで実行されないコードです。未実行コードは次のシナリオの結果として生じる場合があります。

  • 到達しない意図された特殊ケースを含む防御的コード

  • コード内の人的エラーによって生じたどのような実行パスによっても到達できないコード (到達不能コードまたはデッド コードと呼ばれることもある)

  • コード内のすべてのパスを実行する入力を提供しない不十分なテスト ベンチの範囲

  • 定数畳み込み

未実行コードの検出

この例では、MATLAB Coder アプリを使用してアルゴリズム内のテスト ベンチで実行されないコードを検出する方法について説明します。

  1. ローカルの書き込み可能なフォルダーで関数 myFunction.m を作成します。

    function y = myFunction(u,v)
        %#codegen
        for i = 1:length(u)
            if u(i) > v(i)
                y=bar(u,v);
            else
                tmp = u;
                v = tmp;
                y = baz(u,v);
            end
        end
    end
    
    function y = bar(u,v)
        y = u+v;
    end
    
    function y = baz(u,v)
        y = u-v;
    end
    
  2. 同じフォルダーでテスト ファイル myFunction_tb を作成します。

    u = 1:100;
    v = 101:200;
    
    myFunction(u,v);
    
  3. アプリ ギャラリーから MATLAB Coder アプリを開きます。

  4. [数値変換][固定小数点に変換] に設定します。

  5. [ソース ファイルの選択] ページで myFunction ファイルを探して [開く] をクリックします。

  6. [次へ] をクリックします。[入力の型を定義] ページで、作成したテスト ファイル myFunction_tb を参照して選択します。[入力の型の自動定義] をクリックします。

  7. [次へ] をクリックします。[実行時の問題の確認] ページで [問題の確認] をクリックします。

    テスト ファイル myFunction_tb が実行され、問題は検出されません。

  8. [次へ] をクリックします。[固定小数点への変換] ページで [解析] をクリックし、エントリポイント関数のシミュレーションを実行して範囲情報を収集し、推奨されるデータ型を取得します。

    編集ウィンドウの左側にある色分けされたバーによって、コードが実行されたかどうかが示されます。u が v より大きくなることはないため、if ステートメントの最初の条件のコードはシミュレーションの最中に実行されません。if ステートメントが実行されることはないため、関数 bar が実行されることはありません。アルゴリズムのこれらの部分は赤いバーでマークされ、テスト ベンチで実行されないことが示されます。

  9. [変換] をクリックし、推奨されたデータ型を関数に適用します。

    MATLAB Coder アプリによって固定小数点の関数 myFunction_fixpt が生成されます。生成された固定小数点コードでは、テスト ベンチで実行されないと識別されたコードの周囲にコメントが含まれています。[検証結果] ペインでは、より徹底したテスト ベンチを使用するように提案されます。

    MATLAB Coder アプリによって未実行コードが検出された場合は、アルゴリズムの全体の範囲が実行されるようにテスト ファイルを編集することを検討します。テスト ファイルが既に入力変数の範囲全体を反映している場合は、アルゴリズムを編集して到達不能コードを除去することを検討します。

  10. MATLAB Coder アプリを閉じます。

未実行コードの修正

  1. テスト ファイル myFunction_tb.m を編集してより広い入力範囲が含まれるようにします。

    u = 1:100;
    v = -50:2:149;
    
    myFunction(u,v);
    

  2. MATLAB Coder アプリを再度開きます。

  3. 同じ関数と編集したテスト ファイルを使用して変換プロセスを再び実行します。

  4. [解析] をクリックすると、今回は新しいテスト ファイルの入力範囲によってアルゴリズムのすべての部分が実行されたことがコード カバレッジ バーによって示されます。

    [変換] をクリックして変換プロセスを終了し、関数を固定小数点に変換します。