MISRA C:2012 Rule 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 оператора shift имеет существенный тип unsigned char. Допустимые значения для правого операнда находятся в области значений от нуля до семи. Потому что правильный операнд i находится в диапазоне от нуля до 31, Polyspace помечает операцию сдвига.

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

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