如何修复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
相关产品推荐
相关产品推荐

