Float conversion overflow

Переполнение при преобразовании между типами данных с плавающей запятой

Описание

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

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

Риск

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

Фиксация

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

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

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

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

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

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

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

Примеры

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

float convert(void) {

    double diam = 1e100;
    return (float)diam;
}

В операторе возврата, переменной diam типа double (64 бита) преобразован в переменную плавания типа (32 бита). Однако значение 1^100 требует, чтобы больше чем 32 бита были точно представлены.

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

Группа: числовой
Язык: C | C++
Значение по умолчанию: On
Синтаксис командной строки: FLOAT_CONV_OVFL
Удар: высоко
ID CWE: 189, 197, 681
Введенный в R2013b