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,

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