Main Content

本页采用了机器翻译。点击此处可查看英文原文。

检测超出范围的数组访问示例模型

此示例显示如何检测超出范围的数组访问错误并查看分析结果。在 sldvdemo_array_bounds 示例模型中,ComputeIndex MATLAB 函数模块使用输入信号值来确定最小值为 minIdx、最大值 maxIdx 的索引范围。ArrayOp_Matlab、ArrayOp_MAL 和 ArrayOp_SF 模块使用 minIdxmaxIdx 之间的整数索引集来访问数组元素并执行数组操作。

步骤 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)