관련 글 보기
Sanitizer 기본 사용법
Sanitizer에는 AddressSanitizer, MemorySanitizer, UBSanitizer 등이 있습니다.
CFLAGS += -fsanitize=address
Makefile
복사
기본적인 AddressSanitizer 사용 예시?
CFLAGS 변수에 -fsanitize=address만 추가해도 AddressSanitizer를 사용할 수 있습니다.
문제점
1.
Sanitizer를 사용하면 느려집니다. 필요할 때만 사용해야 합니다.
2.
AddressSanitizer와 MemorySanitizer를 동시에 사용할 수 없습니다.
3.
Sanitizer 없이 컴파일을 했더라도, Sanitizer를 사용하려면 다시 컴파일해야 합니다.
1번, 2번으로 인해 -fsanitizer 플래그를 자주 바꾸게 되고,
3번으로 인해 -fsanitizer 플래그를 바꿀 때마다 make re로 다시 빌드해야 합니다.
해결 방안
Sanitizer를 사용할 때 목적 파일의 이름을 바꿀 수 있습니다.
SUFFIX := $(if $(SANITIZER),.$(SANITIZER))
%$(SUFFIX).o: %.c
$(CC) $(CFLAGS) -c $< -o $@ -MMD $(if $(SANITIZER),-fsanitize=$(SANITIZER),)
output$(SUFFIX).a: $(SRCS:.c=$(SUFFIX).o)
$(NAME): output$(SUFFIX).a
cp $< $@
.PHONY: $(NAME)
Makefile
복사
sanitizer를 사용할 경우 목적 파일의 이름을 바꿔서 사용하는 예시
make SANITIZER=address로 빌드하면 AddressSanitizer를 사용하게 되고,
Sanitizer를 바꾸더라도 이미 빌드한 것을 삭제하지 않아 빠르게 다시 빌드할 수 있습니다.
응용
같은 방법으로 .so(.dylib)로 빌드하기 위한 -fPIC 플래그에 따라서,
또는 dev/prod, debug/release 등 설정에 따라서 목적 파일의 이름을 바꾸면
빌드 환경을 간단하게 구성할 수 있습니다.