Пример обнаружения несвязанного доступа к массивам Модели

В этом примере показано, как обнаружить внешние ошибки доступа к массиву и просмотреть результаты анализа. В sldvdemo_array_bounds пример модели, блок ComputeIndex MATLAB Function использует значения входного сигнала, чтобы определить область значений индексов с минимальными minIdx и максимальное maxIdx. Блоки ArrayOp_Matlab, ArrayOp_MAL и ArrayOp_SF используют набор целочисленных индексов между minIdx и maxIdx для доступа к элементам массива и выполнения операций над массивами.

Шаг 1: Откройте модель

В командной строке введите:

open_system('sldvdemo_array_bounds');

Шаг 2: Выполните Поиск ошибок проектирования анализ

Опции анализа в модели предварительно сконфигурированы для выявления ошибок внешнего доступа к массиву. Чтобы просмотреть эти опции, в редакторе Simulink Editor дважды нажмите кнопку View Options.

Чтобы выполнить поиск ошибок проектирования анализ, в редакторе Simulink Editor дважды нажмите кнопку Run. Откроется окно Simulink ® Design Verifier™ Сводные Данные, в котором отображается прогресс анализа. Когда анализ завершается, пример модели подсвечивается результатами анализа.

Шаг 3: Обзор результатов анализа

Чтобы просмотреть результаты анализа внутри графика, дважды кликните блок ArrayOp_SF Chart, выделенный красным цветом.

Simulink Design Verifier обнаруживает, что индекс из связанных ошибок происходит в массиве u в состоянии Diff.

Шаг 4: Создайте обвязку и симулируйте тесты

Щелкните первую ссылку View тест. Simulink Design Verifier создает и открывает модель тестовой обвязки, содержащую тесты, которые демонстрируют несвязанные ошибки доступа к массиву. В диалоговом окне Signal Builder нажмите Start simulation, чтобы симулировать модель тестовой обвязки с Тест 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 ® Debugger открытым в этой точке останова. В sldvdemo_array_bounds_harness удерживая курсор над состоянием Diff, чтобы увидеть значения данных в этой точке останова симуляции.

Используя значения входного сигнала Тест 2, блок ComputeIndex MATLAB Function определяет область значений индексов массива как 1:4. Одноуровневая индексация согласуется с синтаксисом MATLAB, поэтому эти индексы действительны для ArrayOp_Matlab Function блока MATLAB и диаграммы ArrayOp_MAL Stateflow ®.

Диаграмма ArrayOp_SF Stateflow ® использует C в качестве языка действий, который не поддерживает индексацию на основе одного. Таким образом, 1:4 не является допустимой индексной областью значений для доступа к массиву на графике. Допустимая область значений индексов для доступа к массиву на графике: 0:3, как сообщается в сообщении об ошибке. Когда maxIdx или minIdx вычисляет значение 4, в блоке ArrayOp_SF Chart возникает ошибка доступа к несвязанному массиву. Для получения дополнительной информации о поддержке индексации с нулем, смотрите Различия между MATLAB и C как синтаксис языка действий (Stateflow).