exponenta event banner

CERT C: INT34-C правил

Не сдвигайте выражение на отрицательное число битов или на большее или равное количеству битов, существующих в операнде

Описание

Определение правила

Не сдвигайте выражение на отрицательное число битов или большее или равное количеству битов, имеющихся в операнде. [1 ]

Внедрение Polyspace

Эта проверка проверяет наличие следующих проблем:

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

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

Примеры

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

Проблема

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

Риск

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

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

Исправление зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Этот список событий используется для определения того, как сдвигаемая переменная получает отрицательные значения. Исправление может быть реализовано для любого события в последовательности. Если сведения о результатах не отображают историю событий, можно выполнить обратную трассировку, щелкнув правой кнопкой мыши параметры в исходном коде и просмотреть предыдущие связанные события. См. также раздел Интерпретация результатов поиска ошибок в интерфейсе пользователя 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;
}
Проблема

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

Точное распределение ресурсов хранения для различных типов с плавающей запятой зависит от процессора. Посмотрите 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; 
}

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

Группа: Правило 04. Целые числа (INT)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.