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

Переполнение от операции между беззнаковым целым

Описание

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

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

Риск

Стандарт C11 утверждает, что беззнаковое целое переполняет результата во всеобъемлющем поведении. Однако переносить поведение не может всегда быть желательным. Например, если результат вычисления используется в качестве размера массивов и переполнения вычисления, размер массивов намного меньше, чем ожидалось.

Фиксация

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

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

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

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

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

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

Примеры

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

#include <limits.h>

unsigned int plusplus(void) {

    unsigned uvar = UINT_MAX;
    uvar++;
    return uvar;
}

В третьем операторе этой функции переменная uvar увеличена на 1. Однако значение uvar является максимальным значением беззнаковых целых чисел, таким образом, 1 плюс максимальное целочисленное значение не может быть представлен unsigned int. Стандарт языка программирования C не просматривает переполнение без знака как ошибку, потому что программа автоматически уменьшает результат модулем максимальное значение плюс 1. В этом примере uvar уменьшается UINT_MAX по модулю. Результатом является uvar = 1.

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

Одно возможное исправление должно сохранить результат операции в большем типе данных. В этом примере, путем возврата unsigned long long вместо unsigned int, фиксируется ошибка переполнения.

#include <limits.h>

unsigned long long plusplus(void) {

    unsigned long long ullvar = UINT_MAX;
    ullvar++;
    return ullvar;
}

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

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

Введенный в R2013b