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