1. 添加cmake参数:
asan_test.cpp
#include <iostream>
#include <vector>
#include <memory>
#include <chrono>
#include <thread>
// 注意,asan检测的东西必须出作用域才能检测到,如果不出作用域,则检测不到,且不会打印日志
void f() {
std::vector<int> vi{1,2,3,4,5,6};
for(auto i : vi) {
std::cout << i << ' ';
}
std::cout << std::endl;
int *a = new int(4);
std::shared_ptr<int> sp(a);
delete a;
std::this_thread::sleep_for(std::chrono::seconds(20));
std::cout << "out\n";
}
int main() {
f();
std::this_thread::sleep_for(std::chrono::seconds(20));
return 0;
}
添加CMakeLists.txt
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
cmake_minimum_required(VERSION 3.22)
project(asan_test)
aux_source_directory(. CPP_FILES)
# 添加编译参数,打开asan编译开关
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=leak -fsanitize-recover=all -fno-omit-frame-pointer -g")
add_executable(zhjs ${CPP_FILES})
# 找到asan库文件并进行链接
find_library(LIB_ASAN NAME libasan.so PATHS /lib/gcc/x86_64-linux-gnu/11/)
message(STATUS "### ${LIB_ASAN} ###")
target_link_libraries(zhjs ${LIB_ASAN})
2. 添加运行时环境变量
注意运行时拷贝对应的libasan.so库,然后运行时需要添加对应的环境变量:
#! /bin/bash
export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1:malloc_context_size=15:log_path=./asan.log:detect_stack_use_after_return=1
./zhjs