2016-11-17 10 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 트릭은 GCC는 기본적으로 우리의 코드는 런타임 오류/경고가 발생 memcpy(dst, NULL, 0)로 끝는 방어 적이기 호출을 최적화하지 않습니다 단지 있도록합니다.

나는 'after'가 런타임 오류 후 출력되지 않지만 프로그램 종료 코드는 0이라고 예상 할 것입니다.이 버그입니까? 그 설명서는 그것이 멈추기로되어 있다고 말했습니다.

답변

0

오류는 UBSAN에서 나온 것이고 대답은 컴파일러 스위치 -fno-sanitize-recoverhere처럼 사용하는 것입니다.

1

다시 컴파일하지 않으려면 UBSAN_OPTIONS = halt_on_error = 1로 실행할 수도 있습니다.