뭔가를 잡았을 때 주소 소독 프로그램을 중단하고 싶습니다. 나는 그것이 기본적으로 그렇게하도록 설계되었다고 생각했지만 그것은 나를 위해 일하는 것 같지 않습니다. 나도 효과가 없었던 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이라고 예상 할 것입니다.이 버그입니까? 그 설명서는 그것이 멈추기로되어 있다고 말했습니다.