Main Content

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

检测超出范围的数组访问错误

针对超出范围的数组访问进行设计错误检测

Simulink® Design Verifier™ 设计错误检测分析检测模型中的超出边界的数组访问错误。在仿真中,当您的模型尝试使用无效索引访问数组元素时,会发生超出边界的数组访问错误。

要检测模型中超出范围的数组访问错误:

  1. Design Verifier 选项卡的 模式 部分中,选择 设计错误检测

  2. 点击 Error Detection Settings

  3. 在配置参数对话框的 设计错误检测窗格中,选择 数组访问越界

  4. 点击确定

  5. 点击 检测设计错误

    Simulink Design Verifier 日志窗口打开,显示分析进度。

    分析完成后:

    • 该软件通过分析结果突出显示模型。

    • Simulink Design Verifier 结果对话框打开并显示分析摘要。

注意

如果模型包含超出边界的数组访问错误,则在第一次发生数组访问后,Simulink Design Verifier 将假定数组索引在剩余分析的边界内。因此,即使模型中出现设计错误,根据此假设分析的设计错误检测目标也可能被报告为有效。

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

此示例显示如何检测超出范围的数组访问错误并查看分析结果。在 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)

对超出范围数组访问设计错误检测的支持限制

Inf 索引值

设计错误检测不支持通过 Inf 进行索引。如果您的模型尝试使用计算结果为 Inf 的索引值访问数组,则设计错误检测不会报告超出范围的数组访问错误,但在仿真中,会发生超出范围的数组访问错误。

带有标量数据输入的 Index Vector 模块

超出范围的数组访问设计错误检测不支持具有标量数据输入的Index Vector模块。如果您的模型包含一个 Index Vector模块,该模块指定标量数据输入而不是矢量数据输入,并且控制输入导致超出范围的数组访问,则设计错误检测不会报告错误,但在仿真中会发生错误。

相关主题