检测超出约束的数组访问示例模型
这个示例展示了如何检测超出边界的数组访问错误并检查分析结果。在sldvdemo_array_bounds
示例模型中,ComputeIndex MATLAB函数块使用输入信号值来确定最小索引的范围minIdx
和最大maxIdx
。ArrayOp_Matlab、ArrayOp_MAL和ArrayOp_SF块之间使用一组整数索引minIdx
和maxIdx
访问数组元素并执行数组操作。
步骤1:打开模型
在命令提示符下,输入:
open_system (“sldvdemo_array_bounds”);
步骤2:执行设计错误检测分析
模型中的分析选项预先配置为超出绑定的阵列访问错误检测。要查看这些选项,请在Simulink编辑器中双击万博1manbetx视图选项按钮。
要执行设计错误检测分析,在Simulink编辑器中,双击万博1manbetx运行按钮。将打开S万博1manbetximulink®Design Verifier™结果摘要窗口,显示分析的进度。当分析完成时,示例模型将与分析结果一起突出显示。
步骤3:回顾分析结果
要查看图表中的分析结果,双击以红色突出显示的ArrayOp_SF chart块。
万博1manbetxSimulink设计验证程序检测到数组中出现索引超出边界错误u
在迪夫州。
步骤4:创建线束和模拟测试用例
点击第一个查看测试用例链接。万博1manbetxSimulink Design Verifier创建并打开一个包含测试用例的线束模型,这些测试用例演示了超出约束的数组访问错误。在“信号生成器”对话框中,单击开始模拟用测试用例2来模拟线束模型。
在进入状态Diff之前,模拟停止。Stateflow®调试器打开。显示如下错误:
试图以较小的维度访问u的索引4。取值范围为0 ~ 3。此错误将停止模拟。图'sldvdemo_array_bounds_harness/Test Unit(复制自sldvdemo_array_bounds)/ArrayOp_SF'中的状态'Diff': y = u[maxIdx] - u[minIdx];
在此断点处保持Stateflow®调试器打开。在sldvdemo_array_bounds_harness
模型中,将光标停留在Diff状态上以查看此模拟断点处的数据值。
使用测试用例2输入信号值,ComputeIndex MATLAB函数块确定数组索引的范围为1:4。基于1的索引与MATLAB语法一致,因此这些索引对ArrayOp_Matlab MATLAB函数块和ArrayOp_MAL Stateflow®图表有效。
ArrayOp_SF Stateflow®图表使用C作为操作语言,不支持基于1的索引。万博1manbetx因此,对于图表中的数组访问,1:4不是一个有效的索引范围。如错误消息所示,图表中数组访问的有效索引范围为0:3。当maxIdx或minIdx的值为4时,在ArrayOp_SF Chart块中发生超出界限的数组访问错误。有关从零开始的索引支持的详细信息,请参见万博1manbetxMATLAB与C作为动作语言语法的差异(Stateflow)。