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