Shift of a negative value

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

Описание

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

Риск

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

Фиксация

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

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

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

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

Примеры

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

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

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

Коррекция — изменяет тип данных

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

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

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

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