MISRA 2004: 10.1/R предупреждение
S32 pLeftX;
pLeftX = pos.x - 1; //Getting a Misra 2004: 10.1/R warning for this.
Вот, pos.x
имеет тип int.
2 ответа
Сначала я посмотрю, как настроен инструмент. Каков размер int? В соответствии со стандартом C90 размер int определяется реализацией и может составлять 16 бит или более. Предполагая, что S32 является 32-разрядным целочисленным типом со знаком, я понимаю, что:
- Если размер int составляет 32 бита, то проблем нет.
- Если размер int больше 32 бит, то проблема в том, что существует неявное преобразование в более узкий тип.
- Если размер int меньше 32 бит, то проблема в том, что правая часть присваивания является сложным выражением, а его результат неявно преобразуется в более широкий тип.
Если pos.x
действительно int
а также S32
тип int со знаком, значит, ваш статический анализатор не работает.
Неявное преобразование типов в более широкий тип с той же подписью разрешено правилом 10.1. Если pos.x
это int, то типы в выражении int + int
, Результатом является int
, который всегда подписан. Затем он неявно преобразуется в 32-разрядное целое число со знаком, что нормально.