Может ли Address Sanitizer прерваться сразу после обнаружения ошибки? - PullRequest
0 голосов
/ 04 июля 2018

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

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

К сожалению __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 () должным образом, поэтому она нормально завершает работу (), в то время как я надеюсь сохранить в ASAN поведение abort () ing.

1 Ответ

0 голосов
/ 04 июля 2018

Вы должны быть в состоянии перехватить, прежде чем отчет будет напечатан путем переопределения __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).

...