Выражение аргумента в throw
оператор вызывает неожиданные исключения, приводящие к утечкам ресурсов и уязвимостям безопасности
Этот дефект возникает, когда выражение аргумента оператора throw может вызвать исключение. Выражения, которые могут вызвать исключения, включают:
Функции, которые заданы как noexcept(false)
Функции, которые содержат одно или несколько явных throw
операторы
Конструкторы, которые выполняют операции выделения памяти
Выражения, которые включают динамическое литье
При явном возникновении исключения при помощи throw
операторы, компилятор сначала создает ожидаемое исключение путем оценки аргумента оператора throw, а затем поднимает ожидаемое исключение. Если при создании компилятором ожидаемого исключения в throw
возникает непредвиденное исключение оператор, неожиданное исключение распространяется вместо ожидаемого. Это неожиданное исключение может стать необработанным исключением. В зависимости от вашего окружения компилятор может вызвать
std::abort
аномально прекратить выполнение программы без размотки стека, когда исключения становятся необработанными, что приводит к утечке ресурсов и уязвимостям безопасности. Рассмотрим этот код, где a throw
оператор вызывает явное исключение класса myException
.
class myException{ myException(){ msg = new char[10]; //... } //... }; foo(){ try{ //.. throw myException(); } catch(myException& e){ //... } }
myException
объект, new
оператор может поднять bad_alloc
исключение. В таком случае throw
оператор поднимает bad_alloc
исключение, вместо myException
. Потому что myException
было ожидаемым исключением, блок catch несовместим со bad_alloc
. The bad_alloc
исключение становится необработанным исключением. Это может привести к ненормальному прекращению работы программы без размотки стека, что приведет к утечке ресурсов и уязвимостям безопасности.Избегайте использования выражений, которые могут вызвать исключения в качестве аргумента в throw
оператор.
Группа: Исключение C++ |
Язык: C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: THROW_ARGUMENT_EXPRESSION_THROWS
|
Влияние: Высокий |