2016-11-17 7 views
0

Я бы хотел, чтобы дезинфицирующее средство было отменено, когда оно что-то ловит. Я думал, что это было сделано для этого по умолчанию, но, похоже, это не работает для меня. Я также пробовал ASAN_OPTIONS=halt_on_error=1, который не имел никакого эффекта. Вот подробности:gcc ASAN не останавливается на предполагаемой ошибке времени выполнения

В проекте я работаю, мы используем адрес дезинфицирующее и источали это предупреждение/ошибка в течение нескольких недель никто не осознавая этого:

runtime error: null pointer passed as argument xx, which is declared to never be null

Несмотря на то, называется ошибка выполнения этого не остановить программу или вызвать плохой код выхода. Вот простая программа для демонстрации его:

/* 
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 трюк просто так ССАГПЗ не оптимизирует из вызова тетсра, в основном в нашем коде заканчивается как memcpy(dst, NULL, 0), который вызывает ошибку во время выполнения/предупреждения.

Я бы ожидал, что «after» не будет выводиться после ошибки времени выполнения, но это так, и код выхода программы равен 0. Является ли это ошибкой? В руководстве говорится, что он должен остановиться.

ответ

0

Ошибка, полученная от UBSAN, и ответ заключается в использовании переключателя компилятора -fno-sanitize-recover, как видно here.

1

Если вы не хотите перекомпилировать, вы также можете запустить UBSAN_OPTIONS = halt_on_error = 1.