exponenta event banner

CERT C: FLP32-C правил

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

Описание

Определение правила

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

Внедрение Polyspace

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

Примеры

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

Проблема

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

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

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

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

Группа: Правило 05. Плавающая точка (FLP)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.