Integer constant overflow

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

Описание

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