exponenta event banner

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

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

Описание

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

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

signed char c = 255;

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

Риск

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

Даже если компиляторы обтекают переполненные константы предупреждением, поведение обтекания может быть непреднамеренным и привести к неожиданным результатам.

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

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

Примеры

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

#define MAX_UNSIGNED_CHAR 255 
#define MAX_SIGNED_CHAR 127

void main() {
    char c1 = MAX_UNSIGNED_CHAR;
    char c2 = MAX_SIGNED_CHAR+1;
}

В этом примере дефект появляется на макросах, поскольку по крайней мере одно использование макроса вызывает переполнение. Чтобы воспроизвести эти дефекты, используйте Target processor type (-target) где char подписан по умолчанию.

Исправление - использовать различные типы данных

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

#define MAX_UNSIGNED_CHAR 255 
#define MAX_SIGNED_CHAR 127

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

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

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