Назначение-выражение оператора throw не должно само по себе вызывать исключение
Назначение-выражение оператора throw не должно само по себе вызывать исключение.
В C++ можно использовать throw для явного создания исключений. Компилятор выполняет такую throw оператор в два шага:
Во-первых, он создает аргумент для throw заявление. Компилятор может вызвать конструктор или вычислить выражение назначения для создания объекта аргумента.
Затем он поднимает созданный объект как исключение. Компилятор пытается сопоставить объект исключения совместимому обработчику.
Если непредвиденное исключение возникает, когда компилятор создает ожидаемое исключение в throw непредвиденное исключение создается вместо ожидаемого. Рассмотрим этот код, если 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 может вызвать утечку ресурсов и уязвимости системы безопасности. Чтобы предотвратить такой нежелательный результат, избегайте использования выражений, которые могут вызвать исключения в качестве аргумента в throw заявление.
Polyspace ® помечает выражения вthrow операторы, которые могут вызвать исключение. Выражения, которые могут вызывать исключения, могут включать:
Функции, указанные как noexcept(false)
Функции, содержащие одну или несколько явных throw заявления
Конструкторы, выполняющие операции выделения памяти
Выражения, включающие динамическое литье
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Обработка особых ситуаций |
| Категория: Обязательно, Автоматизировано |