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