- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
具体来说,我想知道 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 anytry
orcatch
constructs. If you might have some code that throws, you shouldn't use-fno-exceptions
. If you have some code that usestry
orcatch
, you shouldn't use-fno-exceptions
.
这听起来像是“你不应该......”的声明,即未定义的行为。
另一方面,我对 this SO question 的印象是,只要使用 -fno-exceptions
编译的代码不会 throw
、 try
或 catch
(显然是编译时错误)并且异常永远不会通过该库中的函数传播。这是有道理的:为什么用 -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/
除了 -fno-exceptions 之外,使用 -fno-unwind-tables 有什么好处——尤其是在(独立的)C++ 嵌入式系统上? 根据 Practical Guide to Bare M
我正在尝试以更可调试的状态编译seabios,因此我想取消函数内联。 为此,我在编译标志中添加了-fon-inline,但是随后出现编译错误: error: can't find a registe
所以我正在阅读Hacking the Art of Exploitation,在书中,他们在 C 代码中使用了 strcpy() 函数: 1 #include 2 #include 3
我正在做一个大项目,大多数文件都超过 7000 行。如果我使用 -fno-inline 选项,编译时间会减少 3 倍。实际数字: 无 -fno-inline - 340 秒 w/-fno-inline
这有点类似于“Disabling C++ exceptions, how can I make any std:: throw() immediately terminate?”。我希望我的程序在 S
在以下代码中(使用-std=c++14 -Wall -fno-elide-constructors在gcc 9.2上构建): struct Noisy { Noisy() { std::cou
我编写了以下 C 程序来查看缓冲区溢出的工作原理。我已保存此程序文件,名称为 bo.c #include #include int authentication(char *k
我刚刚将我所有的文件重新添加到项目中,大约有 150 个文件需要使用 -fno-objc-arc 因为要发布。有什么快速的方法可以将 -fno-objc-arc 标志添加到所有使用 arc 的文件,而
我正在调试我的程序,然后发生了最后一行,我该如何解决?我使用 -fno-builtin 查看了 strcpy() 但它显示正在调用 __strcpy_sse2_unaligned。 root@19:~
我正在尝试使用 autogen 和 configure 在第三方代码中生成 Makefile。我想将 –fno-strict-aliasing 添加到 gcc 以解决代码中的编译问题。 我想这可以在
我有一个函数,出于性能原因,我在其中输入双关语。基本上,我有一个存储为 32 个 uint32 数组的 32×32 位数组: struct Tile { uint32_t d[32]; };
我正在尝试从使用 -fno-rtti 编译的共享库进行子类化。不幸的是,我的代码库中的其他库需要 -frtti。结果我收到链接错误,因为父类(super class)没有类型信息结构。 正常编译收到的
我正在编写一个 C++ 库,我想让我的 API 为无效参数抛出异常,但是当使用 -fno-exceptions 编译代码时,我依赖于断言。 有没有办法在编译时检测我是否被允许使用异常处理?请注意,我正
在运行优化版代码(以NaN和g++ 4.8.2编译)时发现一个使一切变成4.9.3的错误时,我确定问题出在-Ofast选项,特别是它包括的-ffinite-math-only标志。 该代码的一部分包括
假设一个简单的文件bla.cpp: struct MyClass { virtual int foo(int x); virtual ~MyClass(); }; int MyClass::f
我正在学习 C++,我遇到了 -fno-elide-constructors,下面我包含了手册页中的描述。 -fno-elide-constructors The C++ stan
我用 C 编写了一个应用程序,我试图了解编译时 -fno-stack-protector 命令的用途。对于我的具体应用,是否使用此命令在防止缓冲区溢出方面没有区别。 我在网上看到 -fstack-pr
具体来说,我想知道 GCC 对抛出异常的代码在链接到使用 -fno-exceptions 编译的代码时的行为做出了哪些保证(如果有的话)。 GNU libstdc++ 手册说以下 here 。 Bef
是否有任何研究或一组基准显示性能由于在 GCC 中指定 -fno-strict-aliasing(或在其他编译器中等效)? 最佳答案 它会因编译器而异,因为不同的编译器以不同的攻击级别实现它。 GCC
由于符号插入,类 Unix 系统中的共享对象 (*.so) 效率低下:每次访问 .so 中的全局变量都需要 GOT 查找,并且每次从一个函数调用 .so 中的另一个函数都需要一个 PLT抬头。因此,我
我是一名优秀的程序员,十分优秀!