exponenta event banner

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

Использовать правильные целочисленные уточнения

Описание

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

Используйте правильные целочисленные уточнения. [1 ]

Внедрение Polyspace

Эта проверка проверяет, превышена ли целочисленная точность.

Примеры

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

Проблема

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

Риск

Использование размера целого числа в операции с целочисленной точностью может привести к переполнению целого числа, обтеканию или неожиданным результатам. Например, целое число без знака может храниться в памяти в 64 битах, но использует только 48 бит для представления его значения. Операция сдвига влево 56 бит для этого целого числа является неопределенным поведением.

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

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

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

Пример - использование размера unsigned int для операции со сдвигом влево
#include <limits.h>

unsigned int func(unsigned int exp)
{
    if (exp >= sizeof(unsigned int) * CHAR_BIT) {
        /* Handle error */
    }
    return 1U << exp;
}

В этом примере функция использует операцию сдвига влево, чтобы вернуть значение 2, возведенное в степень exp. Операция сдвигает биты 1U около exp позиции слева. if оператор гарантирует, что операция не сдвигает биты на несколько позиций exp больше, чем размер unsigned int. Однако, если unsigned int содержит биты заполнения, значение, возвращаемое sizeof() превышает точность unsigned int. В результате некоторые значения exp может быть слишком большим, а операция смены может иметь неопределенное поведение.

Коррекция - реализация функции для вычисления точности unsigned int

Одной из возможных корректировок является реализация функции. popcount() которая вычисляет точность unsigned int путем подсчета количества установленных битов.

#include <stddef.h>
#include <stdint.h>
#include <limits.h>

size_t popcount(uintmax_t);
#define PRECISION(umax_value) popcount(umax_value)


unsigned int func(unsigned int exp)
{
    if (exp >= PRECISION(UINT_MAX)) {
        /* Handle error */
    }
    return 1 << exp;
}




size_t popcount(uintmax_t num)
{
    size_t precision = 0;
    while (num != 0) {
        if (num % 2 == 1) {
            precision++;
        }
        num >>= 1;
    }
    return precision;
} 

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

Группа: Правило 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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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