Каждое исключение, явно созданное в коде, должно иметь обработчик совместимого типа во всех путях вызова, который может привести к этой точке
Каждое исключение, явно созданное в коде, должно иметь обработчик совместимого типа во всех путях вызова, который может привести к этой точке.
В 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 ® throw оператор в функции, если совместимая инструкция catch отсутствует в пути вызова функции. Если функция не указана как noexcept, Polyspace игнорирует его, если его путь вызова не имеет точки входа, как main().
Флаги Polyspace a throw оператор, который использует catch(…) для обработки порожденных исключений.
Polyspace не помечает операторы rethrow, то есть throw операторов внутри блоков catch.
Возможно, имеются совместимые блоки catch для throw инструкции в функции вложенного блока try-catch Polyspace игнорирует вложенные блоки try-catch. Оправдать throw операторы, которые имеют совместимые блоки catch во вложенной структуре с помощью комментариев. Кроме того, используйте один уровень try-catch в своих функциях.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Обработка особых ситуаций |
| Категория: Обязательно, Автоматизировано |