c/c++:CMakeLists.txt中添加编译/连接选项使用内存错误检测工具Address Sanitizer(ASan)
Address Sanitizer(ASan)是一个快速的内存错误检测工具。从gcc 4.8开始,AddressSanitizer成为gcc的一部分。
既然是gcc内置的内存检查工具,用起来比第三方的库更方便些。只要指定相应的编译链接参数就可以实现内存泄露检查了,如下是是cmake脚本中增加Address Sanitizer选项的示例:
# 使用sanitize进行内存泄露检查
# 编译选项
target_compile_options(${target} PRIVATE
$<$<AND:$<CXX_COMPILER_ID:GNU>,$<PLATFORM_ID:Linux>>:-fsanitize=address>
)
# 连接选项
target_link_options(${target} PUBLIC $<$<AND:$<CXX_COMPILER_ID:GNU>,$<PLATFORM_ID:Linux>>:-fsanitize=address -static-libasan>)
上述示例中:
代码的含义是使用cmake generator-expression(生成器表达式)指定只在编译器为gcc,且操作系统为Linux时增加编译选项 -fsanitize=address
同理,也是在编译器为gcc,且操作系统为Linux时增加链接选项 -fsanitize=address -static-libasan
因为gcc下才内置AddressSanitizer,而且Mingw并不是默认支持AddressSanitizer(目前需要额外安装)。
-static-libasan
是静态链接asan库
参考资料
《libasan使用和遇到的问题》