Запустите анализ Polyspace пользовательского кода в блоках вызывающей стороны C и диаграммах Stateflow

Можно проверять на ошибки и ошибки времени выполнения в пользовательском коде C/C++, используемом в модели Simulink®. Анализ Polyspace® проверяет функции, вызванные от блоков Вызывающей стороны C и графиков Stateflow® с входными параметрами из модели.

Необходимые условия

Прежде чем вы запустите Polyspace от Simulink, необходимо соединить Polyspace и установки MATLAB®. Смотрите Интегрируют Polyspace с MATLAB и Simulink.

Чтобы открыть модели, используемые в этом примере, ищите этот пример в Браузере документации MATLAB и нажмите кнопки Open Model.

Функция C/C++, Вызванная Однажды в Модели

Этот пример использует функцию, вызванную только однажды в модели от блока C Caller (Simulink). Анализ проверяет входные параметры использования функции с блоком C Caller.

Открытая модель для выполнения анализа пользовательского кода

Откройте модель mSlccBusDemo для анализа пользовательского кода с Polyspace. Модель содержит блок C Caller, который вызывает функциональный counterbusFcn заданный в файле hCounterBus.c (объявленный в файле hCounterBus.h). Модель использует переменные, сохраненные в файле MAT dLctData.mat, который загружается в модели с помощью коллбэка.

Запустите анализ

Сконфигурируйте аналитические опции и Polyspace запуска.

  1. На вкладке Apps выберите Polyspace Code Verifier, чтобы открыть вкладку Polyspace.

  2. Задайте тип анализа:

    • Выберите продукт, чтобы запуститься, Bug Finder или Code Prover.

    • Укажите, что анализ должен работать на пользовательском коде в модели вместо сгенерированного кода.

      Поле Analyze Code from показывает имя модели. Ниже поля, вместо Code Generated as Top Model, выбирают Custom Code Used in Model.

  3. Выберите Run Analysis.

    Следуйте за прогрессом анализа в командном окне MATLAB. После анализа, на вкладке Polyspace, выбирают Analysis Results. Результаты открываются в пользовательском интерфейсе Polyspace.

Можно также запустить тот же анализ из MATLAB можно следующим образом. Скрипт включает команды, чтобы загрузить модель и .mat переменные содержащего файла используются в модели.

load_system('mSlccBusDemo');
load('dLctData.mat');

mlopts = pslinkoptions('mSlccBusDemo'); 
mlopts.VerificationMode = 'CodeProver'; 
pslinkrun('-slcc','mSlccBusDemo',mlopts);

Устраните проблемы

Результаты анализа появляются на панели Results List в пользовательском интерфейсе Polyspace. Выберите каждый результат и смотрите более подробную информацию о панели Result Details и соответствующий исходный код на панели Source.

Остальная часть этого примера показывает, как исследовать и устранить проблемы, найденные в анализе Программы автоматического доказательства Кода. Подобные шаги могут быть выполнены для проблем, найденных со Средством поиска Ошибки.

Если при запуске анализ Программы автоматического доказательства Кода, результаты содержат оранжевую проверку Overflow.

Проверка подсвечивает операцию сложения в counterbusFcn функция, которая может переполниться:

limit = u1->inputsignal.input + u2;
Операнды прибывают от входных параметров до counterbusFcn, которые в свою очередь прибывают от этих входных параметров до блока C Caller:

  • Сигнал шины COUNTERBUS, который комбинирует сигналы input, upper_saturation_limit и lower_saturation_limit. input сигнала неограниченно.

  • Обратная связь от самого блока C Caller через блок Delay.

Можно ограничить input сигнала несколькими способами. Например, можно ограничить переменную сигнала шины SIGNALBUS это прибывает из input:

  1. В Редакторе Simulink откройте Model Explorer от вкладки Modeling.

  2. Переменные базового рабочего пространства содержат переменную SIGNALBUS. Выберите эту переменную и откройте редактор шины, чтобы отредактировать эту переменную. Задайте минимальное и максимальное значение для переменной.

    Сохраните объект шины в MAT-файле. Можно перезаписать файл dLctData.mat или создайте файл.

Можно также ограничить обратную связь от блока C Caller несколькими способами. Например, можно насыщать сигнал обратной связи:

  1. Добавьте блок Saturation сразу, прежде чем сигнал обратной связи будет введен с блоком C Caller.

  2. На вкладке Signal Attributes задайте минимальное и максимальное значение для блока Saturation выход.

    Обратите внимание на то, что определение нижнего и верхнего предела вкладки Main блока Saturation не достаточно, чтобы ограничить сигнал для анализа Polyspace. Анализ использует диапазоны проекта, указанные на вкладке Signal Attributes.

Повторно выполните анализ. Регистрация Overflow нового набора результатов является зеленой.

Функция C/C++, Вызванная Многократно в Модели

Этот пример использует функцию, вызванную от нескольких блоков Вызывающей стороны C в модели. Функция просто возвращает продукт своих двух аргументов.

Пример запускает анализ Программы автоматического доказательства Кода и показывает, как определить контекст вызова функции, начинающий с результатов Программы автоматического доказательства Кода. Как правило, в анализе Средства поиска Ошибки, вы не должны различать различные контексты вызова.

Открытая модель для анализа всего пользовательского кода

Откройте модель multiCCallerBlocks для рабочего анализа Polyspace.

Смотрите модель

Модель содержит два блока Вызывающей стороны C, вызывая тот же функциональный times_n. Входные параметры с одним блоком C Caller прибывают из двух блоков Inport, которые имеют неограниченный вход. Входные параметры с другим блоком C Caller прибывают из блока Constant и блока Inport, которому ограничил вход блок Saturation.

Видеть проект располагается для блока C Caller, который ограничил входные параметры:

  • Дважды кликните блок Constant или блок Saturation.

  • На вкладке Signal Attributes отметьте область значений проекта.

    Например, несмотря на то, что блоку Constant установили постоянное значение на 3, область значений проекта для верификации 2.5 к 3,5.

    Область значений проекта для блока Saturation [-1,1].

Запустите анализ и рассмотрите результаты

Запустите анализ как в предыдущем примере и откройте результаты.

Панель Results List показывает оранжевую проверку Overflow. Продукт в times_n функциональное переполнение.

#include "file.h"

double times_n(double x, double n) {
  return x * n;
}
Поскольку times_n функция вызвана от двух контекстов, оранжевый цвет комбинирует оба контекста и может указать на две возможных ситуации:

  • Переполнение происходит в обоих контекстах вызова.

  • Переполнение, как доказывают, не происходит в одном контексте (зеленая проверка) и может произойти в другом контексте (оранжевая проверка).

Чтобы определить, какой контекст вызова приводит к переполнению:

  1. Смотрите все вызывающие стороны times_n.

    Выберите оранжевую проверку Overflow. На панели Result Details щелкнуть. Панель Call Hierarchy показывает вызывающим сторонам times_n.

  2. На панели Call Hierarchy вы рассматриваете две функции обертки как вызывающие стороны. Каждая функция обертки представляет блок C Caller в модели.

    Выберите одну из функций обертки, чтобы открыть исходный код для customcode_wrappers.c.

  3. На панели Source смотрите код для функций обертки. Чтобы определить который входной вывод к переполнению, используйте подсказки на подчеркнутых входных параметрах.

    Например, обертка функционируют для блока C Caller, который ограничил входные взгляды, похожие на этот код:

    /* Go to model '<Root>/C Caller1' */
    /* Variables corresponding to inputs for block C Caller1 */
     real64_T _pslink_C_Caller1_In1;
     real64_T _pslink_C_Caller1_In2;
    /* Variables corresponding to outputs for block C Caller1 */
     real64_T _pslink_C_Caller1_Out1;
    /* Wrapper functions for code in block C Caller1 */
    void _pslink_step_C_Caller1(void) {
        /* See tooltips on function inputs for input ranges */
        _pslink_C_Caller1_Out1 = times_n(_pslink_C_Caller1_In1, _pslink_C_Caller1_In2);
    }
    Используйте подсказки на переменных, чтобы определить их области значений. Например, подсказка на переменной _pslink_C_Caller1_In1 показывает, что это находится в области значений [2.5, 3.5] и подсказка на _pslink_C_Caller1_In2 показывает, что это находится в области значений [-1,1]. Поэтому продукт двух входных параметров не может переполниться. Переполнение должно прибыть из другого контекста вызова. Вы видите подсказки на входных параметрах к другому вызову и подтверждаете, что переменные неограниченны.

    Чтобы определить местоположение блока C Caller, соответствующего функции обертки, на панели Source, щелкают по синей ссылке имени блока выше функции обертки (на линии начиная с Go to model). Блок C Caller подсвечен в модели.

Включите чувствительность контекста и повторно выполненный анализ

В этом примере функция достаточно проста, который можно определить, какой контекст вызова приводит к переполнению от самих входных параметров функции. Для более комплексных функций можно сконфигурировать анализ, чтобы показать результаты этих двух контекстов отдельно.

Поскольку различение контекстов вызова включает более глубокий анализ, анализ может занять больше времени. Поэтому включите чувствительность контекста только для определенных функций и только если вы не можете отличить контексты вызова контролем.

В этом примере, чтобы включить чувствительность контекста для times_n функция:

  1. В вашей модели, на вкладке Polyspace, выбирают Settings> Project Settings.

    В качестве альтернативы в пользовательском интерфейсе Polyspace, выберите Project Browser. Откройте настройку проекта, созданного для анализа.

  2. На Code Prover Verification> узел Precision, выберите custom для опции Sensitivity context. В поле Procedure кликнитеplus button и введите times_n.

    См. также Sensitivity context (-context-sensitivity).

Повторно выполните анализ из модели и вновь откройте результаты. Выберите оранжевую проверку Overflow.

Панель Result Details показывает контексты вызова отдельно. Вы видите, что переполнение происходит только для вызова с неограниченными входными параметрами (строка с оранжевым текстом) и не происходит для другого вызова (строка с зеленым текстом).

Кликните по строке с оранжевым текстом, чтобы непосредственно перейти к функции обертки, ведущей к оранжевой проверке. От функции обертки можно перейти с блоком C Caller с неограниченными входными параметрами.

Смотрите также

|

Похожие темы