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

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

Описание

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

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

Риск

Целочисленное преобразование переполняет результата в неопределенном поведении.

Фиксация

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

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

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

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

В целом избегайте преобразований в меньшие целочисленные типы.

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

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

Примеры

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

unsigned char convert(void) {
    unsigned int unum = 1000000U;

    return (unsigned char)unum;  
}

В операторе возврата переменная unum беззнаковых целых чисел преобразована в тип символов без знака. Однако преобразование переполняется, потому что 1000000 требует по крайней мере 20 битов. Стандарт языка программирования C не просматривает переполнение без знака как ошибку, потому что программа автоматически уменьшает результат модулем максимальное значение плюс 1. В этом примере unum уменьшается 2^8 по модулю, потому что символьный тип данных может только представлять 2^8-1.

Исправление — тип преобразования изменения

Одно возможное исправление должно преобразовать в различный целочисленный тип, который может представлять целый номер. Например, long.

unsigned long convert(void) {
    unsigned int unum = 1000000U;

    return (unsigned long)unum;  
}

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

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

Введенный в R2013b