Main Content

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

範囲外配列アクセスの検出のモデル例

この例では、配列の範囲外へのアクセス エラーを検出し、解析結果を確認する方法を示します。モデル例 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)を参照してください。