Каждое исключение, явно выданное в коде, должно иметь обработчик совместимого типа во всех путях вызова, который может привести к этой точке
Каждое исключение, явно выданное в коде, должно иметь обработчик совместимого типа во всех путях вызова, который может привести к этой точке.
В C++, когда операция вызывает исключение, компилятор пытается соответствовать исключению с совместимым обработчиком исключений в текущей и смежной возможностях. Если не существует совместимого обработчика исключений для вызванного исключения, компилятор вызывает функцию std::terminate() неявно. Функция std::terminate() завершает выполнение программы определенным в реализации способом. То есть точный процесс завершения программы зависит от конкретного набора программного и оборудования, которое вы используете. Для образца, std::terminate() может вызвать std::abort() для ненормального прекращения выполнения без размотки стека. Если стек не размотан до завершения программы, то деструкторы переменных в стеке не вызываются, что приводит к утечке ресурсов и уязвимостям безопасности.
Рассмотрите этот код, где в блоке try кода возникает несколько исключений.
class General{/*... */};
class Specific : public General{/*...*/};
class Different{}
void foo() noexcept
{
try{
//...
throw(General e);
//..
throw( Specific e);
// ...
throw(Different e);
}
catch (General& b){
}
}General. Этот блок catch совместим с исключениями из базового класса General и производный класс Specific. Исключение из Different классов не имеет совместимого обработчика. Это необработанное исключение нарушает это правило и может привести к утечкам ресурсов и уязвимостям безопасности.Поскольку необработанные исключения могут привести к утечке ресурсов и уязвимостям безопасности, сопоставьте явно вызванные исключения в коде с совместимым обработчиком.
Polyspace® флаги a throw оператор в функции, если совместимый оператор catch отсутствует в пути вызова функции. Если функция не задана как noexceptPolyspace игнорирует его, если в его пути вызова отсутствует точка входа, такая как main().
Polyspace флаги a throw оператор, который использует catch(…) оператор для обработки вызванных исключений.
Polyspace не помечает операторов rethrow, то есть throw операторы в блоках catch.
У вас могут быть совместимые блоки catch для throw операторы в функции во вложенном блоке try-catch Polyspace игнорирует вложенные блоки try-catch. Обоснование throw операторы, которые имеют совместимые блоки catch во вложенной структуре с помощью комментариев. Кроме того, используйте один уровень try-catch в своих функциях.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Обработка исключений |
| Категория: Требуемая |