Shift operation overflow

Переполнение от перемещения операции

Описание

Этот дефект происходит, когда операция сдвига может привести к значениям, которые не могут быть представлены типом данных результата. Тип данных переменной определяет количество байтов, выделенных для переменного устройства хранения данных, и ограничивает область значений позволенных значений.

Точное выделение ресурсов хранения для различных типов данных зависит от вашего процессора. Смотрите Target processor type (-target).

Риск

Переполнение операции сдвига может привести к неопределенному поведению.

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Используйте этот список событий, чтобы определить, как переменные в операции сдвига получают свои текущие значения. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.

Можно зафиксировать дефект:

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

  • Проверка значения, которые приводят к переполнению и выполнению соответствующей обработки ошибок.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Примеры

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

int left_shift(void) {

    int foo = 33;
    return 1 << foo; 
}

В операторе возврата этой функции поразрядная операция сдвига выполняется, переключая 1 foo биты налево. Однако int имеет только 32 бита, таким образом, область значений сдвига должна быть между 0 и 31. Поэтому эта операция сдвига вызывает переполнение.

Коррекция — Различный тип хранения

Одна возможная коррекция должна сохранить результат операции сдвига в большем типе данных. В этом примере, путем возврата long long вместо int, дефект переполнения фиксируется.

long long left_shift(void) {

    int foo = 33;
    return 1LL << foo; 
}

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

Группа: числовой
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: SHIFT_OVFL
Удар: низко
ID CWE: 189, 190
Введенный в R2013b