gcc ASAN не останавливается на предполагаемой ошибке во время выполнения
Я хотел бы, чтобы адрес sanitizer прерывал работу, когда он что-то ловит Я думал, что это было разработано, чтобы сделать это по умолчанию, но это, кажется, не работает для меня. Я тоже пробовал ASAN_OPTIONS=halt_on_error=1
который не имел никакого эффекта. Вот подробности:
В проекте, над которым я работаю, мы используем адресное дезинфицирующее средство, и оно выдает это предупреждение / ошибку неделями, пока никто не осознает этого:
ошибка времени выполнения: нулевой указатель передан как аргумент xx, который объявлен как никогда не равным нулю
Несмотря на то, что он вызывается во время выполнения, он не останавливает программу и не вызывает неправильный код завершения. Вот простая программа, чтобы продемонстрировать это:
/*
gcc -fsanitize=address,undefined \
-Wformat \
-Werror=format-security \
-Werror=array-bounds \
-g -o xasan xasan.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
fprintf(stderr, "before\n");
memcpy(NULL, argc > 1 ? "" : NULL, argc > 1 ? 1 : 0);
fprintf(stderr, "after\n");
return 0;
}
Трюк с argc заключается в том, что gcc не оптимизирует вызов memcpy, в основном в нашем коде он заканчивается memcpy(dst, NULL, 0)
что вызывает ошибку / предупреждение во время выполнения.
Я ожидал бы, что "после" не будет выводиться после ошибки времени выполнения, но это так, и код завершения программы равен 0. Это ошибка? В руководстве сказано, что это должно остановиться.
2 ответа
Ошибка оказывается из UBSAN, и ответом является использование переключателя компилятора -fno-sanitize-recover
как видно здесь.
Если вы не хотите перекомпилировать, вы также можете запустить с export UBSAN_OPTIONS=halt_on_error=1
,