简体   繁体   中英

Why does catching std::bad_cast not work on FreeBSD 9?

Consider this code (badcast.cpp):

#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;
}

FreeBSD 9.1:

$ g++ badcast.cpp -o badcast -Wall && ./badcast
terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast
Abort trap (core dumped)

$ g++ badcast.cpp -o badcast -frtti -fexceptions -Wall && ./badcast
terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast
Abort trap (core dumped)

$ 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]

$ uname -a
FreeBSD freebsd9 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec  4 09:23:10 UTC 2012     root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

Debian Linux 6:

$ g++ badcast.cpp -o badcast -Wall && ./badcast
bad cast

OS X 10.8:

$ g++ badcast.cpp -o badcast -Wall && ./badcast
bad cast

Why does catching bad_cast not work on FreeBSD?

As a wild guess, there's a chance in FreeBSD you might be using LLVM's new libc++ , instead of the old GNU libstdc++ . FreeBSD has been working towards switching over to the LLVM toolchain , away from GNU GPL licensed software.

Apple's moving that way too, and in the past I've ran into issues developing for Mac using libc++ that libstdc++ didn't have (especially with Boost).

You can use ldd to confirm what libraries you're linking against:

ldd ./badcast

If it is linking against libc++ , you might want to file the bug and test case with the LLVM project .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM