检测超出范围的数组访问错误
针对超出范围的数组访问进行设计错误检测
Simulink® Design Verifier™ 设计错误检测分析检测模型中的超出边界的数组访问错误。在仿真中,当您的模型尝试使用无效索引访问数组元素时,会发生超出边界的数组访问错误。
要检测模型中超出范围的数组访问错误:
在 Design Verifier 选项卡的 模式 部分中,选择 设计错误检测 。
点击 Error Detection Settings 。
在配置参数对话框的 设计错误检测窗格中,选择 数组访问越界 。
点击确定。
点击 检测设计错误 。
Simulink Design Verifier 日志窗口打开,显示分析进度。
分析完成后:
该软件通过分析结果突出显示模型。
Simulink Design Verifier 结果对话框打开并显示分析摘要。
注意
如果模型包含超出边界的数组访问错误,则在第一次发生数组访问后,Simulink Design Verifier 将假定数组索引在剩余分析的边界内。因此,即使模型中出现设计错误,根据此假设分析的设计错误检测目标也可能被报告为有效。
检测超出范围的数组访问示例模型
此示例显示如何检测超出范围的数组访问错误并查看分析结果。在 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) 。
对超出范围数组访问设计错误检测的支持限制
Inf
索引值
设计错误检测不支持通过 Inf
进行索引。如果您的模型尝试使用计算结果为 Inf
的索引值访问数组,则设计错误检测不会报告超出范围的数组访问错误,但在仿真中,会发生超出范围的数组访问错误。
带有标量数据输入的 Index Vector 模块
超出范围的数组访问设计错误检测不支持具有标量数据输入的Index Vector模块。如果您的模型包含一个 Index Vector模块,该模块指定标量数据输入而不是矢量数据输入,并且控制输入导致超出范围的数组访问,则设计错误检测不会报告错误,但在仿真中会发生错误。