Если функция объявлена как noexcept, noexcept (true) или noexcept (< true condition >), то она не должна выходить за исключением
Если функция объявлена как noexcept, noexcept (true) или noexcept (< true condition >), то она не должна выходить за исключением.
Можно указать, что вызываемая сущность не вызывает исключение, задав его как noexcept
, или noexcept(true)
, или noexcept(<true condition>)
. Компилятор ожидает, что noexcept
функция не выходит за исключением. Исходя из этого предположения, компилятор опускает процесс передачи исключения для noexcept
функций. Когда noexcept
функция выходит за исключением, исключение становится необработанным.
Если a 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>)
в производном классе. Для образца, если a noexcept
функция вызывает виртуальную функцию, которая объявлена как noexcept(<true>)
в базовом классе и noexcept(<false>)
в последующем производном классе Polyspace помечает объявление noexcept
функция.
Указатели на функцию: Когда noexcept
функция вызывает указатель на функцию, Polyspace принимает, что указатель на функцию не вызывает исключений.
При анализе, вызывает ли функция необработанные исключения, Polyspace игнорирует:
Исключения, вызванные деструкторами
Исключения, высказанные в atexit()
операции
Polyspace также игнорирует динамический контекст при проверке на исключения. Например, функция может вызвать необработанные исключения, которые возникают только в определенных динамических контекстах. Polyspace помечает такую функцию, даже если исключение может не быть вызвано.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Обработка исключений |
Категория: Необходимый, Автоматизированный |