当抛出异常的代码链接到使用-fno-exceptions编译的库时会发生什么?

Sam*_*lli 14 c++ gcc exception compiler-flags segmentation-fault

具体来说,我想知道GCC有什么保证关于在使用编译的代码链接时抛出异常行为的代码的方式-fno-exceptions.

GNU libstdc++手册在此处说明如下.

在详细说明库支持之前-fno-exceptions,首先要记下使用此标志时丢失的内容:它将破坏尝试传递代码的异常,-fno-exceptions无论代码是否具有任何构造trycatch构造.如果您可能有一些抛出的代码,则不应使用-fno-exceptions.如果您有一些使用try或的代码,则catch不应使用-fno-exceptions.

这听起来像是一句话,"你不应该......"即未定义的行为.

在另一方面,我从感觉这太问题是,一切都是犹太只要用编译的代码-fno-exceptions不会throw,trycatch(显然是一个编译时错误)和异常从来没有经历过这个库的函数传播.它是有道理的:为什么-fno-exceptions如果异常被抛出只要它们不与它的函数交互,那么库是否应该小心编译?

我做了一点修改,发现如果我使用GCC 7.1.1编译一个简单的程序,其中一个源文件被编译-fno-exceptions而另一个抛出并捕获异常,所有内容都编译,链接和运行正常.但这并不意味着这种行为得到保证; 它仍然可能是未定义的.

我所有这一切的动机是我有一种情况,我将我自己的应用程序代码链接到一个用-fno-exceptions它构建的库,并且根据对所述库进行的函数调用,在我自己的代码中抛出一个异常导致立即即使异常没有通过库的函数传播,也会发生段错误.它对我来说闻起来像库中的一个错误,但我想也许-fno-exceptions在编译过程中这是允许的.

GCC 对代码生成标志实际参考提到了-fexceptions相对简短,并没有回答我的问题.有谁知道另一个参考/有相关经验?

更新:我从源代码重建了库,这次启用了异常支持.段错仍然存在!错误报告的时间.

MSa*_*ers 2

正如链接的问题所指出的,GCC需要允许-fno-exceptions并存-fexceptions,以便链接 C 和 C++。

从更理论的层面上来说,异常问题与程序的调用图密切相关。这是一个有向图(调用者/被调用者),但它可以是循环的,并且节点之间可以有多个边。现在每个函数/节点都可以在有或没有异常的情况下进行编译。我们可以将安全程序定义为从“无例外”节点无法到达“有例外”节点的程序。

这可能是不必要的严格 - 块中的 C++ 代码位try...catch(...) { }应该可以从 C 代码调用,这似乎是合理的。但我不知道海湾合作委员会对此有何保证。并考虑它的含义 - 调用图与调用堆栈相关。main()调用堆栈通常形成从当前正在执行的函数的路径。如果整个路径都是异常感知的,那么异常就是安全的。但是,如果有一个函数不知道异常,它可能会将堆栈置于无法安全处理异常的状态,即使堆栈展开不会展开那么远。