exponenta event banner

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

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

Предпосылки

Перед запуском Polyspace из Simulink необходимо связать установки Polyspace и MATLAB ®. См. раздел Интеграция полиспейса с MATLAB и Simulink.

Чтобы открыть модель, используемую в этом примере, в окне команд MATLAB выполните следующее:

openExample('polyspace_code_prover/CScriptDemoExample')
open_system('psdemo_model_link_sl_cscript');

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

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

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

Выполнить анализ в пространстве

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

Перейдите на вкладку «Приложения» и выберите «Проверка кода полиспейса», чтобы открыть вкладку «Полиспейс».

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

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

  3. Чтобы запустить анализ Polyspace, нажмите кнопку Выполнить анализ (Run Analysis). В окне команд MATLAB отображается ход выполнения анализа.

  4. После анализа откроется интерфейс пользователя Polyspace с результатами. Можно не открывать результаты автоматически после анализа, отменив выбор пункта Открыть результаты автоматически после проверки в разделе Настройки. Чтобы открыть результаты после завершения анализа, нажмите кнопку Результаты анализа (Analysis Results).

  5. Чтобы просмотреть все результаты анализа Polyspace, щелкните Очистить активные фильтры (Clear active filters) в выпадающем списке Показать (Show) на панели Список результатов (Results List). При выполнении анализа проверки кода результаты для подсистемы контроллера содержат две проверки красного и оранжевого цвета.

  6. Чтобы упорядочить результаты по семейству, щелкнитеsquare drop down menu и выберите Семейство (Family).

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

Выполнить анализ в пространстве из MATLAB

Анализ Prover™ кода Polyspace для пользовательского кода этой модели можно выполнить в редакторе 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);

Выявление проблем в коде C

Чтобы определить проблемы в пользовательском коде C, используйте информацию на панели Сведения о результате (Result Details) и на панели Источник (Source) интерфейса пользователя Polyspace. Если эти панели не отображаются, перейдите в меню «Окно» > «Показать/скрыть вид» и выберите отсутствующую панель. Дополнительные сведения о панелях см. в разделах Сведения о результатах и Источник.

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

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

/* 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 с переменными ввода и вывода, замененными глобальными переменными. При наличии нескольких функциональных блоков C код в каждом блоке переносится в отдельные функции.

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

Имя глобальной переменной в области источникаОбъемИмя переменной в функциональном блоке 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) и сведения на панели Сведения о результатах (Result Details), чтобы устранить проблемы. Этот рабочий процесс применяется к анализам проверки кода и поиска ошибок.

Незаконно дереферентированный указатель

Красный флажок Незаконно деэрессецированный указатель выделяет операцию деэреференции после for цикл.

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

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

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

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

Индекс массива Out of Bounds

Красный индекс массива Check Out of Bounds выделяет операцию индексирования массива в if состояние.

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

  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, что вызвало красный чек.

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

Оранжевая проверка переполнения выделяет назначение 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 до 65535.

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

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

  • Диапазон x-y от 1023 до 65535, в то время как диапазон return_val от -32768 до 32767.

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

Дополнительные сведения о интерпретации результатов анализа проверки кода Polyspace см. в разделе Интерпретация результатов проверки кода в пользовательском интерфейсе Polyspace Desktop.

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

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

Незаконно дереферентированный указатель

Эту проверку можно выполнить несколькими способами. Измените код C таким образом, чтобы не было доступа к несуществующему адресу памяти.

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

  2. Используйте оператор index на 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;
    

Индекс массива Out of Bounds

Эту проверку можно выполнить несколькими способами. Измените код таким образом, чтобы размер 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];

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

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

  1. Вернуться к редактору Simulink.

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

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

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

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

    int32_T return_val;

Дополнительные сведения о адресации результатов Polyspace см. в разделе Адресация результатов Polyspace с помощью исправлений ошибок или обоснований.

См. также

|

Связанные темы