Подробности
[В начало]
Проблема в реализации № S0672
Краткое описание
При вызове std::uncaught_exception() после входа в terminate() в некоторых случаях возвращается неверное значение
Подробное описание
Из описания функции uncaught_exception() throw() (ISO/IEC 14882, раздел 18.6.4):
Returns: true after completing evaluation of a throw-expression until either completing initialization of the exception-declaration in the matching handler or entering unexpected() due to the throw; or after entering terminate() for any reason other than an explicit call to terminate().Помимо явного вызова из пользовательского кода, вызов terminate() происходит в следующих ситуациях (ISO/IEC 14882, раздел 15.5.1):
- when the exception handling mechanism, after completing evaluation of the expression to be thrown but before the exception is caught, calls a user function that exits via an uncaught exception.
- when the exception handling mechanism cannot find a handler for a thrown exception, or
- when the destruction of an object during stack unwinding exits using an exception, or
- when construction or destruction of a non-local object with static storage duration exits using an exception, or
- when execution of a function registered with atexit exits using an exception, or
- when a throw-expression with no operand attempts to rethrow an exception and no exception is being handled, or
- when unexpected throws an exception which is not allowed by the previously violated exception specification, and std::bad_exception is not included in that exception-specification.
В случаях 2,4,5,7 функция std::uncaught_exception, вызванная внутри terminate_handler, возвращает false, в остальных true (terminate_handler устанавливается посредством std::set_terminate()).
Прикрепленные примеры воспроизводят указанные выше 7 ситуаций для "неявного" вызова terminate() и выводят результат std::uncaught_exception().
Раздел стандарта
Linux Standard Base C++ Specification 3.2, Chapter 9. Libraries, 9.1. Interfaces for libstdcxx, который ссылается на ISO/IEC 14882: 2003 Programming languages --C++, section 18.6.4
Компонент
libstdc++
Принято
GCC Bugzilla 37477
[В начало]