Исключения должны быть созданы только после запуска и до прекращения
Исключения возникают только после запуска и до прекращения эксплуатации.
В C++ процесс обработки исключений выполняется во время выполнения main(), где исключения, возникающие в различных областях, обрабатываются обработчиками исключений в одной или смежных областях. Перед началом выполнения main()компилятор находится в фазе запуска и после завершения выполнения main()компилятор находится в фазе завершения. В течение этих двух фаз компилятор выполняет набор предопределенных операций, но не выполняет код.
Если исключение возникает во время фазы запуска или фазы завершения, нельзя записать обработчик исключений, который компилятор может выполнить на этих фазах. Например, можно внедрить main() в качестве function-try-catch блок для обработки исключений. catch блоки в main() может обрабатывать только исключения, созданные в main(). Ни один из catch блоки могут обрабатывать исключения, возникающие во время фазы запуска или завершения. При возникновении таких исключений компилятор может ненормально завершить выполнение кода без размотки стека. Рассмотрим этот код, когда строительство и разрушение статического объекта obj может вызвать исключение.
class A{
A(){throw(0);}
~A(){throw(0)}
};
static A obj;
main(){
//...
}obj создается путем вызова A() прежде main() запускается, и он разрушается вызовом ~A() после main() заканчивается. Когда A() или ~A() вызывает исключение, обработчик исключений не может быть сопоставлен с ними. На основе реализации такое исключение может привести к завершению программы без размотки стека, что приведет к утечке памяти и уязвимостям безопасности.Избегайте операций, которые могут вызвать исключение в частях кода, которые могут быть выполнены до запуска или после завершения программы. Например, избегайте операций, которые могут вызвать исключения в конструкторе и деструкторе статических или глобальных объектов.
Polyspace ® помечает глобальное или статическое объявление переменной, в котором используется вызываемая сущность, которая может вызвать исключение. Например:
Функция: При прямом вызове функции инициализатора или конструктора для инициализации глобальной или статической переменной Polyspace проверяет, вызывает ли функция исключение, и помечает объявление переменной, если функция может вызвать исключение. Polyspace выводит, может ли функция вызвать исключение независимо от ее спецификации исключения. Например, если noexcept конструктор вызывает исключение, Polyspace помечает его. Если инициализатор или конструктор вызывает другую функцию, Polyspace предполагает, что вызываемая функция может вызвать исключение, только если она указана как noexcept(<false>). Некоторые стандартные библиотечные функции, такие как конструктор std::string, используйте указатели на функции для выделения памяти, что может вызвать исключения. При использовании этих функций в Polyspace объявление переменной не помечается.
Внешняя функция: при вызове внешних функций для инициализации глобальной или статической переменной Polyspace помечает объявление, если внешняя функция указана как noexcept(<false>).
Виртуальная функция: При вызове виртуальной функции для инициализации глобальной или статической переменной Polyspace помечает ее, если виртуальная функция указана как noexcept(<false>) в любом производном классе. Например, если используется функция виртуального инициализатора, объявленная как noexcept(<true>) в базовом классе, и noexcept(<false>) в последующем производном классе Polyspace помечает его.
Указатели на функцию: При использовании указателя на функцию для инициализации глобальной или статической переменной Polyspace предполагает, что указатель на функцию не вызывает исключений.
Polyspace игнорирует:
Исключения, возникшие в деструкторах
Исключения, возникшие в atexit() операции
При проверке исключений Polyspace также игнорирует динамический контекст. Например, можно инициализировать глобальную или статическую переменную с помощью функции, которая вызывает исключения только в определенном динамическом контексте. Polyspace помечает такое объявление, даже если исключение никогда не будет поднято. Обосновать такое нарушение можно с помощью комментариев в Polyspace.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Обработка особых ситуаций |
| Категория: Обязательно, Автоматизировано |