ISO/IEC TS 17961 [intoflow]

Переполнение целых чисел со знаком

Описание

Управляйте определением

Переполнение целых чисел со знаком. [1]

Примеры

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

Описание

Целочисленное переполнение происходит, когда операция на целочисленных переменных может привести к значениям, которые не могут быть представлены типом данных результата. Тип данных переменной определяет количество байтов, выделенных для переменного устройства хранения данных, и ограничивает область значений позволенных значений.

Точное выделение ресурсов хранения для различных целочисленных типов зависит от вашего процессора. Смотрите Target processor type (-target).

Риск

Целочисленное переполнение на целых числах со знаком приводит к неопределенному поведению.

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Используйте этот список событий, чтобы определить, как переменные в переполняющемся вычислении получают свои текущие значения. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.

Можно зафиксировать дефект:

  • Используя больший тип данных для результата операции так, чтобы все значения могли быть размещены.

  • Проверка значения, которые приводят к переполнению и выполнению соответствующей обработки ошибок.

Чтобы избежать переполнения в целом, попробуйте один из этих методов:

  • Сохраните значения целочисленной переменной ограниченными в половине области значений целых чисел со знаком.

  • В операциях, которые могут переполниться, проверяйте на условия, которые могут привести к переполнению, и реализация повторяются или поведение насыщения в зависимости от того, как результат операции используется. Результат затем становится предсказуемым и может безопасно использоваться в последующих вычислениях.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.

Пример - сложение максимального целого числа

#include <limits.h>

int plusplus(void) {

    int var = INT_MAX;
    var++;             
    return var;
}

В третьем операторе этой функции переменная var увеличена одной. Но значение var является максимальным целочисленным значением, таким образом, int не может представлять один плюс максимальное целочисленное значение.

Исправление — различный тип хранения

Одно возможное исправление должно изменить типы данных. Сохраните результат операции в большем типе данных (Обратите внимание на то, что на 32-битной машине, int и long имеют тот же размер). В этом примере, на 32-битной машине, путем возврата long long вместо int, фиксируется ошибка переполнения.

#include <limits.h>

long long plusplus(void) {

    long long lvar = INT_MAX;
    lvar++;
    return lvar;
}

Описание

Целочисленное постоянное переполнение происходит, когда вы присваиваете время компиляции, постоянное переменной целого числа со знаком, тип данных которой не может разместить значение. 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;
}

Проверяйте информацию

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.