コードの解析とソフトウェアインザループのテスト
コード解析とソフトウェアインザループのテストの概要
コードを解析してエラーを検出し、標準への準拠をチェックして、長さや循環的複雑度などの主要メトリクスを評価できます。通常、手書きコードの場合は、静的コード解析でランタイム エラーの有無をチェックし、要件に対してコードを評価するテスト ケースを実行して、コード カバレッジを評価します。結果に基づいて、コードを調整してテストを追加します。
この例では、コードを生成し、同じテスト ケースとベースライン結果を使用して、コードを実行するとモデルに対して同等の結果が得られることを示します。次に、コード カバレッジとモデル カバレッジを比較します。テスト結果に基づいて、テストを追加し、モデルを変更してコードを再生成します。
欠陥、メトリクス、MISRA C:2012 を対象としてコードを解析
このワークフローでは、モデルが MISRA™ C:2012 準拠のコードを生成するかどうかをチェックする方法と、コード メトリクスと欠陥に関して、生成されたコードをチェックする方法を説明します。より厳密に MISRA に準拠するコードをモデルから生成するには、コード生成アドバイザーとモデル アドバイザーを使用します。コードが MISRA に準拠しているかどうかをチェックするには、Polyspace® MISRA C:2012 チェッカー機能とレポート生成機能を使用します。この例では、モデル simulinkCruiseErrorAndStandardsExample
を使用します。モデルを開くには、次を行います。
プロジェクトを開きます。
openExample("shared_vnv/CruiseControlVerificationProjectExample"); pr = openProject("SimulinkVerificationCruise");
プロジェクトから、モデル
simulinkCruiseErrorAndStandardsExample
を開きます。
コード ジェネレーター チェックの実行
コード生成アドバイザーを使用してモデルをチェックします。MISRA C との準拠性がより高く、Polyspace との互換性がより高いコードを生成するようにコード生成パラメーターを構成します。
Compute target speed を右クリックして [C/C++ コード] 、 [コード生成アドバイザー] を選択します。
[コード生成アドバイザー] フォルダーを選択します。右側のペインで、
[Polyspace]
を [選択した目的 - 優先順位] に移動します。[MISRA C:2012 ガイドライン]
オブジェクティブは既に選択されています。[選択したチェックを実行] をクリックします。
コード生成アドバイザーで、モデルに MISRA C:2012 準拠や Polyspace コード解析に推奨されないブロックや構成設定が含まれているかチェックされます。このモデルでは、互換性のないブロックのチェックはパスしますが、一部の構成設定は MISRA 準拠や Polyspace チェックと互換性がありません。
パスしなかったチェックをクリックします。[パラメーターの変更] を選択してパラメーターの変更を受け入れます。
[このチェックを実行] を選択してチェックの実行に戻ります。
モデル アドバイザー チェックの実行
モデルからコードを生成する前に、モデル アドバイザーを使用して、モデルが MISRA C および Polyspace に準拠しているかチェックします。この例では、コードを生成する前に、モデル アドバイザーを使用してモデルをチェックする方法を説明します。
[コード生成アドバイザー] ウィンドウの下部で、[モデル アドバイザー] を選択します。
[タスク別] フォルダーで、[MISRA C:2012 のモデリング標準] アドバイザー チェックを選択します。
[チェックの実行] をクリックして結果を確認します。
いずれかのタスクが失敗した場合は、推奨される変更を行って、MISRA モデリング ガイドラインがパスするまでチェックを再実行します。
コードの生成と解析
モデル準拠チェックが完了したら、コードを生成できます。Polyspace を使用すると、コードが MISRA C:2012 に準拠しているかどうかをチェックし、MISRA C:2012 との準拠を示すレポートを生成できます。
Simulink® エディターで、Compute target speed を右クリックして、[C/C++ コード] 、 [このサブシステムをビルド] を選択します。
調整可能なパラメーターの既定の設定を使用して、[ビルド] を選択します。
コードが生成されたら、Simulink エディターで、Compute target speed を右クリックして、[Polyspace] 、 [オプション] を選択します。
[構成] をクリックして、Polyspace コンフィギュレーション ウィンドウで、より高度な Polyspace 解析オプションを選択します。
左側のペインで、[コーディング規約およびコード メトリクス] をクリックしてから、[コード メトリクスの計算] を選択して、生成されたコードのコード メトリクス計算を有効にします。
Polyspace コンフィギュレーション ウィンドウを保存して閉じます。
モデルから、Compute target speed を右クリックして、[Polyspace] 、 [検証] 、 [選択したサブシステムについて生成されたコード] を選択します。
Polyspace Bug Finder™ が、MISRA チェックのサブセットを対象として、生成されたコードを解析します。解析の進行状況は、MATLAB® コマンド ウィンドウで確認できます。解析が完了すると、Polyspace 環境が開きます。
結果の確認
Polyspace 環境に、静的コード解析の結果が表示されます。
ルール 8.7 のツリーを展開してさまざまな結果をクリックしていきます。
ルール 8.7 では、関数またはオブジェクトがローカルである場合、その関数およびオブジェクトをグローバルにしてはならないと定められています。8.7 の違反をクリックしていくと、これらの結果の参照先が、他のコンポーネントでも使用している
CruiseOnOff
などの変数であることがわかります。コードまたはモデルに注釈を付けて、それぞれの結果を正当化できます。このモデルはより大きいプログラムの一部であるため、解析の構成を変更して MISRA ルールのサブセットのみをチェックすることもできます。モデルで、Compute target speed を右クリックして、[Polyspace] 、 [オプション] を選択します。
[検証設定] オプションを
[プロジェクト コンフィギュレーション]
に設定して、Polyspace コンフィギュレーションで MISRA ルールのサブセットを選択します。[構成] をクリックします。
Polyspace ウィンドウの左側のペインで、[コーディング規約およびコード メトリクス] をクリックします。次に、[MISRA C:2012 のチェック] を選択し、ドロップダウン リストから
[単一単位ルール]
を選択します。これで、Polyspace は、単一単位に該当する MISRA C:2012 ルールのみをチェックします。Polyspace コンフィギュレーション ウィンドウを保存して閉じます。
新しい構成で解析を再実行します。
Polyspace で前にルールが表示されていたのは、モデルが単独で解析されたためです。Polyspace がチェックしたルールを単一単位サブセットに限定したところ、Polyspace では違反は 2 つだけ見つかりました。
このモデルを親モデルに統合したら、MISRA C:2012 の残りのルールを追加できます。
レポートの生成
MISRA C:2012 への準拠を示し、生成されたコード メトリクスに関してレポートするには、結果をエクスポートしなければなりません。解析を実行するたびにレポートを生成する場合は、レポートの生成
(Polyspace Bug Finder)を参照してください。
結果をまだ開いていない場合は、Polyspace 環境で開きます。
ツール バーから、[レポート] 、 [レポートの実行] を選択します。
レポートの種類として [BugFinderSummary] を選択します。
[レポートの実行] をクリックします。
レポートは結果と同じフォルダーに保存されます。
レポートを開くには、[レポート] 、 [レポートを開く] を選択します。
ソフトウェアインザループ テストを使用したモデルに対するコードのテスト
以前に、モデル機能がその要件を満たしていることを、それらの要件に基づくテスト ケースを実行して示しました。ここでは、生成されたコードで同じテスト ケースを実行して、コードが同等の結果を生成し、要件を満たしていることを示します。次に、コード カバレッジとモデル カバレッジを比較して、テストが生成コードを実行した範囲を確認します。
MATLAB のプロジェクト ウィンドウで、
tests
フォルダーを開いた後、SILTests.mldatx
を開きます。テスト マネージャーでファイルが開きます。テスト ケースを確認します。[テスト ブラウザー] ペインで、
SIL Equivalence Test Case
に移動します。この等価性テスト ケースでは、テスト ハーネスを使用して、simulinkCruiseErrorAndStandardsExample
モデルを対象に 2 つのシミュレーションが実行されます。シミュレーション 1 は、ノーマル モードでのモデル シミュレーションです。
シミュレーション 2 は、ソフトウェアインザループ (SIL) シミュレーションです。SIL シミュレーションでは、テスト ケースはモデルを実行するのではなく、モデルから生成されたコードを実行します。
等価性テストでは 1 つの出力信号が記録され、2 つのシミュレーションの結果が比較されます。テスト ケースは、両方のシミュレーションのカバレッジ測定も収集します。
等価性テストを実行します。テスト ケースを選択し、[実行] をクリックします。
テスト マネージャーで結果を確認します。[結果とアーティファクト] ペインで、[SIL Equivalence Test Case] を選択し、テスト結果を確認します。テスト ケースがパスし、結果には、コードで、このテスト ケースのモデルと同じ結果が生成されたことが示されます。
結果の [カバレッジの結果] セクションを展開します。カバレッジ測定では、テスト ケースがモデルとコードを実行した範囲が示されます。複数のテスト ケースを実行する場合は、実行全体の結果に集計されたカバレッジ測定を表示できます。機能テストの実行とテスト カバレッジの解析 (Simulink Check)に示すように、カバレッジ結果を使用してテストを追加し、カバレッジ要件を満たします。
プロセッサインザループ (PIL) シミュレーションを実行して、生成されたコードをターゲット ハードウェアでテストすることもできます。テスト ケースに PIL シミュレーションを追加して、ターゲット ハードウェアで実行するときに、モデルのテスト結果とカバレッジ結果を、生成コードからの結果と比較できます。詳細については、Code Verification Through Software-in-the-Loop and Processor-in-the-Loop Execution (Embedded Coder)を参照してください。
関連するトピック
- Embedded Coder によって生成されたコードに対する Polyspace 解析の実行 (Polyspace Bug Finder)
- Test Two Simulations for Equivalence (Simulink Test)
- テスト結果のエクスポート (Simulink Test)