CLion 如何配置 Sanitizer 地址消毒器检测内存越界

文章导读
在 CLion 中配置 Sanitizer 地址消毒器检测内存越界,主要通过修改 CMake 配置或运行配置实现。用户需确保使用 Clang 编译器(版本≥8.0),并在 Run > Edit Configurations 的 CMake options 中添加 -DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer" 和 -DC
📋 目录
  1. A sanitizers 与 IDE 集成:CLion/VS Code 环境下的实时内存安全检测
  2. B 一些 Clion 使用记录
  3. C 如何让 C++ 内存 bug 无处遁形?,AddressSanitizer 集成与最佳实践详解
  4. D 部署 AddressSanitizer(ASan) 定位内存泄漏、内存越界
  5. E FAQ
A A

在 CLion 中配置 Sanitizer 地址消毒器检测内存越界,主要通过修改 CMake 配置或运行配置实现。用户需确保使用 Clang 编译器(版本≥8.0),并在 Run > Edit Configurations 的 CMake options 中添加 -DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer" 和 -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address"。此外,也可以直接在 CMakeLists.txt 文件中增加设置,参考官方 Clion 手册 Google sanitizers 或者 Clang 配置。启用后,程序运行时若存在内存错误将输出详细报告,包括堆栈回溯和非法访问位置,帮助开发者快速定位越界、释放后使用等问题。

sanitizers 与 IDE 集成:CLion/VS Code 环境下的实时内存安全检测

CLion 集成方案 编译器配置 打开 File > Settings > Build, Execution, Deployment > Toolchains 添加 Clang 编译器,确保版本≥8.0 在 CMake 配置中设置 CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 为 clang/clang++ Sanitizers 编译选项配置 进入 Run > Edit Configurations 选择目标配置,在 CMake options 中添加:-DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer" -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address"(消息于 2025 年 10 月 15 日发布)

一些 Clion 使用记录

访问越界溢出 debug AddressSanitizer 介绍:AddressSanitizer 交的 lab 在本地运行没问题,助教测试没通过,询问原因——访存越界如下:但是本地 Clion 运行又没有报错,于是借助了 clion 里面打开 address sanitizer 检查 bug。但是自己折腾了挺久都没在 windows 环境中解决使用 address sanitizer 的一个报错问题,如下信息提示缺少一个 lasan 库 shell FAILED: XXXXX.execmd.exe /C "cd . && "D:\Program Files\JetBrains\CLion 2022.1\bin\mingw\bin\g++.exe" -fsanitize=address -g -g CMakeFiles/SEP_lab6.dir/boggle2.cpp.obj CMakeFiles/SEP_lab6.dir/lexicon.cpp.obj -o SEP_lab6.exe -Wl,--out-implib,libSEP_lab6.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."D:\Program Files\JetBrains\CLion 2022.1\bin\mingw\bin/ld.exe: cannot find -lasancollect2.exe: error: ld returned 1 exit statusninja: build stopped: subcommand failed. 网上很多教程都是在 linux 环境使用 clion 结合 sanitizer,于是自己在虚拟机中使用 clion,找到了当时的 bug。出于好奇和偷懒,想在 windows 的环境使用 clion,连接本地 wsl 使用 sanitizer 来 debug. 具体过程:在工具链中增加"WSL",见上图 在设置 Cmake 中增加一项使用 wsl 的配置文件 在 CMakeList.txt 文件中增加,设置参考官方 Clion 手册 Google sanitizers 或者 Clang 配置 cmake set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -fsanitize=address -g")(截至 2022 年 11 月 2 日)

如何让 C++ 内存 bug 无处遁形?,AddressSanitizer 集成与最佳实践详解

第一章:AddressSanitizer 简介与核心原理 AddressSanitizer(简称 ASan) 是 Google 开发的一款开源内存错误检测工具,集成于 GCC 和 Clang 编译器中,用于检测 C/C++ 程序中的内存越界访问、使用已释放内存、栈溢出等常见内存错误。它通过在编译时插桩代码,并在运行时监控内存操作,能够高效地捕获潜在的内存缺陷。工作原理 ASan 采用基于影子内存 (Shadow Memory) 的技术,为程序的每一字节实际内存分配对应的影子内存位,用于标记该内存区域的状态 (如是否可访问)。当程序执行内存读写操作时,ASan 插入的检查代码会查询影子内存状态,若发现非法访问则立即报告错误。编译时插桩:在源码编译阶段,ASan 自动在关键内存操作前后插入检查逻辑 影子内存映射:每 8 字节真实内存由 1 字节影子内存管理,记录其访问权限状态 实时检测:运行时对每次内存访问进行验证,发现异常即终止程序并输出错误栈 典型使用方式 在 Clang 或 GCC 中启用 ASan 只需添加编译选项:# 编译时启用 AddressSanitizer clang -fsanitize=address -g -O1 -fno-omit-frame-pointer example.c -o example # 运行程序,若存在内存错误将输出详细报告 ./example 一键获取完整项目代码 上述命令中,-fsanitize=address 启用 ASan,-g 添加调试信息以便定位错误位置,-fno-omit-frame-pointer 保留帧指针以生成完整调用栈。支持检测的错误类型

错误类型说明
堆缓冲区溢出访问 malloc 分配内存之外的区域
栈缓冲区溢出数组或局部变量越界访问
使用释放后的内存指向已 free 内存的悬垂指针访问
双重释放对同一指针调用多次 free
graph TD A[源代码] --> B[编译时插桩] B --> C[插入内存检查代码] C --> D[运行时监控] D --> E{是否发生非法访问?} E -->|是 | F[输出错误报告并终止] E -->|否 | G[正常执行](2025 年 11 月 10 日)

CLion 如何配置 Sanitizer 地址消毒器检测内存越界

部署 AddressSanitizer(ASan) 定位内存泄漏、内存越界

ASan(AddressSanitizer,地址消毒器) 是一个内存错误检测工具,主要用于帮程序员:检测内存越界访问 (比如访问数组边界外的数据) 检测使用已释放的内存 (Use-after-free) 检测堆、栈、全局变量的内存错误 发现内存泄漏 (部分版本支持) 它是编译器提供的一种运行时检测机制,通过插桩程序,在程序运行时监控内存访问行为,及时发现和定位内存安全问题,帮助开发者快速修复难以排查的 bug。但是 NDK r21e 不支持内存泄漏检查:(base) wyl9738@arc-PowerEdge-R740xd:/data/standard_sdk/toolchains/NDK21E/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/9.0.9/lib/linux$ strings ./libclang_rt.asan-aarch64-android.so | grep detect_leaks detect_leaks %s: detect_leaks is not supported on this platform. Invoke leak checking in an atexit handler. Has no effect if detect_leaks=false, or if __lsan_do_leak_check() is called before the handler has a chance to run. ✅升级方案建议 下载 NDK r25c。修改你的 CMake 工程,改成使用新的 toolchain(路径替换原来的 r21e)。确保编译命令中保留:部署 AddressSanitizer(ASan) 流程 (以 Android 平台为例) 1、部署 Asan cmake 文件中添加:project(***) set(CMAKE_CXX_STANDARD 11) # 原本的 warning 设置也要保留原有值 set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -g -std=c++11 -Wpedantic -Wextra -Wshadow -Wundef -Wmaybe-uninitialized\ -Wno-unused-parameter -Wno-missing-field-initializers -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default\ -Wreturn-type -Wmultichar -Wformat -Wformat-security -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wstack-usage=2048\ -Wtype-limits -Wsizeof-pointer-memaccess -Wpointer-arith -Werror=return-type") set(CMAKE_SYSROOT"/data/standard_sdk/toolchains/NDK21E/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot") set(CMAKE_EXE_LINKER_FLAGS"𝐶𝑀𝐴𝐾𝐸𝐸𝑋𝐸𝐿𝐼𝑁𝐾𝐸𝑅𝐹𝐿𝐴𝐺𝑆−𝑊𝑙,−𝑟𝑝𝑎𝑡ℎ−𝑙𝑖𝑛𝑘=CMAKEEXELINKERFLAGS−Wl,−rpath−link={CMAKE_SYSROOT}/usr/lib/aarch64-linux-android/29") # 启用 AddressSanitizer 添加 ASan 相关 flags(必须放在最后)(2025 年 8 月 7 日的资料)

FAQ

Windows 下 CLion 使用 ASan 报错找不到 lasan 库怎么办?

建议连接 WSL 使用 sanitizer 来 debug,或在工具链中增加"WSL",在设置 Cmake 中增加一项使用 wsl 的配置文件。

启用 ASan 需要哪些关键编译参数?

CLion 如何配置 Sanitizer 地址消毒器检测内存越界

需要添加-fsanitize=address -fno-omit-frame-pointer -g,其中-fsanitize=address 启用 ASan,-g 添加调试信息,-fno-omit-frame-pointer 保留帧指针。

ASan 对性能有多大影响?

ASan 仅引入约 70% 内存开销和 2 倍 CPU 开销,使其成为开发与测试阶段的理想选择,相比 Valgrind 的 10–50x 开销更小。