Каждое исключение, явным образом добавленное, код должен иметь обработчик совместимого типа во всех путях к вызову, которые могли привести к той точке
Каждое исключение, явным образом добавленное, код должен иметь обработчик совместимого типа во всех путях к вызову, которые могли привести к той точке.
На C++, когда операция повышает исключение, компилятор пытается совпадать с исключением совместимому обработчику исключений в текущих и смежных осциллографах. Если никакой совместимый обработчик исключений для повышенного исключения не существует, компилятор вызывает функциональный std::terminate()
неявно. Функциональный std::terminate()
отключает выполнение программы заданным реализацией способом. Таким образом, точный процесс завершения программы зависит от определенного набора программного и аппаратного обеспечения, которое вы используете. Например, std::terminate()
может вызвать std::abort()
неправильно прерывать выполнение, не раскручивая стек. Если стек не раскручен перед завершением программы, то деструкторы переменных в стеке не вызываются, ведя к утечке ресурсов и уязвимостям системы обеспечения безопасности.
Рассмотрите этот код, где несколько исключений повышены в блоке кода попытки.
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
. Этот блок выгоды совместим за исключениями базового класса General
и производный класс Specific
. Исключение класса Different
не имеет совместимого обработчика. Это необработанное исключение нарушает это правило и может привести к утечкам ресурсов и уязвимостям системы обеспечения безопасности.Поскольку необработанные исключения могут привести к утечке ресурсов и уязвимостям системы обеспечения безопасности, совпадать с явным образом повышенными исключениями в вашем коде с совместимым обработчиком.
Polyspace® отмечает throw
оператор в функции, если совместимый оператор выгоды отсутствует в пути к вызову функции. Если функция не задана как noexcept
, Polyspace игнорирует его, если его путь к вызову испытывает недостаток в точке входа как main()
.
Polyspace отмечает throw
оператор, который использует catch(…)
оператор, чтобы обработать повышенные исключения.
Polyspace не отмечает операторы переброска, то есть, throw
операторы в блоках выгоды.
У вас могут быть совместимые блоки выгоды для throw
операторы в вашей функции во вложенном Polyspace блока try-catch игнорируют вложенные блоки try-catch. Выровняйте по ширине throw
операторы, которые имеют совместимые блоки выгоды во вложенной структуре при помощи комментариев. В качестве альтернативы используйте один уровень try-catch в ваших функциях.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Обработка исключений |
Категория: необходимый, автоматизированный |