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

如何修复libFuzzer Go可执行文件的SA_ONSTACK信号处理器错误?

修复Go 1.18 + libFuzzer 信号处理冲突错误

问题背景

使用go-118-fuzz-build将原生Go 1.18模糊测试用例转为libFuzzer可执行文件时,出现以下错误:

signal 11 received but handler not on signal stack
fatal error: non-Go code set up signal handler without SA_ONSTACK flag

该错误源于Go运行时要求所有信号处理器必须设置SA_ONSTACK标志,但libFuzzer默认的信号处理器未满足此要求,导致二者信号处理逻辑冲突,无法正常获取崩溃堆栈。

解决方案

1. 结合AddressSanitizer (ASAN)编译(推荐)

错误提示中也建议结合ASAN使用,ASAN的信号处理器会自动适配Go的要求,同时还能提供更详细的崩溃诊断信息:

  • 修改编译测试用例的命令,添加ASAN参数:
    go-118-fuzz-build -libfuzzer -sanitizer=address -o fuzz_target.a -func $func ./tmp
    
  • 修改构建可执行文件的命令,同时启用fuzzer和ASAN:
    clang -fsanitize=fuzzer,address fuzz_target.a -o fuzz_target
    
  • 运行模糊测试时无需额外修改,ASAN会自动处理信号逻辑,同时生成带详细堆栈的崩溃报告。

2. 临时禁用Go的信号栈检查(仅用于排查)

通过GODEBUG环境变量禁用Go运行时对信号栈的检查,绕过该错误(不推荐长期使用,可能影响稳定性):

GODEBUG=signalstack=0 ./fuzzer -print_final_stats=1 -artifact_prefix=./crashes/ -error_exitcode=76 -max_total_time=600 corpus -max_total_time=300

注:signalstack=0参数在Go 1.18及以上版本可用,用于关闭信号栈强制检查。

3. 升级go-118-fuzz-build到最新版本

该工具作为第三方适配工具,后续版本可能已修复与Go运行时信号处理的兼容性问题。执行以下命令升级:

go install github.com/AdamKorcz/go-118-fuzz-build@latest

升级后重新按照原有步骤编译、运行,问题可能已自动解决。

4. 手动调整信号处理器(进阶)

若上述方法无效,可手动修改go-118-fuzz-build生成的代码,在libFuzzer初始化信号处理器的部分添加SA_ONSTACK标志。具体需找到信号注册的代码段,在调用sigaction时,将sa_flags设置为包含SA_ONSTACK。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:25:22