exponenta event banner

MISRA C:2012 Правило 12.2

Операнд правой руки оператора сдвига должен находиться в диапазоне от нуля до единицы меньше ширины в битах существенного типа операнда левой руки

Описание

Определение правила

Операнд правой руки оператора сдвига должен находиться в диапазоне от нуля до единицы меньше ширины в битах существенного типа операнда левой руки.

Объяснение

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

var = abc << num;
Если abc является 16-битным целым числом, то num должен находиться в диапазоне 0-15, (неотрицательный и менее 16). Если num отрицательный или больше 16, то поведение сдвига не определено.

Внедрение Polyspace

Polyspace ® вызывает нарушение, когда правильный операнд оператора смены превышает диапазон, определенный в этом правиле. Если правильный операнд является переменной, нарушение поднимается, если только все возможные значения операнда не остаются в пределах диапазона, определенного в этом правиле.

В Polyspace числа, которыми манипулируют в директивах предварительной обработки, имеют ширину 64 бита. Допустимый диапазон сдвига находится в диапазоне от 0 до 63. Когда битовые поля находятся в пределах сложного выражения, Polyspace расширяет эту проверку на ширину битового поля или ширину базового типа.

Дополнительное сообщение в отчете

  • Сумма смены больше size.

  • Сумма сдвига отрицательна.

  • Правый операнд оператора сдвига должен находиться в диапазоне от нуля до единицы меньше ширины в битах существенного типа левого операнда.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

void foo(void) {
  int i;
  unsigned int BitPack = 0U;
  
  for (i = 0; i < 32; i++) {
    BitPack |= (1U << ((unsigned int)i));  //Noncompliant
  }
}

В этом примере 1U левого операнда оператора смены имеет существенный тип unsigned char. Допустимые значения для правого операнда находятся в диапазоне от нуля до семи. Потому что правильный операнд i колеблется от нуля до 31, Polyspace помечает операцию смены.

Проверить информацию

Группа: Выражения
Категория: Обязательно
Категория СМЖЛ: требуется