Gcc 检测到错误后,地址消毒器能否立即中止?

Gcc 检测到错误后,地址消毒器能否立即中止?,gcc,llvm,sanitizer,address-sanitizer,Gcc,Llvm,Sanitizer,Address Sanitizer,我将系统调用检查器与-fsanize=address结合使用,当ASAN发现一个bug时,它会在打印报告时调用一些系统调用(ioctl(ISATTY),等等)。系统调用检查器中断ASAN的IOCTL,错误报告未正确收集 我想让ASAN在不打印报告的情况下简单地中止,或者在打印失败的情况下,找到一种确定ASAN发现错误的方法(可能使用libasan4API调用),这样我就可以阻止syscall checker拦截syscall 不幸的是,libasan4的\u asan\u error\u rep

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

我想让ASAN在不打印报告的情况下简单地中止,或者在打印失败的情况下,找到一种确定ASAN发现错误的方法(可能使用libasan4API调用),这样我就可以阻止syscall checker拦截syscall

不幸的是,libasan4的
\u asan\u error\u report
\u sanitar\u set\u death\u callback
\u asan\u set\u error\u report\u callbackback
都是在asan收集报告后启动的:

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

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

在打印报告之前,您应该能够通过覆盖
\u ASAN\u on\u error
(在
ASAN\u interface.h
中声明,默认为空):


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

正确,谢谢。我之前的错误是试图在syscallchecker(a.so lib)中定义u asan_on_错误。如果我在主应用程序二进制文件中重写它,它会工作。是的,因为由于插入语义
。因此
无法重写链接到主二进制文件的
libasan.a
中的定义。由于这个原因,我发现一些回调的接口非常笨拙(
\u asan\u default\u options
也有同样的问题)。我已经更新了答案。
// 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();