standards/175453: Catching C++ std::bad_cast doesn't work in FreeBSD 9.1

Konstantin Belousov kostikbel at gmail.com
Mon Jan 21 01:47:51 UTC 2013


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.
-------------- 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/603861aa/attachment.sig>


More information about the freebsd-toolchain mailing list