Sanitizers的使用总结

2020/02/02 Tools C++ Library

Sanitizers是Google公开的一系列很好用的、开源的、C/C++的、和内存相关的检测工具。官方链接:https://github.com/google/sanitizers。

Sanitizers包含多个工具,其中常见的几个工具是:

  • AddressSanitizer:检测内存错误,例如释放已经释放的内存、再次access已经释放后的内存等;
  • LeakSanitizer:检测内存泄露,例如未释放的内存;
  • MemorySanitizer:检测未初始化的内存,例如stack或者heap等在写入之前就使用。

Sanitizers目前已经默认加到了GCC和LLVM中,因此无需额外安装。

使用Sanitizers

若要使用AddressSanitizer,添加-fsanitize=address这个Flag给编译器就行了:

clang/gcc/g++ -fsanitize=address ...

然后在运行可执行文件,之后就会显示内存出错的地方。不过,可执行程序要比普通的没有Sanitizers时候要慢一点。

若要使用LeakSanitizer,添加-fsanitize=leak给编译器。

如果在CMake中使用的话,在CMakeLists.txt中将-fsanitize=address添加给CMAKE_C_FLAGS或者CMAKE_CXX_FLAGS就行了。

在CMake中选择性决定是否使用Sanitizer

有时候我们想要选择性决定是否使用Sanitizer,因为当工程很大时,使用Sanitizers会大大增加编译和运行时间。两种解决方法:

  • 使用FindSanitizers.cmake文件。可以从这里下载:Sanitizers-cmake usage in Github。该链接同时给出了详细的在cmake中的使用方法,它定义了几个不同的Flags以便在几个Sanitizers之间切换。使用时,记得拷贝整个cmake_Modules文件夹中的全部Find文件。
  • 既然是只需要增加一个-fsanitize=XXX,那么其实也可以直接添加到CMake的命令行。可以参考:CMake学习笔记

参考

Search

    Table of Contents