Clang 12 documentation
Clang 12 documentation包含了一系列工具,如 AddressSanitizer、ThreadSanitizer、LeakSanitizer、LibTooling等。
- clang之AddressSanitizer
- clang之MemorySanitizer
- clang之LeakSanitizer
- clang之UndefinedBehaviorSanitizer
- clang之Hardware-assisted-AddressSanitizer
- clang之SafeStack
- clang之ShadowCallStack
- clang之ThreadSanitizer
- clang之Thread-Safety-Analysis
- clang之DataFlowSanitizer
这部分是对clang文档 Clang 12 documentation LeakSanitizer 的翻译。仅供参考。
介绍
LeakSanitizer 是一个运行时期的内存泄漏检测器。可以跟 AddressSanitizer 结合起来,用于检测内存错误及内存泄漏,也可以单独使用。LSan 几乎不会带来性能上的影响,直到程序终止。即一旦检测到内存问题,程序即会终止,这一点与 ASan 一致。
用法
LeakSanitizer 在x86_64的Linux和macOS上都可以使用。使用 AddressSanitizer 来编译程序即可。
$ cat memory-leak.c
#include <stdlib.h>
void *p;
int main() {
p = malloc(7);
p = 0; // The memory is leaked here.
return 0;
}
% clang -fsanitize=address -g memory-leak.c ; ASAN_OPTIONS=detect_leaks=1 ./a.out
==23646==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x4af01b in __interceptor_malloc /projects/compiler-rt/lib/asan/asan_malloc_linux.cc:52:3
#1 0x4da26a in main memory-leak.c:4:7
#2 0x7f076fd9cec4 in __libc_start_main libc-start.c:287
SUMMARY: AddressSanitizer: 7 byte(s) leaked in 1 allocation(s).
如果需要单独使用 LeakSanitizer,使用标记 -fsanitize=leak 来链接程序。确保在链接阶段使用clang(而非ld),这样就能将正确的 LeakSanitizer 运行时库链接到最终的可执行文件中。