standards/175453: Catching C++ std::bad_cast doesn't work in FreeBSD 9.1
Konstantin Belousov
kostikbel at gmail.com
Mon Jan 21 04:49:23 UTC 2013
On Sun, Jan 20, 2013 at 08:08:21PM -0800, Pedro Giffuni wrote:
>
>
>
>
> ----- Messaggio originale -----
> > Da: Konstantin Belousov
> >
> > On Sun, Jan 20, 2013 at 04:52:00PM +0000, Hongli Lai wrote:
> >>
> >> >Number: 175453
> >> >Category: standards
> >> >Synopsis: Catching C++ std::bad_cast doesn't work in FreeBSD
> > 9.1
> >> >Confidential: no
> >> >Severity: non-critical
> >> >Priority: low
> >> >Responsible: freebsd-standards
> >> >State: open
> >> >Quarter:
> >> >Keywords:
> >> >Date-Required:
> >> >Class: sw-bug
> >> >Submitter-Id: current-users
> >> >Arrival-Date: Sun Jan 20 17:00:00 UTC 2013
> >> >Closed-Date:
> >> >Last-Modified:
> >> >Originator: Hongli Lai
> >> >Release: 9.1-RELEASE
> >> >Organization:
> >> Phusion
> >> >Environment:
> >> FreeBSD freebsd9 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec 4
> > 09:23:10 UTC 2012
> >> root at farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
> >> >Description:
> >> C++ code is not able to catch std::bad_cast exceptions, even though it
> > should. If a dynamic_cast is within a try-catch block, then that block fails to
> > catch std::bad_cast, and the program crashes with an uncaught exception as a
> > result.
> >>
> >> I've attached a reproducible test case. You can also find it at
> > http://forums.freebsd.org/showthread.php?p=205804#post205804 and
> > http://stackoverflow.com/questions/14413703/why-does-catching-stdbad-cast-not-work-on-freebsd-9.
> > The code is compiled with the following GCC version:
> >>
> >> $ gcc -v
> >> Using built-in specs.
> >> Target: amd64-undermydesk-freebsd
> >> Configured with: FreeBSD/amd64 system compiler
> >> Thread model: posix
> >> gcc version 4.2.1 20070831 patched [FreeBSD]
> >>
> >> FreeBSD 9.1 seems to be the only platform on which this bug appears. The
> > code works as expected on Linux and OS X. According to a commenter, FreeBSD 9.0
> > works as expected too. According to another commenter the code fails on FreeBSD
> > 9.1 with Clang too.
> >> >How-To-Repeat:
> >> See attached C++ program.
> >> >Fix:
> >>
> >>
> >> Patch attached with submission follows:
> >>
> >> #include <exception>
> >> #include <typeinfo>
> >> #include <stdio.h>
> >>
> >> class foo {
> >> public:
> >> virtual ~foo() {}
> >> };
> >>
> >> class bar: public foo {
> >> public:
> >> int val;
> >> bar(): val(123) {}
> >> };
> >>
> >> static void
> >> cast_test(const foo &f) {
> >> try {
> >> const bar &b = dynamic_cast<const bar &>(f);
> >> printf("%d\n", b.val);
> >> } catch (const std::bad_cast &) {
> >> printf("bad cast\n");
> >> }
> >> }
> >>
> >> int main() {
> >> foo f;
> >> cast_test(f);
> >> return 0;
> >> }
> >>
> > Confirmed, and it seems that the culprit is libstdc++. At least replacing
> > the system libstdc++.so.6 with the library from the stock build of gcc
> > 4.7.2 (without touching libgcc_s.so.1) makes the catch operator working.
> >
>
> Confirmed,
>
> The problem is actually not in any of the code updates to libstdc++ but
> in the way libstdc++ is configured/build since 9.0.
>
> Reverting the changes in stable/9/gnu/lib/libstdc up to r229037 things work
> just fine.
>
> I suspect the culprit is r233749 and subsequent changes to build libstdc++
> as a filter library for libsupc++.
>
> This also seems similar ot PR kern/171610.
Yes, quite possible. AFAIR, the 'catch' code compares the exception classes
by the shared object ownership. It might get confused due to filter providing
some symbols.
But I did not investigated the cause for real.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-toolchain/attachments/20130121/580a278c/attachment.sig>
More information about the freebsd-toolchain
mailing list