Если функция объявлена как noexcept, noexcept (истина) или noexcept (< истинное условие >), то она не должна выходить за исключением
Если функция объявлена как noexcept, noexcept (истина) или 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 помечает такую функцию, даже если исключение не может быть поднято.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Обработка особых ситуаций |
| Категория: Обязательно, Автоматизировано |