【问题标题】:-fno-exceptions for some libraries?某些库的-fno-exceptions?
【发布时间】:2014-04-11 07:02:20
【问题描述】:

这有点类似于“Disabling C++ exceptions, how can I make any std:: throw() immediately terminate?”。我希望我的程序在 STL 抛出异常时终止。

问题如下:我正在编写一个库,然后将其作为共享对象加载并由我无法控制的程序执行。不幸的是,这个程序在一个大的尝试块中运行所有东西,所以如果抛出错误,我不会得到堆栈跟踪/核心转储,从而使 ::at 函数类的超出范围错误无用。

这听起来像是 -fno-exceptions 的理想用例,但我不能只使用 -fno-exceptions,因为 boost_log 和调用我的程序都在它们的头文件中定义了异常处理,这给了我编译错误 - fno-exceptions。

有没有办法只为 stl 异常启用 -fno-exceptions?

【问题讨论】:

  • 在 libstdc++ 中,如果at 检测到参数超出范围,它会调用void std::__throw_out_of_range(char const*)。如果您使用相同的名称定义自己的函数并安排在链接时选择它(LD_PRELOAD 对于实验来说可能是最简单的),您应该能够将行为更改为您喜欢的任何内容。
  • @MarcGlisse 谢谢,会试试的。
  • “STL”作为一个独立的库在 1998 年几乎停止存在;在当今的 C++ 中确实没有“STL 异常”之类的东西。当前的大部分库都可以追溯到 Boost 而不是 STL。 (当然,不少编译器供应商已经重新实现了这些类)
  • 如果你在做C++11,你可以把你的函数标记为noexcept,所以如果有异常试图逃逸,程序会立即终止。
  • @MarcGlisse 看来noexcept 确实是我的最佳解决方案。

标签: c++ exception stl g++ compiler-flags


【解决方案1】:

使用 C++11,最简单的方法是将 noexcept 添加到从共享库调用的顶级函数的签名中:

void called_func() noexcept;

这将导致called_func 堆栈帧中的任何未处理异常(如果未处理,则在下面)终止程序的执行。

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2020-11-10
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多