Подробности

[В начало]

Проблема в реализации № 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):

  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.
  2. when the exception handling mechanism cannot find a handler for a thrown exception, or
  3. when the destruction of an object during stack unwinding exits using an exception, or
  4. when construction or destruction of a non-local object with static storage duration exits using an exception, or
  5. when execution of a function registered with atexit exits using an exception, or
  6. when a throw-expression with no operand attempts to rethrow an exception and no exception is being handled, or
  7. 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

[В начало]