Google AddressSanitizer简介

AddressSanitizer (ASan) 是 C 和 C++ 的内存错误检测软件,它可以检测:

  • 释放指针后继续使用
  • 堆缓冲区溢出
  • 栈缓冲区溢出
  • 全局缓冲区溢出
  • 返回后继续使用
  • 在范围之外继续使用
  • 初始化顺序的bug
  • 内存泄漏

在 Windows 系统中,可以在 LLVM 和 MSVC 中进行使用。

Visual Studio 2019的配置

先上两个链接:

https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-windows-with-msvc/

https://devblogs.microsoft.com/cppblog/asan-for-windows-x64-and-debug-build-support/#16-9-preview-3-and-later

根据这两个链接进行安装配置应该问题不大,Visual Studio 16.9 Preview 3及其以后的版本不需要额外手动配置链接库,建议安装这个版本之后的软件,能省点事情,这样就只需要配置一下项目的属性即可,下面是简单的配置及测试结果。

在Windows系统中配置Google AddressSanitizer-LMLPHP

在Windows系统中配置Google AddressSanitizer-LMLPHP

CLion中的配置

先放个CLion的官方教程链接

配置ToolChains

CLion 中的配置稍微复杂一点,首先配置CLion的工具链,添加一个新的 Visual Studio的配置,正常情况下添加配置的时候会自动识别,但是我的社区版VS2019在CLion 2020.3这个版本下是无法自动识别的。我尝试过手动指定环境也没有识别,几经折腾后我放弃了,转头就安装了个企业版😂。这下还是无法自动识别,但是手动指定环境后就识别了,Architecture根据需要设定即可,Platform建议默认,Version根据需要设定即可,编译器直接使用自动检测的配置即可,如果安装了 Clang的编译器也可以手动指定为Clang的编译器,不过在后面配置CMakeLists.txt的时候需要更改链接库的路径为Clang对应的目录。

在Windows系统中配置Google AddressSanitizer-LMLPHP

配置CMake选项

在Windows系统中配置Google AddressSanitizer-LMLPHP

编写CMakeLists.txt

这个CMakeLists.txt文件会遍历所在目录下的所有 .cpp 源文件,每个源文件创建一个单独的可执行项目

cmake_minimum_required(VERSION 3.17)
project(LeetCode VERSION 1.0.0 LANGUAGES CXX)

# Retrieve all cpp file in the current cmake source directory
file(GLOB SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)

# debug message
function(debug_message MESSAGE)
    message("==============================")
    message(${MESSAGE})
    message("==============================")
endfunction()

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(BuildType "dbg_")
endif ()

# add all to executable target
foreach (SRC IN LISTS SOURCES)
    string(REGEX REPLACE "(^.+)\\.(.+$)" \\1 TMP_SRC ${SRC})
    string(REPLACE " " "_" TARGET_NAME ${TMP_SRC})
    add_executable(${TARGET_NAME} ${SRC})
    target_include_directories(${TARGET_NAME} PRIVATE include)
    if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
        target_compile_options(${TARGET_NAME} PRIVATE -fsanitize=address)
        # set link directories
        target_link_directories(${TARGET_NAME} PRIVATE
                "D:/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.28.29333/lib/x64/")
        target_link_libraries(${TARGET_NAME} PRIVATE
                clang_rt.asan_${BuildType}dynamic-x86_64
                clang_rt.asan_${BuildType}dynamic_runtime_thunk-x86_64)
        target_link_options(${TARGET_NAME} PRIVATE
                /wholearchive:clang_rt.asan_${BuildType}dynamic_runtime_thunk-x86_64.lib)
    endif ()
endforeach ()

测试

运行的时候可能会失败,把缺失的动态库拷贝到可执行文件目录下即可,不想拷贝就在环境变量里面添加与Visual Studio工具链匹配的路径也可。例如,我上面工具链设置的是amd64,CLion自动检测到的编译器是“D:\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64\cl.exe”,这时候把“D:\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64\”这个路径添加到环境变量中重启CLion即可正常运行。

在Windows系统中配置Google AddressSanitizer-LMLPHP

本文博客地址

03-04 11:48