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