You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用opt命令结合AddressSanitizer Pass构建LLVM-IR报错的解决咨询

如何通过opt命令正确将AddressSanitizer Pass应用到LLVM-IR代码?

我尝试用opt命令给LLVM-IR文件(.ll)添加AddressSanitizer(ASan)Pass,执行了命令:

opt -asan Input.ll -o Output.ll

但触发错误,提示必须先运行ASanGlobalsMetadataAnalysis前置Pass,错误信息如下:

LLVM ERROR: The ASanGlobalsMetadataAnalysis is required to run before AddressSanitizer can run
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.  Program arguments: opt -asan ASan_Input.ll -o your_output.ll
 #0 0x0000563ad350c455 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x0000563ad3509b4e SignalHandler(int) Signals.cpp:0:0
 #2 0x00007f0a0ea42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #3 0x00007f0a0ea96a7c __pthread_kill_implementation ./nptl/./nptl/pthread_kill.c:44:76
 #4 0x00007f0a0ea96a7c __pthread_kill_internal ./nptl/./nptl/pthread_kill.c:78:10
 #5 0x00007f0a0ea96a7c pthread_kill ./nptl/./nptl/pthread_kill.c:89:10
 #6 0x00007f0a0ea42476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #7 0x00007f0a0ea287f3 abort ./stdlib/./stdlib/abort.c:81:7
 #8 0x0000563ad3448467 llvm::report_fatal_error(llvm::Twine const&, bool) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x27c2467)
 #9 0x0000563ad34485ce (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x27c25ce)
#10 0x0000563ad2f9a511 llvm::AddressSanitizerPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x2314511)
#11 0x0000563ad11ba526 llvm::detail::PassModel<llvm::Function, llvm::AddressSanitizerPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x534526)
#12 0x0000563ad16b8628 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function> >, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0xa32628)
#13 0x0000563ad2bd4c94 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x1f4ec94)
#14 0x0000563ad11ba7c6 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x5347c6)
#15 0x0000563ad2bce9a5 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x1f489a5)
#16 0x0000563ad11c5d1d llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::StringRef>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool) (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x53fd1d)
#17 0x0000563ad10ef4fd main (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x4694fd)
#18 0x00007f0a0ea29d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#19 0x00007f0a0ea29e40 call_init ./csu/../csu/libc-start.c:128:20
#20 0x00007f0a0ea29e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#21 0x0000563ad11b8a95 _start (/home/wldns190/rust/build/x86_64-unknown-linux-gnu/llvm/bin/opt+0x532a95)
Aborted

解决方案

方法1:使用预定义的ASan完整Pass流水线(推荐)

直接通过-passes参数调用LLVM预定义的asan-pipeline,它会自动包含所有ASan运行所需的前置分析和转换Pass,无需手动处理依赖:

opt -passes='asan-pipeline' Input.ll -o Output.ll

方法2:手动指定依赖Pass(不推荐,易遗漏)

若需要手动控制Pass顺序,必须先运行模块级的asan-globals-metadata-analysis分析Pass,再执行函数级的asan转换Pass:

opt -passes='module(asan-globals-metadata-analysis),function(asan)' Input.ll -o Output.ll

注意:asan-globals-metadata-analysis是模块级Pass,需要用module()包裹;asan是函数级Pass,用function()包裹以确保作用域正确。

额外注意事项

  • 确认LLVM版本支持asan-pipeline(LLVM 12及以上版本基本都支持)
  • 确保输入的LLVM-IR文件完整、未经过破坏性优化,避免ASan无法正确插入检测代码
  • 若后续要生成可执行文件,需链接ASan运行时库,比如用:clang -fsanitize=address Output.ll -o executable

内容的提问来源于stack exchange,提问作者MJUCOM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:22:32