Код, сгенерированный для операции деления с округлением «Floor» и типом выходных данных «int32», генерирует дефект полипространства: «Переполнение преобразования целого числа с изменением знака». Предполагаемое переполнение происходит в коде, где вычисляется абсолютное значение числителя. Когда числитель отрицательный, значение преобразуется в uint32_T перед вычислением дополнения до двух, чтобы сделать его положительным. Я не понимаю, как это может быть переполнено. Это ошибка с Polyspace?

Пример:

int32_T div_s32_floor(int32_T numerator, etc ...)
{
uint32_T absNum;
...
absNum = (numerator < 0) ? ((~((uint32_T)numerator)) + 1U): ((uint32_T)numerator);
...
}
/* function call */
div_s32_floor(int32_t numerator, etc...);

ОТВЕЧАТЬ

Matlabsolutions.com предоставляет последнюю Помощь по домашним заданиям MatLab, Помощь по заданию MatLab для студентов, инженеров и исследователей в различных отраслях, таких как ECE, EEE, CSE, Mechanical, Civil со 100% выходом. Код Matlab для BE, B.Tech , ME, M.Tech, к.т.н. Ученые со 100% конфиденциальностью гарантированы. Получите проекты MATLAB с исходным кодом для обучения и исследований.

Во-первых, два предложения

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

1) Рассмотрите возможность изменения режима округления, указанного в блоке, создающем деление, с нижнего на самый простой. Спецификация C99 требует, чтобы целочисленное деление со знаком округлялось до нуля. Округление до пола скудно для других операций, но требует дополнительной работы для деления. Simplest будет автоматически использовать округление до нуля для деления и пол для других операций, чтобы максимизировать эффективность.

2) Если цель предоставляет тип long long, подумайте о том, чтобы разрешить Embedded Coder использовать его. Это простое изменение установки флажка, которое позволит избежать большей части использования 32-битных вспомогательных функций умножения и деления и даст более эффективный сгенерированный код.

Относительно анализа

Я предполагаю, что Polyspace помечает это выражение C.

((uint32_T)numerator)

Это может привести к переполнению смены знака. Рассмотрим случай, когда числитель имеет значение -1.
Давайте смоделируем это поведение, используя объекты fi.

numerator = fi(-1,1,32,0)
unsignedExpression = removefimath( fi(numerator,0,32,0,'OverflowAction','Wrap') )

Изменение значения с -1 на 4294967295 является примером переполнения при изменении знака, которое помечает Polyspace.

СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ