Преобразование из int16 в unsigned int16 может переполниться - PullRequest
0 голосов
/ 01 февраля 2019

После проверки кода Polyspace я получаю «преобразование из int16 в unsigned int16 может переполниться».

uint16 lData = 0x00u;
sint16 AnalogInputValue;
lData = (uint16)AnalogInputValue; => This line causes Polyspace error

Должно ли приведение типа выполнять работу?Согласно Polyspace №:

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Следующие две строки делают одно и то же:

lData = AnalogInputValue;
lData = (uint16)AnalogInputValue;

Почему?Тип назначения lData имеет тип uint16, поэтому значение, хранящееся в переменной AnalogInputValue, необходимо будет преобразовать в uint16 в любом случае.Однако переменная AnalogInputValue имеет тип sint16.

Предупреждение исходит из следующего факта: переменные типа uint16 могут содержать значения в диапазоне 0..65535.Но переменные типа sint16 обычно могут содержать значения в диапазоне -32768..32767.Следовательно, если AnalogInputValue содержит значение в диапазоне -32768 ..- 1, то это значение не может быть представлено uint16.

. Поэтому перед выполнением присваивания можно добавитьнекоторый код вокруг него, который проверяет, что AnalogInputValue не является отрицательным.Это означает, что он имеет значение от 0..32767.Все эти значения могут быть представлены в uint16.А для другого случая, а именно, что проверка показывает, что AnalogInputValue оказывается отрицательным, вам нужно найти какое-то приемлемое решение.

Здесь есть один потенциальный третий сценарий: вы на 100% уверены, что AnalogInputValue никогда не будет иметь отрицательного значения, но логика слишком сложна для Polyspace, чтобы вывести этот факт, или данные поступают из внешнего источника (что, похоже, имеет место в данном случае, поскольку значение называется AnalogInputValue).Затем добавление утверждения перед присвоением можно использовать как средство для указания Polyspace, что оно должно сделать это предположение.

0 голосов
/ 05 февраля 2019

Прежде всего вы должны убедиться, что AnalogInputValue не содержит никаких отрицательных чисел, прежде чем набирать его как uint16.Если вы этого не сделаете, то рискуете потерять данные в приведении типа.

...