exponenta event banner

Недопустимое использование стандартной подпрограммы библиотеки с плавающей запятой

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

Описание

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

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

    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 Desktop.

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

См. примеры исправлений ниже.

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

Примеры

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

#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
Воздействие: Высокое
CWE ID: 227, 369, 682, 873
Представлен в R2013b