Integer overflow

Переполнение от операции между целыми числами

Описание

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

Обратите внимание на то, что:

  • Тип данных, используемый, чтобы определить переполнение, основан на типах данных операнда. Если вы затем присваиваете результат операции к другой переменной, различному средству проверки, Integer conversion overflow, определяет, переполняет ли значение, присвоенное также, переменной, присвоенной. Например, в операции, такой как:

    res = x + y;
    Это средство проверки проверяет на переполнение на основе типов x и y, а не на типе res. Средство проверки для целочисленного переполнения преобразования затем проверяет на переполнение на основе типа res.

  • Эти два операнда в бинарной операции могут подвергнуться продвижению, прежде чем операция произойдет. См. также Предположения О Неявных Преобразованиях типа данных (Polyspace Code Prover).

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

Риск

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

Исправление

Фиксация зависит от первопричины дефекта. Часто детали результата (или подсказки исходного кода в Polyspace, когда Вы Кодируете) показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают эту историю события, можно искать предыдущие ссылки переменных, относящихся к дефектному использованию, щелкают правой кнопкой по опциям по исходному коду и находят связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола 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;
}

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

Группа: числовой
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: INT_OVFL
Удар: Средняя
ID CWE: 128, 189, 190, 191, 192
Введенный в R2013b