このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
範囲外配列アクセスの検出のモデル例
この例では、配列の範囲外へのアクセス エラーを検出し、解析結果を確認する方法を示します。モデル例 sldvdemo_array_bounds
で、ComputeIndex MATLAB Function ブロックは入力信号の値を使用してインデックスの範囲を最小 minIdx
および最大 maxIdx
で決定します。ArrayOp_Matlab、ArrayOp_MAL および ArrayOp_SF ブロックは minIdx
から maxIdx
までの整数インデックスのセットを使用し、配列の要素にアクセスして配列操作を実行します。
手順 1: モデルを開く
コマンド プロンプトで、次を入力します。
open_system('sldvdemo_array_bounds');
手順 2: 設計エラー検出解析の実行
設計エラー検出解析を実行するには、[Design Verifier] タブで [設計エラーの検出] をクリックします。解析の進行を表示する [Simulink® Design Verifier™ の結果の概要] ウィンドウが開きます。解析が完了すると、モデル例は解析結果に基づいて強調表示されます。
手順 3: 解析結果のレビュー
チャート内の解析結果を表示するには、赤で強調表示されている ArrayOp_SF Chart ブロックをダブルクリックします。
Simulink Design Verifier は、状態 Diff の配列 u
でインデックスの範囲外エラーが発生することを検出します。
手順 4: ハーネスの作成とテスト ケースのシミュレーション
最初の [反例を表示] リンクをクリックします。Simulink Design Verifier は、配列の範囲外へのアクセス エラーを示すテスト ケースを含むハーネス モデルを作成して開きます。[信号エディター] ダイアログ ボックスで [すべて実行] をクリックして、Test Case 2 を含むハーネス モデルのシミュレーションを実行します。
Diff 状態になる前にシミュレーションは停止し、Stateflow® Debugger が開きます。次のエラーが表示されます。
Attempted to access index 4 of u with smaller dimension sizes. The valid index range is 0 to 3. This error will stop the simulation. State 'Diff' in Chart 'sldvdemo_array_bounds_harness/Test Unit (copied from sldvdemo_array_bounds)/ArrayOp_SF': y = u[maxIdx] - u[minIdx];
このブレークポイントで Stateflow® Debugger を開いたままにしておきます。sldvdemo_array_bounds_harness
モデル内の Diff 状態の上にカーソルを合わせ、このシミュレーションのブレークポイントでのデータ値を確認します。
ComputeIndex MATLAB Function ブロックは、Test Case 2 入力信号値を使用して、配列のインデックスの範囲が 1:4 であることを判別します。1 ベースのインデックスは MATLAB 構文と一致するため、これらのインデックスは ArrayOp_Matlab MATLAB Function ブロックおよび ArrayOp_MAL Stateflow® チャートで有効です。
ArrayOp_SF Stateflow® チャートはアクション言語として C を使用します。この言語は 1 ベースのインデックスをサポートしていません。したがって、1:4 はチャートの配列アクセスの有効なインデックス範囲ではありません。配列アクセスの有効なインデックス範囲は、エラー メッセージで報告されたように、0:3 です。maxIdx または minIdx が 4 と評価される場合、配列の範囲外へのアクセス エラーが ArrayOp_SF Chart ブロックで発生します。0 ベースのインデックスのサポートの詳細については、アクション言語構文としての MATLAB と C の相違点 (Stateflow)を参照してください。