Address Sanitizer 是否可以在检测到错误后立即中止?
Can Address Sanitizer abort immediately after an error is detected?
我将系统调用检查器与 -fsanitize=address
结合使用,当 ASAN 发现错误时,它会在打印报告时调用一些系统调用(ioctl(ISATTY)
等)。系统调用检查器中断 ASAN 的 ioctls 并且错误报告未正确收集。
我想要的是让 ASAN 简单地中止而不打印报告,或者失败,一种确定(可能使用 libasan4 API 调用)ASAN 发现错误的方法,这样我就可以停止拦截系统调用的系统调用检查器。
不幸的是,来自 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()
调用,因此它正常退出(),而我希望保持 ASAN 的 abort()
ing 行为。
您应该能够在打印报告之前通过覆盖 __asan_on_error
(在 [=12= 中声明],默认为空)进行拦截:
// 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
的默认定义)。
我将系统调用检查器与 -fsanitize=address
结合使用,当 ASAN 发现错误时,它会在打印报告时调用一些系统调用(ioctl(ISATTY)
等)。系统调用检查器中断 ASAN 的 ioctls 并且错误报告未正确收集。
我想要的是让 ASAN 简单地中止而不打印报告,或者失败,一种确定(可能使用 libasan4 API 调用)ASAN 发现错误的方法,这样我就可以停止拦截系统调用的系统调用检查器。
不幸的是,来自 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()
调用,因此它正常退出(),而我希望保持 ASAN 的 abort()
ing 行为。
您应该能够在打印报告之前通过覆盖 __asan_on_error
(在 [=12= 中声明],默认为空)进行拦截:
// 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
的默认定义)。