Запустите анализ Polyspace пользовательского кода в функциональном блоке C

Можно запустить анализ Polyspace® пользовательского кода С в блоке C Function (Simulink) из Simulink®. Polyspace проверяет на наличие ошибок пользовательский код С и ошибки, храня определенную информацию модели, такие как спецификация области значений проекта, природа и количество входных параметров, которые заданы в модели Simulink.

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

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

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

open_system('psdemo_model_link_sl_cscript');

Открытая модель для рабочего анализа Polyspace пользовательского кода в функциональном блоке C

Модель содержит Функциональный блок C под названием Command Strategy в controller подсистема.

Command Strategy блок реализует интерполяционную таблицу с помощью пользовательского кода С и выводит значение result на основе двух входных параметров x и y.

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

Запустите анализ Polyspace из редактора Simulink

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

  1. Выберите Bug Finder или Code Prover из выпадающего списка, расположенного в крайнем левом углу вкладки Polyspace.

  2. Чтобы запустить анализ Polyspace пользовательского кода С в блоке C Function, выберите Custom Code Used in Model из выпадающего списка в разделе Analyze.

  3. Чтобы запустить анализ Polyspace, нажмите кнопку Run Analysis. Командное окно MATLAB отображает прогресс анализа.

  4. После анализа пользовательский интерфейс Polyspace открывается результатами. Можно принять решение не открыть результаты автоматически после анализа путем отмены выбора Open results automatically after verification в Settings. Чтобы открыть результаты после, анализ закончен, нажмите кнопку Analysis Results.

  5. Чтобы видеть все результаты анализа Polyspace, нажмите Clear active filters от Showing выпадающий список в панели Results List. Если при запуске анализ Code Prover, результаты для подсистемы контроллера содержат две красных проверки и оранжевую проверку.

  6. Чтобы организовать результаты семейством, кликнитеsquare drop down menu и выберите Family.

Чтобы переключиться между Bug Finder и анализом Code Prover, возвратитесь к Редактору Simulink от пользовательского интерфейса Polyspace. Выберите Bug Finder или Code Prover из выпадающего списка, расположенного в крайнем левом углу вкладки Polyspace, и повторно выполните анализ.

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

Можно запустить анализ Polyspace Code Prover™ пользовательского кода для этой модели от редактора MATLAB или Командного окна с помощью этого кода:

% Load the model 'psdemo_model_link_sl_cscript'
load_system('psdemo_model_link_sl_cscript');
% Create a 'pslinkoptions' object
mlopts = pslinkoptions('psdemo_model_link_sl_cscript'); 
% Specify whether to run 'CodeProver' or 'BugFinder' Analysis
mlopts.VerificationMode = 'CodeProver';
% Specify custom code as analysis target and run the analysis
pslinkrun('-slcc','psdemo_model_link_sl_cscript',mlopts);

Идентифицируйте проблемы в коде С

Чтобы идентифицировать проблемы в пользовательском коде С, используйте информацию в панели Result Details и панели Source пользовательского интерфейса Polyspace. Если вы не видите эти панели, перейдите к Window> Show/Hide View и выберите недостающую панель. Для получения дополнительной информации на панелях, смотрите Детали Результата и Источник.

Идентифицируйте вводы и выводы функционального блока C в исходной панели

Polyspace переносит код в блок C Function в обертке пользовательского кода. Вводы и выводы блока C Function объявляются как глобальные переменные. Пользовательский код С называется как функция.

/* Variables corresponding to inputs ..*/
// global In... 
/* Variables corresponding to outputs*/
// global Out...
/* Wrapper functions for code in block  */
// void ...(void){
    //...
}

  • Соответствие глобальных переменных входным параметрам запускается с In, такой как In1_psdemo_model_link_sl_cscript_98_Command_strategy.

  • Соответствие глобальных переменных выходным параметрам запускается с Out, такой как Out1_psdemo_model_link_sl_cscript_98_Command_strategy.

  • void-void функция содержит пользовательский код С с переменными ввода и вывода, замененными глобальными переменными. Если у вас есть несколько блоков C Function, то код в каждом блоке перенесен в отдельные функции.

Глобальные переменные отражают все свойства ввода и вывода блока C Function, включая их область значений данных, тип данных и размер. Если у вас есть несколько входных параметров, то порядок глобальных переменных совпадает с порядком входа, заданного в блоке C Function. Эта таблица показывает переменные ввода и вывода блока в этом примере и их соответствующих глобальных переменных в панели Source.

Имя глобальной переменной в панели SourceОсциллографИмя переменной в функциональном блоке C
In1_psdemo_model_link_sl_cscript_98_Command_strategyВходной параметрx
In2_psdemo_model_link_sl_cscript_98_Command_strategyВходной параметрy
Out1_psdemo_model_link_sl_cscript_98_Command_strategyВывод result

Идентифицируйте проблемы в пользовательском коде путем рассмотрения перенесенного кода в панели Source. Используйте подсказку в панели Source и информацию в панели Result Details, чтобы устранить проблемы. Этот рабочий процесс применяется к Code Prover и исследованиям Bug Finder.

Незаконно разыменованный указатель

Красная проверка Illegally dereferenced pointer подсвечивает операцию разыменования после for цикл.

tmp = *p + 5;
Панель Result Details утверждает что указатель *p находится вне его границ. Чтобы найти первопричину проверки, следуйте за жизненным циклом продвижения указателя к недопустимому разыменованию.

  1. В начале его жизненного цикла, указатель *p точки к первому элементу array который имеет 100 элементов.

  2. Затем p постепенно увеличивается 100 раз, указывая *p к несуществующему местоположению array[100].

  3. Операция разыменования в tmp = *p+5; становится недопустимым, вызывая красную проверку.

За пределы индекс массива

Красная проверка Out of Bounds array index подсвечивает операцию индексации массива в if условие.

 if (another_array[return_val - i + 9] != 0)
Панель Result Details утверждает что размер another_array 2 в то время как значение индекса return_val-i+9 диапазоны от 2 до 18. Чтобы найти первопричину проверки, отследите значения переменных return_val и i использование подсказки. Когда вы наводите на любой экземпляр переменных в панели Source, подсказка отображена.

  1. Значение i 100.

  2. Значение return_val диапазоны от 93 до 109 из-за преобладающего условия: if ((return_val > 92) && (return_val < 110)).

  3. Значение индекса (return_val-i+9) оценивает к области значений 2 - 18.

  4. Значения индекса выходят за пределы для массива another_array, порождение красной проверки.

Переполнение

Оранжевая проверка Overflow подсвечивает присвоение на return_val. Панель Result Details утверждает, что проверка связана с ограниченными входными значениями. Чтобы найти первопричину проверки, проверяйте тип данных и соответствующую область значений переменных при помощи подсказки.

  • Входные значения x и y соответствуйте этим соответствующим глобальным переменным

    • In1_psdemo_model_link_sl_cscript_98_Command_strategy

    • In2_psdemo_model_link_sl_cscript_98_Command_strategy

  • Первый вход x несвязанное беззнаковое целое. Поскольку x развязан, это имеет полный спектр беззнакового целого, которое является от 0 до 65 535.

  • Второй вход y ограниченное беззнаковое целое в пределах от от 0 до 1 023.

  • x-y присвоен несвязанному целому числу со знаком return_val. Поскольку return_val развязан, это имеет полный спектр от-32768 до 32 767.

  • Область значений x-y 1 023 - 65 535, в то время как область значений return_val -32768 к 32 767.

  • Некоторые возможные значения x-y не может поместиться в return_val, порождение оранжевой проверки.

Для получения дополнительной информации об интерпретации результатов анализа Polyspace Bug Finder™, смотрите, Интерпретируют Результаты Polyspace Bug Finder.

Устраните идентифицированные проблемы

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

Незаконно разыменованный указатель

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

  1. Возвратитесь к Редактору Simulink и дважды кликните на блоке C Function, чтобы открыть пользовательский код.

  2. Используйте оператор индекса на array получить доступ к допустимому индексу массива. Можно получить доступ к индексам от 0 до 99 потому что array имеет 100 элементов. Доступ к индексам вне этой области значений приводит к ошибке времени выполнения в Simulink.

    // access any index between 0 to 99
    tmp = array[50] + 5; 
    В качестве альтернативы присвойте адрес допустимой ячейки памяти к p перед операцией разыменования. Например, *p может указать на 51-й элемент в array.
    // After the for loop, point p to a valid memory location
    p = &(array[50]);
    // ...
    tmp = *p + 5;
    

За пределы индекс массива

Можно обратиться к этой регистрации нескольких путей. Измените код так, чтобы размер another_array[] остается больше, чем или равный значению индекса return_val-i+9.

  1. Возвратитесь к Редактору Simulink и дважды кликните на блоке C Function, чтобы открыть пользовательский код.

  2. Измените преобладающее условие на return_val так, чтобы значение индекса return_val-i+9 всегда оценивает к 0 или 1.

    if ((return_val > 91) && (return_val < 92))
    //...
    
    В качестве альтернативы объявите another_array с размером 19.
    int another_array[19];

Переполнение

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

  1. Возвратитесь к редактору Simulink.

  2. Насыщайте входные переменные x и y в модели так, чтобы их различие могло поместиться в 16-битное целое число. Рабочий процесс для фиксации Overflow при помощи блоков насыщения описан в Запущенном Анализе Polyspace Пользовательского кода в Блоках Вызывающей стороны C и диаграммах Stateflow.

В качестве альтернативы увеличьте размер return_val в пользовательском коде С, чтобы вместить x-y.

  1. Возвратитесь к Редактору Simulink и дважды кликните на блоке C Function, чтобы открыть пользовательский код.

  2. Объявите return_val как 32-битное целое число.

    int32_T return_val;

Для получения дополнительной информации об обращении к результатам Polyspace, смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

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

|

Похожие темы