LeakSanitizer(LSan)은 AddressSanitizer(ASan)에 통합된 메모리 누수를 검출하는 도구이다. 주로 C/C++ 프로그램의 메모리 누수를 탐지하는 데에 사용된다. 이 도구는 GCC와 Clang 컴파일러에서 지원되며, 메모리 할당 및 해제 시점에서 메모리 누수를 감지하여 개발자가 신속하게 해결할 수 있도록 도와준다. 이번 글에서는 LeakSanitizer의 사용법에 대해 알아본다.
LeakSanitizer는 ASan 빌드에서 기본적으로 활성화 되어 있으며, ASAN_OPTIONS=detect_leaks=1
옵션과 함께 활성화 될 수 있다.
AddressSanitizer로 LeakSanitizer 사용
예제 코드
#include <stdlib.h>
#include <stdio.h>
void *p;
void bar() {
void *p = malloc(7);
p = 0; // The memory is leaked here.
printf("p = %p\n", p);
}
void foo() {
bar();
}
int main() {
foo();
return 0;
}
AddressSanitizer를 사용하여 컴파일(-fsanitize=address
) 및 실행

LeakSanitizer 기능을 사용하지 않고 ASan을 사용하려면, ASAN_OPTIONS
환경 변수에 detect_leaks=0
로 설정하면 된다.
Stand-alone 모드 사용
AddressSanitizer 없이 LeakSanitizer만 사용하려면 -fsanitize=leak
옵션으로 컴파일 하면 된다. 이렇게 하면 LeakSanitizer가 작동하는데 필요한 요소만 포함되기 때문에 상대적으로 성능 문제에서 조금 더 자유롭게 사용할 수 있다.
성능 비교는 다음 글을 참고한다: LSan 성능 비교
Flags
flag | default | description |
exitcode | 23 | leak이 인지되었을 때 종료되는 exitcode를 지정 |
max_leaks | 0 | 0이 아니면, 지정한 만큼만 상위 항목을 리포트함 |
suppressions | (none) | suppression을 포함하는 파일 경로 |
print_suppressions | 1 | 1이면, suppression에 일치되는 통계치를 출력 |
report_objects | 0 | 1이면, LSan이 개별 leak 객체에 대해 리포트함 |
use_unaligned | 0 | 0이면, aligned 8-byte 패턴을 사용한다. 1이면, unaligned pattern을 포함한다 |
Suppressions
LeakSanitizer가 인지된 leak 중에 특정하여 무시하도록 지시 할 수 있는 내용을 포함하는 파일 경로를 지정한다. 파일에는 한 줄에 하나씩 suppression 규칙을 포함되어야 하며, 포멧은 leak:<pattern>
형식으로 지정하면 된다.
예제 소스:
#include <stdlib.h>
#include <stdio.h>
void FooBar() {
malloc(7);
}
void Baz() {
malloc(5);
}
int main() {
FooBar();
Baz();
return 0;
}
실행 결과:
