Целочисленное постоянное переполнение

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

Описание

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

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

signed char c = 255;

Чтобы определить размеры фундаментальных типов, Средство поиска Ошибки использует вашу спецификацию для 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
Влияние: носитель
ID CWE: 128, 189, 190, 191

Введенный в R2018b