Shift of a negative value

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

Описание

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

Риск

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

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

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

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

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

Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты 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
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 189
Введенный в R2013b