gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:02:39 25 4
gpt4 key购买 nike

具体来说,我想知道 GCC 对抛出异常的代码在链接到使用 -fno-exceptions 编译的代码时的行为做出了哪些保证(如果有的话)。

GNU libstdc++ 手册说以下 here

Before detailing the library support for -fno-exceptions, first a passing note on the things lost when this flag is used: it will break exceptions trying to pass through code compiled with -fno-exceptions whether or not that code has any try or catch constructs. If you might have some code that throws, you shouldn't use -fno-exceptions. If you have some code that uses try or catch, you shouldn't use -fno-exceptions.

这听起来像是“你不应该......”的声明,即未定义的行为。

另一方面,我对 this SO question 的印象是,只要使用 -fno-exceptions 编译的代码不会 throw trycatch(显然是编译时错误)并且异常永远不会通过该库中的函数传播。这是有道理的:为什么用 -fno-exceptions 编译的库应该关心是否抛出异常,只要它们不与其函数交互?

我做了一些修改,发现如果我使用 GCC 7.1.1 编译一个简单的程序,其中一个源文件使用 -fno-exceptions 编译,另一个会抛出并捕获异常,一切都编译、链接和运行良好。但这并不意味着这种行为是有保证的;它可能仍然是未定义的。

我在这一切中的动机是我有一种情况,我将自己的应用程序代码与使用 -fno-exceptions 构建的库链接,并且取决于进行了哪些函数调用对于所述库,在我自己的代码中抛出异常会立即导致段错误,即使该异常没有通过库的函数传播。对我来说,这闻起来像是库中的一个错误,但我想也许在编译期间传递 -fno-exceptions 时这是允许的。

GCC 的 actual reference on code-generation flags 相对简短地提到了 -fexceptions 并且没有回答我的问题。有人知道其他引用/有相关经验吗?

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

最佳答案

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

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

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

关于c++ - 当抛出异常的代码链接到使用 -fno-exceptions 编译的库时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45935978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com