配列の範囲外へのアクセス エラーの検出
配列範囲外アクセスについての設計エラー検出
Simulink® Design Verifier™ の設計エラー検出解析では、モデルにおける、配列の範囲外へのアクセス エラーが検出されます。シミュレーションでは、モデルが無効なインデックスを使用して配列要素にアクセスしようとすると、配列の範囲外へのアクセス エラーが発生します。
モデルで配列の範囲外へのアクセス エラーを検出するには、次の手順に従います。
[Design Verifier] タブの [モード] セクションで、[設計エラー検出] を選択します。
[エラー検出の設定] をクリックします。
[コンフィギュレーション パラメーター] ダイアログ ボックスの [設計エラー検出] ペインで、[範囲外配列アクセス] を選択します。
[OK] をクリックします。
[設計エラーの検出] をクリックします。
Simulink Design Verifier のログ ウィンドウが開き、解析の進行状況が表示されます。
解析が完了すると、
解析結果に基づいてモデルが強調表示されます。
Simulink Design Verifier の [結果] ダイアログ ボックスが開き、解析の概要が表示されます。
メモ
モデルに配列の範囲外へのアクセス エラーが含まれている場合、初めて配列アクセスが行われると、Simulink Design Verifier は、配列インデックスが残りの解析で範囲内であると仮定します。そのため、設計エラーがモデルで発生しても、この仮定後に解析される設計エラー検出オブジェクティブは有効としてレポートされる場合があります。
範囲外配列アクセスの検出のモデル例
この例では、配列の範囲外へのアクセス エラーを検出し、解析結果を確認する方法を示します。モデル例 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)を参照してください。
配列の範囲外へのアクセスの設計エラー検出に対するサポートの制限
Inf
インデックス値
設計エラー検出では、Inf
によるインデックスはサポートされません。Inf
と評価されるインデックス値を使用してモデルが配列にアクセスしようとすると、設計エラー検出は配列の範囲外へのアクセス エラーをレポートしませんが、シミュレーションでは、配列の範囲外へのアクセス エラーが発生します。
スカラー データ入力をもつ Index Vector ブロック
配列の範囲外へのアクセスの設計エラー検出では、スカラー データ入力をもつ Index Vector ブロックはサポートされません。モデルが、ベクトル データ入力の代わりにスカラー データ入力を指定する Index Vector ブロックを含み、制御入力により配列の範囲外へのアクセスが発生する場合、設計エラー検出はエラーをレポートしませんが、シミュレーションではエラーが発生します。