exponenta event banner

Смещение отрицательного значения

Оператор сдвига при отрицательном значении

Описание

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

Риск

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

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

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

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

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

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

Примеры

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

int shifting(int val)
{
    int res = -1;
    return res << val;
}

В операторе return переменная res сдвигается на некоторое количество битов влево. Однако, потому что res отрицательный, сдвиг может перезаписать бит знака.

Исправление - изменение типа данных

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

int shifting(int val)
{
    unsigned int res = -1;
    return res << val;
}

Информация о результатах

Группа: Числовые
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: SHIFT_NEG
Воздействие: Низкий
CWE ID: 189
Представлен в R2013b