gpt4 book ai didi

error-handling - LLVM "fatal errors"真的致命吗?

转载 作者:行者123 更新时间:2023-12-03 08:43:06 28 4
gpt4 key购买 nike

我想知道 LLVM fatal error 是否真的“致命” - 即。它们使系统的整个状态无效并且不可恢复。

例如(我使用的是llvm-c接口(interface)),下面代码的默认行为:

   LLVMMemoryBufferRef mb = LLVMCreateMemoryBufferWithMemoryRange(somedata, data_length, "test", 0);
LLVMModuleRef module;
if (LLVMParseBitcode2(mb, &module) != 0) {
fprintf(stderr, "could not parse module bitcode");
}

是如果指针 somedata指向无效的位码,fprintf 永远不会执行,而是整个过程中止,并在 stderr 上显示其自己的 fatal error 消息。

但是,据说有一个接口(interface)可以捕获此类错误: LLVMFatalErrorHandler .但是,在安装错误处理程序后,进程仍然只是中止而不调用错误处理程序。

LLVM 中的文档总体上很差,C 接口(interface)几乎没有文档。但是,如果某些位码损坏,则以强制方式中止整个过程似乎是 super 脆弱的设计!

所以,我想知道这里的“致命”是否像往常一样暗示 - 如果发生这样的错误,我们可能无法恢复并继续使用该库(例如尝试一些不同的位码或修复旧的位码),或者如果它不是真正的“致命”错误,我们可以得到 FatalErrorHandler或其他一些捕获和通知的方式,或采取其他补救措施,并继续程序。

最佳答案

好的,在阅读了 10 多个小时的 LLVM 源代码并寻求友好的 LLVM 开发人员的帮助之后,这里的答案是,这实际上并不是一个致命的错误,毕竟!

上面在 C 接口(interface)中调用的函数已弃用,应该已删除; LLVM 曾经有一个“全局上下文”的概念,并且在几年前就被删除了。正确的方法是使用 LLVMDiagnosticInfo创建 LLVMContext 后的界面实例并使用特定于上下文的位码阅读器功能:

   void llvmDiagnosticHandler(LLVMDiagnosticInfoRef dir, void *p) {
fprintf(stderr, "LLVM Diagnostic: %s\n", LLVMGetDiagInfoDescription(dir));
}

...

LLVMContextRef llvmCtx = LLVMContextCreate();
LLVMContextSetDiagnosticHandler(llvmCtx, llvmDiagnosticHandler, NULL);
LLVMMemoryBufferRef mb = LLVMCreateMemoryBufferWithMemoryRange(somedata, data_length, "test", 0);
LLVMModuleRef module;
if (LLVMGetBitcodeModuleInContext2(llvmCtx, mb, &module) != 0) {
fprintf(stderr, "could not parse module bitcode");
}
LLVMDiagnosticInfo还带有一个“严重性”代码,指示错误的严重性(有时仅返回警告或性能提示)。此外,正如我所怀疑的那样,未能解析位码不会使库或上下文状态无效。

因粗鲁的错误消息而中止的代码只是让仍然调用旧 API 函数的遗留应用程序工作的权宜之计——它设置了一个上下文和一个以这种方式运行的最小错误处理程序。

关于error-handling - LLVM "fatal errors"真的致命吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59911752/

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