exponenta event banner

Переполнение операции смены

Переполнение из операции смены

Описание

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

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

Риск

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

Зафиксировать

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

Устранить дефект можно путем:

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

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

См. примеры исправлений ниже.

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

Примеры

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

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++
По умолчанию: Откл.
Синтаксис командной строки: SHIFT_OVFL
Воздействие: Низкий
CWE ID: 189, 190
Представлен в R2013b