Функции, заданные как noexcept
, noexcept(true)
или noexcept(<true condition>)
выходы за исключением, которое вызывает аварийное завершение выполнения программы, ведя к утечке ресурсов и уязвимости системы обеспечения безопасности
Этот дефект происходит, когда вызываемая сущность, которая задана при помощи noexcept
, noexcept(true)
, или noexcept(<true condition>)
может выйти за исключением.
Когда вызываемая сущность вызывает другие вызываемые сущности, Polyspace® делает определенные предположения, чтобы вычислить, могут ли быть необработанные исключения.
Функции: когда noexcept
вызовы функции другая функция, Polyspace проверяет, может ли вызванная функция повысить исключение, только если это задано как noexcept(<false>)
.If вызванная функция задан как 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
|
Удар: высоко |