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