检测到错误后,Address Sanitizer是否可以立即中止?

时间:2018-07-04 14:07:00

标签: gcc llvm sanitizer address-sanitizer

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

我希望ASAN在不打印报告的情况下就简单地中止而不会失败,这是一种确定(可能使用libasan4 API调用)ASAN发现错误的方法,因此我可以阻止syscall检查器拦截系统调用

不幸的是,在ASAN收集报告之后,来自libasan4的__asan_error_report__sanitizer_set_death_callback__asan_set_error_report_callback都已启动:

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

并且系统调用检查器不能正确处理ASAN的ioctl()调用,因此它正常退出(),而我希望保持ASAN的abort()ing行为。

1 个答案:

答案 0 :(得分:1)

您应该能够通过覆盖__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中的默认定义)。