1

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

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

不幸的是__asan_error_report,从 libasan4 开始,在 ASAN 收集报告之后:__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()

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

4

1 回答 1

2

您应该能够在通过覆盖打印报告之前进行拦截__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)。

于 2018-07-04T14:28:45.373 回答