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

 ̄綄美尐妖づ 提交于 2019-12-23 07:11:50

问题


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?


回答1:


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.



来源:https://stackoverflow.com/questions/14413703/why-does-catching-stdbad-cast-not-work-on-freebsd-9

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!