Invalid use of standard library floating point routine

Неправильные аргументы к стандартной библиотечной функции

Описание

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

  • Округление и стандартные программы абсолютного значения

    ceil, fabs, floor, fmod

  • Части и стандартные программы деления

    fmod, modf

  • Экспоненты и логарифмические стандартные программы

    frexp, ldexp, sqrt, pow, exp, log, log10

  • Стандартные программы функции тригонометрии

    cos, sin, tan, acos, asin, atan, atan2, cosh, sinh, tanh, acosh, asinh, atanh

Риск

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

Фиксация

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

Это - хорошая практика, чтобы обработать для доменных ошибок перед использованием стандартной функции плавающей точки библиотеки. Например, прежде, чем вызвать acos функция, проверяйте, находится ли аргумент в [-1.0, 1.0], и обработайте ошибку.

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

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

Примеры

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

#include <math.h>

double arccosine(void) {
    double degree = 5.0;
    return acos(degree);
}

Входное значение к acos должен быть в интервале [-1,1]. Этот входной параметр, degree, находится вне этой области значений.

Коррекция — изменяет входной параметр

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

#include <math.h>

double arccosine(void) {
    double degree = 5.0;
    double radian = degree * 3.14159 / 180.;
    return acos(radian);
}

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

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

Введенный в R2013b