Можно запустить анализ Polyspace® пользовательского кода С в блоке C Function из Simulink®. Polyspace проверяет на наличие ошибок пользовательский код С и ошибки при хранении областей значений проекта и другой зависящей от контекста информации заданными в модели Simulink.
Прежде чем вы запустите Polyspace от Simulink, необходимо соединить Polyspace и установки MATLAB®. Смотрите Интегрируют Polyspace с MATLAB и Simulink.
Чтобы открыть модель, используемую в этом примере, ищите эту тему в Браузере документации MATLAB и нажмите кнопку Open Model. В качестве альтернативы можно вставить и запустить следующий код из Окна Команды MATLAB.
open_system('psdemo_model_link_sl_cscript');
Модель содержит Функциональный блок C под названием Command Strategy
в controller
подсистема.
Command Strategy
блок реализует интерполяционную таблицу с помощью пользовательского кода С и выводит значение result
на основе двух входных параметров x
и y
.
Кликните по вкладке Apps и выберите Polyspace Code Verifier, чтобы открыть вкладку Polyspace.
Выберите Bug Finder или Code Prover из выпадающего списка, расположенного в крайнем левом углу вкладки Polyspace.
Чтобы запустить анализ Polyspace пользовательского кода С в блоке C Function, выберите Custom Code Used in Model из выпадающего списка в разделе Analyze.
Чтобы запустить анализ Polyspace, нажмите кнопку Run. Окно Команды MATLAB отображает прогресс анализа.
После анализа, чтобы открыть пользовательский интерфейс Polyspace результатами, нажимают кнопку Analysis Results. Можно принять решение открыть результаты автоматически после анализа путем выбора Open results automatically after verification in Settings.
Чтобы видеть все результаты анализа Polyspace, нажмите Clear active filters от Showing выпадающий список в панели Results List. Если при запуске анализ Code Prover, результаты для подсистемы контроллера содержат две красных проверки и оранжевую проверку.
Чтобы организовать результаты семейством, кликните и выберите Family.
Чтобы переключиться между Bug Finder и анализом Code Prover, возвратитесь к Редактору Simulink от пользовательского интерфейса Polyspace. Выберите Bug Finder или Code Prover из выпадающего списка, расположенного в крайнем левом углу вкладки Polyspace, и повторно выполните анализ.
Можно запустить анализ 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 и выберите недостающую панель. Для получения дополнительной информации на панелях, смотрите Детали Результата и Источник.
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;
*p
находится вне его границ. Чтобы найти первопричину проверки, следуйте за жизненным циклом продвижения указателя к недопустимому разыменованию.
В начале его жизненного цикла, указатель *p
точки к первому элементу array
который имеет 100 элементов.
Затем p
постепенно увеличивается 100 раз, указывая *p
к несуществующему местоположению array[100]
.
Операция разыменования в tmp = *p+5;
становится недопустимым, вызывая красную проверку.
Красная проверка Out of Bounds array index подсвечивает операцию индексации массива в if
условие.
if (another_array[return_val - i + 9] != 0)
another_array
2 в то время как значение индекса return_val-i+9
диапазоны от 2 до 18. Чтобы найти первопричину проверки, отследите значения переменных return_val
и i
использование подсказки. Когда вы наводите на любой экземпляр переменных в панели Source, подсказка отображена.
Значение i
100.
Значение return_val
диапазоны от 93 до 109 из-за преобладающего условия: if ((return_val > 92) && (return_val < 110))
.
Значение индекса (return_val-i+9)
оценивает к области значений 2 - 18.
Значения индекса выходят за пределы для массива 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.
Можно обратиться к этой регистрации нескольких путей. Измените код С так, чтобы к несуществующему адресу памяти не получали доступ.
Возвратитесь к Редактору Simulink и дважды кликните на блоке C Function, чтобы открыть пользовательский код.
Используйте оператор индекса на 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
.
Возвратитесь к Редактору Simulink и дважды кликните на блоке C Function, чтобы открыть пользовательский код.
Измените преобладающее условие на return_val
так, чтобы значение индекса return_val-i+9
всегда оценивает к 0
или 1
.
if ((return_val > 91) && (return_val < 92)) //...
another_array
с размером 19.int another_array[19];
Можно обратиться к этой регистрации нескольких путей также. Измените код С или модель так, чтобы область значений правой стороны операции присвоения осталась равной или больше, чем та из левой стороны.
Возвратитесь к редактору Simulink.
Насыщайте входные переменные x
и y
в модели так, чтобы их различие могло поместиться в 16-битное целое число. Рабочий процесс для фиксации Overflow при помощи блоков насыщения описан в Запущенном Анализе Polyspace Пользовательского кода в Блоках Вызывающей стороны C и диаграммах Stateflow.
В качестве альтернативы увеличьте размер return_val
в пользовательском коде С, чтобы разместить x-y
.
Возвратитесь к Редактору Simulink и дважды кликните на блоке C Function, чтобы открыть пользовательский код.
Объявите return_val
как 32-битное целое число.
int32_T return_val;
Для получения дополнительной информации об обращении к результатам Polyspace, смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.