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学习笔记。
参考
- Official Github link:其wiki页面中是使用说明。
- Sanitizers-cmake usage in Github:Sanitizers在CMake中的使用。