В настоящее время я пытаюсь использовать программное обеспечение parasoft для исправления нарушений статического анализа моего кода с использованием стандартов кодирования MISRA C. Мой код изначально имел эту функцию:
static inline uint32_t rotate_right(uint32_t val, uint32_t n)
{
return (val >> n) | (val << (32 - n));
}
Это вызывает нарушение статического анализа по правилу MISRA2004-12_8-3. Правило говорит
Правый операнд оператора сдвига должен лежать между нулем и единицей меньше ширины в битах базового типа левого операнда.
В документации правила указано, что это конкретное правило сообщает о нарушении, если
- правый операнд является константой с отрицательным значением или со значением, которое превышает длину (в битах) левого операнда
- правый операнд не является константой и не проверяется по определенному шаблону
Поскольку я не использую константу для правого операнда, правила MISRA-C требуют, чтобы я окружал это выражение проверками пределов. MISRA-C также заявляет, что
Использование целочисленного типа без знака гарантирует, что операнд неотрицательный, поэтому необходимо проверять только верхний предел (динамически во время выполнения или при просмотре). В противном случае необходимо будет проверить оба предела.
Поскольку я использую беззнаковый тип uint32_t
, мне нужно только проверить верхние пределы правого операнда. Однако для val << (32u - n)
я не могу иметь значение n
как 0u
. Поэтому я попытался устранить это нарушение, добавив следующие проверки:
static inline uint32_t rotate_right(uint32_t val, uint32_t n)
{
if (n == 0u)
{
return val;
}
else if ((n > 0u) && (n <= 31u))
{
return (val >> n) | (val << (32u - n));
}
else
{
return 0u;
}
}
Это устраняет нарушение статического анализа для (val >> n)
, но о том же нарушении по-прежнему сообщается для (val << (32u - n))
.
Следовательно, мои вопросы:
Оператор
if
явно ограничивает значениеn
меньше32u
. Следовательно,(32u - n)
также будет иметь значение, меньшее или равное32u
. Почему программное обеспечение parasoft все еще сообщает об ошибке для правого операнда, равного(32u - n)
, несмотря на проверку предела?Как правильно устранить это нарушение?