地址消毒器可以在检测到错误后立即中止吗? [英] Can Address Sanitizer abort immediately after an error is detected?

查看:22
本文介绍了地址消毒器可以在检测到错误后立即中止吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将syscall检查器与-fsanitize=address结合使用,当ASAN发现错误时,它会在打印报告时调用一些syscall(ioctl(ISATTY)等)。系统调用检查器中断ASAN的ioctls,并且未正确收集错误报告。

我想让ASAN在不打印报告或不打印报告的情况下简单地中止,这样就可以确定(可能使用libasan4 API调用)ASAN发现了错误,这样我就可以停止syscall检查器拦截syscall。

遗憾的是,来自libasan4的__asan_error_report__sanitizer_set_death_callback__asan_set_error_report_callback都是在Asan收集报告后生效的:

0 __asan_error_report()
1 syscall_checker()
2 ioctl(ISATTY)
3 asan::PrintReport()
4 app_code_that_crashes()

并且系统调用检查器没有正确处理ASAN的ioctl()调用,所以它正常退出()%s,而我希望保留ASAN的abort()行为。

推荐答案

您应该可以在报表打印前通过覆盖__asan_on_error(在asan_interface.h中声明,默认为空)进行拦截:

// User may provide function that would be called right when ASan detects
// an error. This can be used to notice cases when ASan detects an error, but
// the program crashes before ASan report is printed.
void __asan_on_error();

请注意,由于奇怪的Asan回调接口,您最好在主二进制中实现此回调(共享库中的定义可能无法拦截来自libasan.a的默认定义)。

这篇关于地址消毒器可以在检测到错误后立即中止吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆