Функции, заданные как 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>)
в производном классе. Для образца, если a 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++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: NOEXCEPT_FUNCTION_THROWS
|
Влияние: Высокий |