Выражение аргумента в 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
|
| Удар: высоко |