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 > [email protected]:/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.
pgp6p3P9N1dFv.pgp
Description: PGP signature
