地址消毒器可以在检测到错误后立即中止吗? [英] Can Address Sanitizer abort immediately after an error is detected?
本文介绍了地址消毒器可以在检测到错误后立即中止吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我将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屋!
查看全文