检测超出范围的数组访问示例模型
此示例显示如何检测超出范围的数组访问错误并查看分析结果。在 sldvdemo_array_bounds
示例模型中,ComputeIndex MATLAB 函数模块使用输入信号值来确定最小值为 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 创建并打开一个包含测试用例的框架模型,演示超出边界的数组访问错误。在信号编辑器对话框中,点击全部运行以使用测试用例2仿真框架模型。
仿真在进入 Diff 状态之前停止。Stateflow ® 调试器打开。显示以下错误:
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 ® 调试器在此断点处打开。在 sldvdemo_array_bounds_harness
模型中,将光标悬停在 Diff 状态上以查看此仿真断点处的数据值。
使用测试用例2 的输入信号值,ComputeIndex MATLAB 函数模块确定数组索引的范围为 1:4。基于一的索引与 MATLAB 语法一致,因此这些索引对于 ArrayOp_Matlab MATLAB 函数模块和 ArrayOp_MAL Stateflow ® 图表有效。
ArrayOp_SF Stateflow ® 图表使用 C 作为动作语言,不支持基于一的索引。因此,1:4 不是图表中数组访问的有效索引范围。正如错误消息所报告的,图表中数组访问的有效索引范围是 0:3。当 maxIdx 或 minIdx 的计算结果为 4 时,ArrayOp_SF Chart模块中会发生超出范围的数组访问错误。有关从零开始的索引支持的更多信息,请参阅 使用 MATLAB 和 C 作为动作语言语法时的差异 (Stateflow) 。