Если функция, как будут объявлять, будет noexcept, noexcept (TRUE) или noexcept (<истинное условие>), то это не должно выходить за исключением
Если функция, как будут объявлять, будет noexcept, noexcept (TRUE) или noexcept (<истинное условие>), то это не должно выходить за исключением.
Можно указать, что вызываемая сущность не повышает исключение путем определения его как noexcept
, или noexcept(true)
, или noexcept(<true condition>)
. Компилятор ожидает что noexcept
функция не выходит за исключением. На основе этого предположения компилятор не использует процесс вручения исключения для noexcept
функции. Когда noexcept
функционируйте выходы за исключением, исключение становится необработанным.
Если noexcept
функционируйте выходы за исключением, компилятор вызывает std::terminate()
неявно. Функциональный std::terminate()
отключает выполнение программы заданным реализацией способом. Таким образом, точный процесс завершения программы зависит от определенного набора программного и аппаратного обеспечения, которое вы используете. Например, std:terminate()
может вызвать std::abort()
неправильно прерывать выполнение, не раскручивая стек, ведя к утечке ресурсов и уязвимостям системы обеспечения безопасности.
Задайте функции как noexcept
или noexcept(true)
только, когда вы знаете, что функции не повышают исключений. Если вы не можете определить спецификацию исключения функции, задайте его при помощи noexcept(false)
.
Если вы задаете вызываемую сущность при помощи noexcept
, noexcept(true)
, или noexcept(<true condition>)
, Polyspace® проверяет вызываемую сущность на необработанные исключения и отмечает вызываемую сущность, если это может выйти за исключением.
Когда вызываемая сущность вызывает другие вызываемые сущности, Polyspace делает определенные предположения, чтобы вычислить, могут ли быть необработанные исключения.
Функции: когда noexcept
вызовы функции другая функция, Polyspace проверяет, может ли вызванная функция повысить исключение, только если это задано как noexcept(<false>)
. Если вызванная функция задана как noexcept
, Polyspace принимает, что не повышает исключение. Некоторые стандартные библиотечные функции, такие как конструктор std::string
, используйте указатели на функции, чтобы выполнить выделение памяти, которое может повысить исключения. Поскольку эти функции не заданы как noexcept(<false>)
, Polyspace не отмечает функцию, которая вызывает эти стандартные библиотечные функции.
Внешняя функция: Когда noexcept
вызовы функции внешняя функция, Polyspace отмечает объявление функции, если внешняя функция задана как noexcept(<false>)
.
Виртуальная функция: Когда вызовы функции виртуальная функция, Polyspace отмечает объявление функции, если виртуальная функция задана как noexcept(<false>)
в производном классе. Например, если noexcept
вызовы функции виртуальная функция, которая объявляется как noexcept(<true>)
в базовом классе и noexcept(<false>)
в последующем производном классе Polyspace отмечает объявление noexcept
функция.
Указатели на функцию: Когда noexcept
функция вызывает указатель на функцию, Polyspace принимает, что указатель на функцию не повышает исключения.
При анализе, повышает ли функция необработанные исключения, Polyspace игнорирует:
Исключения повышены в деструкторах
Исключения повышены в atexit()
операции
Polyspace также игнорирует динамический контекст при проверке на исключения. Например, функциональное повышение силы необработанные исключения, которые возникают только в определенных динамических контекстах. Polyspace отмечает такую функцию, даже если исключение не может быть повышено.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Обработка исключений |
Категория: необходимый, автоматизированный |