Unsigned integer constant overflow

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

Описание

Этот дефект возникает, когда вы присваиваете константу времени компиляции беззнаковой целочисленной переменной, тип данных которой не может включать значение. Система координат 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++
По умолчанию: Off
Синтаксис командной строки : UINT_CONSTANT_OVFL
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 128, 189, 190, 191
Введенный в R2018b