Может ли Address Sanitizer прервать работу сразу после обнаружения ошибки?

Я использую средство проверки системных вызовов в сочетании с -fsanitize=address, и когда ASAN находит ошибку, он вызывает некоторые системные вызовы (ioctl(ISATTY) и т. Д.) При печати отчета. Средство проверки системного вызова прерывает ioctls ASAN, и отчет об ошибках не собирается должным образом.

Я хотел бы, чтобы ASAN просто прервал работу, не печатая отчет или не выполнив этого, способ определить (возможно, с помощью вызова API libasan4), что ASAN обнаружил ошибку, так что я могу помешать контроллеру syscall перехватывать системные вызовы.

к несчастью __asan_error_report, __sanitizer_set_death_callback а также __asan_set_error_report_callback из libasan4 все запускаются после того, как ASAN собрал отчет:

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

А средство проверки системных вызовов не обрабатывает вызовы ASAN ioctl() должным образом, поэтому она обычно выполняет exit(), в то время как я надеюсь сохранить поведение ASAN в abort().

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).

Другие вопросы по тегам