Конструкторы, которые не являются noexcept, не должны быть вызваны перед запуском программы.
Конструкторы, которые не являются noexcept, не должны быть вызваны перед запуском программы.
На C++ компилятор отвечает на исключение путем выполнения этих шагов:
Компилятор пытается совпадать с исключением обработчику в текущем осциллографе или более высоком осциллографе.
Если соответствия исключения с обработчиком, то обработчик принимает исключение и начинает раскручивание стека. Во время раскручивания стека выполнение программы перемещается от осциллографа, который производит исключение для внешних осциллографов в обратном порядке. Выполнение программы затем вызывает деструкторы для каждой переменной на стеке, которые еще не уничтожаются. После раскручивания стека выполнение программы сразу возобновляется от линии после инициированного обработчика.
Если исключение не совпадает с обработчиком, то компилятор отключает выполнение заданным реализацией способом. Таким образом, точный процесс завершения программы зависит от определенного набора программного и аппаратного обеспечения, которое вы используете. Например, компилятор может вызвать std::terminate()
, который в свою очередь может вызвать std::abort()
неправильно прерывать выполнение. На основе реализации не может быть раскручен стек, прежде чем программа прерывается. Если стек не раскручен перед завершением программы, то деструкторы переменных в стеке не вызываются, ведя к утечке ресурсов и уязвимостям системы обеспечения безопасности.
Перед запуском программы конструкторы статических или глобальных объектов вызываются, чтобы создать и инициализировать эти объекты. Если такой конструктор повышает исключение, компилятор может неправильно отключить выполнение кода, не раскручивая стек. Рассмотрите этот код где конструктор статического объекта obj
может вызвать исключение.
class A{ A(){ //... } }; static A obj; main(){ //... }
obj
создается путем вызова A()
перед main()
запускается. Поскольку A()
называется перед запуском программы никакой обработчик исключений не может быть соответствующим за исключениями, повышенными A()
. На основе реализации такое исключение может привести к завершению программы без раскручивания стека, ведя к утечке памяти и уязвимостям системы обеспечения безопасности.Поскольку исключения, повышенные конструкторами статических или глобальных объектов, не могут быть соответствующими к обработчику исключений, объявите этих конструкторов как noexcept
.
Polyspace® отмечает операторы где non-noexcept
конструкторы статического или глобального объекта непосредственно вызываются. Это также подсвечивает несовместимых конструкторов.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Обработка исключений |
Категория: необходимый, автоматизированный |