Sanitizer 기본 사용법

Sanitizer에는 AddressSanitizer, MemorySanitizer, UBSanitizer 등이 있습니다.

CFLAGS += -fsanitize=address

CFLAGS 변수에 -fsanitize=address만 추가해도 AddressSanitizer를 사용할 수 있습니다.

문제점

  1. Sanitizer를 사용하면 느려집니다. 필요할 때만 사용해야 합니다.
  2. AddressSanitizerMemorySanitizer를 동시에 사용할 수 없습니다.
  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)

make SANITIZER=address로 빌드하면 AddressSanitizer를 사용하게 되고,

Sanitizer를 바꾸더라도 이미 빌드한 것을 삭제하지 않아 빠르게 다시 빌드할 수 있습니다.

응용

같은 방법으로 .so(.dylib)로 빌드하기 위한 -fPIC 플래그에 따라서,

또는 dev/prod, debug/release 등 설정에 따라서 목적 파일의 이름을 바꾸면

빌드 환경을 간단하게 구성할 수 있습니다.