主要内容

检测超出边界的数组访问示例模型

此示例演示如何检测超出边界的数组访问错误并检查分析结果。在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运行按钮。打开Si万博1manbetxmulink®Design Verifier™结果摘要窗口,显示分析的进度。当分析完成时,示例模型将突出显示分析结果。

步骤3:回顾分析结果

要查看图表中的分析结果,双击以红色突出显示的ArrayOp_SF chart块。

万博1manbetxSimulink Design Verifier检测到索引超出绑定错误发生在数组中uin state Diff。

步骤4:创建控制和模拟测试用例

点击第一个查看测试用例链接。万博1manbetxSimulink Design Verifier创建并打开一个包含测试用例的控制模型,演示超出绑定数组的访问错误。在“信号生成器”对话框中,单击开始模拟用测试用例2模拟线束模型。

模拟在进入Diff状态之前停止。Stateflow®调试器打开。显示以下错误:

尝试访问u的索引4,尺寸较小。有效的索引范围是0到3。此错误将停止模拟。在图表'sldvdemo_array_bounds_harness/Test Unit (copy from sldvdemo_array_bounds)/ArrayOp_SF'中状态'Diff': 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作为操作语言,它不支持基于单一的索引。万博1manbetx因此,1:4不是图表中数组访问的有效索引范围。正如错误消息所报告的那样,图表中数组访问的有效索引范围是0:3。当maxIdx或minIdx的计算值为4时,ArrayOp_SF图表块中会出现超出边界的数组访问错误。有关从零开始索引支持的更多信息,请参见万博1manbetx作为动作语言的MATLAB和C的语法差异(Stateflow)