clang之LeakSanitizer

4,245 阅读1分钟

Clang 12 documentation

Clang 12 documentation包含了一系列工具,如 AddressSanitizerThreadSanitizerLeakSanitizerLibTooling等。

  1. clang之AddressSanitizer
  2. clang之MemorySanitizer
  3. clang之LeakSanitizer
  4. clang之UndefinedBehaviorSanitizer
  5. clang之Hardware-assisted-AddressSanitizer
  6. clang之SafeStack
  7. clang之ShadowCallStack
  8. clang之ThreadSanitizer
  9. clang之Thread-Safety-Analysis
  10. 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 运行时库链接到最终的可执行文件中。

更多信息