Если побитовые операторы ~ и <<будут применены к операнду с базовым типом символьного или короткого целого без знака без знака, результат должен быть сразу брошен к базовому типу операнда
Примечание
Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.
Если побитовые операторы ~ и <<будут применены к операнду с базовым типом символьного или короткого целого без знака без знака, результат должен быть сразу брошен к базовому типу операнда.
Когда побитовые операторы ~ и << применяются к маленьким целочисленным типам, таким как короткое целое без знака и char без знака, операциям предшествует интегральное продвижение. Таким образом, маленькие целочисленные типы сначала продвинуты на больший целочисленный тип, и затем операция происходит. Результат их битовая операция может содержать неожиданные биты высшего порядка. Например:
uint8_t var = 0x5aU; uint8_t result = (~var)>>4;
var 0101 1010 и тот из ~var 1010 0101. Вы можете ожидать тот result 0000 1010. Поскольку var продвинут на большее целое число перед ~var вычисляется, результат становится 1111 1010. Биты высшего порядка могут быть неожиданными. Результаты таких операций могут зависеть от размера int в вашей реализации.Чтобы избежать беспорядка и неожиданных ошибок, бросьте результат поразрядного ~ и >> операторы назад к базовому типу операндов перед использованием результатов. Например:
uint8_t var = 0x5aU; uint8_t result = (static_cat<unit8_t>(~var))>>4;
result в этом случае 0000 1010, который является ожидаемым значением.Как исключение, не требуется кастинг, если вы применяете эти побитовые операторы на типы короткого целого, и затем сразу присваиваете результат объекту того же базового типа. Например, значением результата в этом случае является 0000 1010 не требуя броска.
uint8_t var = 0x5aU;
unit8_t result = ~var; // No higher order bits
// due to implicit conversion
uint8_t result = results>>4;Polyspace® отмечает использование поразрядного ~ и >> операторы, если все эти условия верны:
Операторы используются на unsigned short или unsigned char операнд.
Результат операции сразу не присвоен объекту, который имеет тот же базовый тип как операнд.
Результат используется, не будучи брошенным к базовому типу операнда.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
| Группа: Выражения |
| Категория: необходимый |