如何区分Address Sanitizer错误与程序自身错误?exitcode设置无效排查
解决Address Sanitizer退出码无法自定义的问题
问题根源
默认情况下,ASAN检测到内存错误后会调用abort()触发SIGABRT信号终止程序,此时shell返回的退出码是128 + 信号编号(比如SIGABRT对应6,退出码为134),而非你通过ASAN_OPTIONS设置的exitcode值。你看到退出码始终为1,大概率是环境中存在信号退出码的特殊处理,但核心问题是exitcode选项仅在ASAN使用exit()而非信号终止程序时才生效。
解决方法
必须同时设置两个ASAN选项:
abort_on_error=0:禁用ASAN通过abort()终止程序的行为,改用exit()返回指定码exitcode=N:自定义ASAN检测到错误时的退出码(N可取0-255之间任意值)
验证示例
用你的编译后的程序测试:
ASAN_OPTIONS="abort_on_error=0:exitcode=0" /tmp/tmp.bin ; echo $?
此时输出应为0,即你设置的自定义退出码。
区分两种失败场景
- ASAN检测到错误:按配置返回自定义
exitcode值 - 程序自身运行失败(如main返回非0、被其他信号终止):退出码由程序本身或对应信号规则决定,不受ASAN的
exitcode配置影响,以此实现两种失败场景的区分
内容的提问来源于stack exchange,提问作者Sourav Kannantha B
相关产品推荐
相关产品推荐

