CERT C++: FLP32-C

Предотвратите или обнаружьте область и ошибки области значений в математических функциях

Описание

Управляйте определением

Предотвратите или обнаружьте область и ошибки области значений в математических функциях. [1]

Примеры

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

Описание

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

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

    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);
}

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

Группа: 49. Разное (MSC)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.