exponenta event banner

Переполнение целочисленной константы без знака

Значение константы выходит за пределы диапазона целочисленного типа данных без знака

Описание

Этот дефект возникает при назначении константы времени компиляции целочисленной переменной без знака, тип данных которой не может соответствовать значению. Один n-разрядное беззнаковое целое число содержит значения в диапазоне [0, 2n-1].

Например, c является 8-битным беззнаковым char переменная, которая не может содержать значение 256.

unsigned char c = 256;

Чтобы определить размеры фундаментальных типов, Bug Finder использует вашу спецификацию для Target processor type (-target).

Риск

В стандарте C указано, что перетекающие неподписанные целые числа должны быть обернуты (см., например, стандарт C11, раздел 6.2.5). Однако поведение обхода может быть непреднамеренным и привести к неожиданным результатам.

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

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

Примеры

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

#define MAX_UNSIGNED_CHAR 255
#define MAX_UNSIGNED_SHORT 65535

void main() {
    unsigned char c1 = MAX_UNSIGNED_CHAR + 1;
    unsigned short c2 = MAX_UNSIGNED_SHORT + 1;
}

В этом примере дефект появляется на макросах, поскольку по крайней мере одно использование макроса вызывает переполнение.

Исправление - использование более широкого типа данных

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

#define MAX_UNSIGNED_CHAR 255
#define MAX_UNSIGNED_SHORT 65535

void main() {
    unsigned short c1 = MAX_UNSIGNED_CHAR + 1;
    unsigned int c2 = MAX_UNSIGNED_SHORT + 1;
}

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

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