具体来说,我想知道GCC有什么保证关于在使用编译的代码链接时抛出异常行为的代码的方式-fno-exceptions.
GNU libstdc++手册在此处说明如下.
在详细说明库支持之前
-fno-exceptions,首先要记下使用此标志时丢失的内容:它将破坏尝试传递代码的异常,-fno-exceptions无论代码是否具有任何构造try或catch构造.如果您可能有一些抛出的代码,则不应使用-fno-exceptions.如果您有一些使用try或的代码,则catch不应使用-fno-exceptions.
这听起来像是一句话,"你不应该......"即未定义的行为.
在另一方面,我从感觉这太问题是,一切都是犹太只要用编译的代码-fno-exceptions不会throw,try或catch(显然是一个编译时错误)和异常从来没有经历过这个库的函数传播.它是有道理的:为什么-fno-exceptions如果异常被抛出只要它们不与它的函数交互,那么库是否应该小心编译?
我做了一点修改,发现如果我使用GCC 7.1.1编译一个简单的程序,其中一个源文件被编译-fno-exceptions而另一个抛出并捕获异常,所有内容都编译,链接和运行正常.但这并不意味着这种行为得到保证; 它仍然可能是未定义的.
我所有这一切的动机是我有一种情况,我将我自己的应用程序代码链接到一个用-fno-exceptions它构建的库,并且根据对所述库进行的函数调用,在我自己的代码中抛出一个异常导致立即即使异常没有通过库的函数传播,也会发生段错误.它对我来说闻起来像库中的一个错误,但我想也许-fno-exceptions在编译过程中这是允许的.
GCC 对代码生成标志的实际参考提到了-fexceptions相对简短,并没有回答我的问题.有谁知道另一个参考/有相关经验?
更新:我从源代码重建了库,这次启用了异常支持.段错仍然存在!错误报告的时间.
我正在尝试跟随关于编译器实现的LLVM教程,但是当我尝试发出目标代码时,我的代码会出现段错误.
这是一个尝试编译函数的最小示例func.为了简单起见,这func是一个什么都不做的功能.
#include <iostream>
#include <llvm/ADT/Optional.h>
#include <llvm/IR/BasicBlock.h>
#include <llvm/IR/DerivedTypes.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/IRBuilder.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Type.h>
#include <llvm/IR/Verifier.h>
#include <llvm/Support/CodeGen.h>
#include <llvm/Support/FileSystem.h>
#include <llvm/Support/Host.h>
#include <llvm/Support/TargetRegistry.h>
#include <llvm/Support/TargetSelect.h>
#include <llvm/Support/raw_ostream.h>
#include <llvm/Target/TargetMachine.h>
#include <llvm/Target/TargetOptions.h>
#include <stdexcept>
#include <string>
#include <system_error>
#include <vector>
int main() {
llvm::LLVMContext context;
llvm::IRBuilder<> builder(context);
llvm::Module module("module", context);
llvm::Function* const func = llvm::Function::Create(
llvm::FunctionType::get(llvm::Type::getVoidTy(context),
std::vector<llvm::Type*>(), false),
llvm::Function::ExternalLinkage, "func", &module
);
builder.SetInsertPoint(llvm::BasicBlock::Create(context, "entry", func));
llvm::verifyFunction(*func);
func->dump();
llvm::InitializeAllTargetInfos(); …Run Code Online (Sandbox Code Playgroud)