Функции, указанные как noexcept, noexcept(true) или noexcept(<true condition>) выход с исключением, которое приводит к аварийному завершению выполнения программы, что приводит к утечке ресурсов и уязвимости безопасности
Этот дефект возникает, когда вызываемый объект указан с помощью noexcept, noexcept(true), или noexcept(<true condition>) может выйти с исключением.
Когда вызываемый объект вызывает другие вызываемые объекты, 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 помечает такую функцию, даже если исключение не может быть поднято.
Можно указать, что вызываемый объект не выходит за исключением, указав его как noexcept, noexcept(true), или noexcept(<true condition>). Компилятор пропускает процесс передачи исключений для noexcept сущности. Когда такая сущность выходит за исключением, компилятор неявно вызываетstd::terminate().
В зависимости от используемого оборудования и программного обеспечения, функция std::terminate() может вызвать std::abort() аварийно прервать выполнение без размотки стека. Если стек не размотан до завершения программы, то деструкторы переменных в стеке не вызываются, что приводит к утечке ресурсов и уязвимостям безопасности.
Укажите функции как noexcept или noexcept(true) только когда вы знаете, что функции не вызывают никаких исключений. Если определить спецификацию исключения функции невозможно, укажите ее с помощью noexcept(false)
| Группа: C++ Исключение |
| Язык: C++ |
| По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода |
Синтаксис командной строки:
NOEXCEPT_FUNCTION_THROWS
|
| Воздействие: Высокое |