MISRA C:2012 Rule 12.2

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

Описание

Управляйте определением

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

Объяснение

Рассмотрите этот оператор:

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

Реализация Polyspace

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

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

#if (1 << 64) //Noncompliant
//...
#endif
Когда битовые поля в сложном выражении, Polyspace расширяет эту проверку на ширину поля битового поля или ширину базового типа.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

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 отмечает операцию сдвига.

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

Группа: Выражения
Категория: необходимый
Категория AGC: необходимый