Float overflow

Переполнение от операции между плавающими точками

Описание

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

Обратите внимание на то, что:

  • Тип данных, используемый, чтобы определить переполнение, основан на типах данных операнда. Если вы затем присваиваете результат операции к другой переменной, различному средству проверки, Float conversion overflow, определяет, переполняет ли значение, присвоенное также, переменной, присвоенной. Например, в операции, такой как:

    res = x + y;
    Это средство проверки проверяет на переполнение на основе типов x и y, а не на типе res. Средство проверки для переполнения преобразования плавающего затем проверяет на переполнение на основе типа res.

  • Эти два операнда в бинарной операции могут подвергнуться продвижению, прежде чем операция произойдет. См. также Предположения О Неявных Преобразованиях типа данных (Polyspace Code Prover).

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

Риск

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

Исправление

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

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

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

Примеры

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

#include <float.h>

float square(void) {

   float val = FLT_MAX;
   return val * val;  
}

В операторе возврата, переменной val умножается отдельно. Квадрат максимального значения плавающего не может быть представлен плаванием (тип возврата для этой функции) потому что значение val максимальное значение плавающее.

Коррекция — различный тип хранения

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

#include <float.h>

double square(void) {
    float val = FLT_MAX;

    return (double)val * (double)val;  
}

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

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