Целочисленное переполнение преобразования

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

Описание

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

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

Риск

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

Фиксация

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

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

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

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

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

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

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

Примеры

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

char convert(void) {

    int num = 1000000;

    return (char)num;
}

В операторе возврата целочисленная переменная num преобразован в char. Однако 8-битный или 16-битный символ не может представлять 1000000, потому что требуется по крайней мере 20 битов. Так переполнение операции преобразования.

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

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

long convert(void) {

    int num = 1000000;

    return (long)num;
}

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

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

Введенный в R2013b