全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++ ASan怎么用 c++ AddressSanitizer内存检查【工具】

AddressSanitizer(ASan)是Clang/GCC提供的编译期插桩内存检测工具,可快速发现缓冲区溢出、use-after-free等错误,需编译链接均加-fsanitize=address、禁用高优化并加-g,运行时报错含详细堆栈与内存信息。

AddressSanitizer(ASan)是 Clang 和 GCC 提供的内存错误检测工具,能快速发现堆栈缓冲区溢出、use-after-free、double-free、内存泄漏(需额外开启)等常见问题。它不是运行时库,而是编译期插桩 + 运行时检测,开销约 2×,但远比 Valgrind 快。

编译时启用 ASan

关键是在编译和链接阶段都加上 -fsanitize=address,并建议禁用优化(或至少不用 -O2 及以上),否则可能漏报或误报:

  • Clang:clang++ -fsanitize=address -g -O1 main.cpp -o main
  • GCC(≥4.8):g++ -fsanitize=address -g -O1 main.cpp -o main
  • 务必加 -g,否则报错时看不到源码行号
  • 避免 -O2/-O3:优化可能把检测逻辑优化掉,或导致栈变量生命周期判断不准

运行时行为与典型报错

程序运行后一旦触发非法内存访问,ASan 会立即终止进程,并打印带堆栈、内存布局、访问地址、对象起源等信息的详细报告:

  • 例如越界写:ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000001c
  • 例如释放后使用:ERROR: AddressSanitizer: use-after-free on address 0x602000000030
  • 报告中会标出分配/释放位置(allocated by thread T0 here:)、访问位置、以及附近内存快照
  • 默认不检测内存泄漏;如需开启,运行时加环境变量:ASAN_OPTIONS=detect_leaks=1 ./main

常见配置与调试技巧

通过环境变量可微调 ASan 行为,适合不同场景:

  • ASAN_OPTIONS=abort_on_error=1:出错直接 abort,方便用 gdb 调试(gdb ./mainrun → 崩溃后 bt
  • ASAN_OPTIONS=disable_coredump=0:允许生成 core dump,便于事后分析
  • ASAN_OPTIONS=allocator_may_return_null=1:让 new 失败时返回 nullptr 而非抛异常(兼容旧代码)
  • 若项目含内联汇编或自定义内存管理(如对象池),可能触发误报,可用 __asan_poison_memory_region() / __asan_unpoison_memory_region() 手动标记

CMake 项目中集成 ASan

在 CMakeLists.txt 中添加条件编译支持,避免每次手动改命令:

  • 启用方式:cmake -DCMAKE_CXX_FLAGS="-fsanitize=address -g -O1" -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address" ..
  • 或在 CMakeLists.txt 内加:
    if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang|GNU")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g -O1")
      set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
    endif()
  • 注意:CMake 的 add_compile_options 不影响链接器标志,必须单独设 CMAKE_EXE_LINKER_FLAGS


# 工具  #   # ai  # c++  # 环境变量  # 常见问题  # overflow  # red  # Error  # double  #   # Thread  # 对象  # 行号  # 报错  # 是在  # 自定义  # 能把  # 而非  # 如需  # 远比  # 中会  # 事后 


相关文章: 详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何通过多用户协作模板快速搭建高效企业网站?  已有域名能否直接搭建网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何自定义建站之星网站的导航菜单样式?  如何快速登录WAP自助建站平台?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  c++ stringstream用法详解_c++字符串与数字转换利器  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  济南企业网站制作公司,济南社保单位网上缴费步骤?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何确保FTP站点访问权限与数据传输安全?  做企业网站制作流程,企业网站制作基本流程有哪些?  如何选择高效便捷的WAP商城建站系统?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  ,网页ppt怎么弄成自己的ppt?  如何在阿里云完成域名注册与建站?  如何快速搭建高效简练网站?  PHP 500报错的快速解决方法  linux top下的 minerd 木马清除方法  建站之星代理如何获取技术支持?  javascript基本数据类型及类型检测常用方法小结  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何零基础开发自助建站系统?完整教程解析  建站之星如何快速解决建站难题?  详解jQuery中基本的动画方法  北京制作网站的公司,北京铁路集团官方网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  名字制作网站免费,所有小说网站的名字?  如何配置WinSCP新建站点的密钥验证步骤?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  盘锦网站制作公司,盘锦大洼有多少5G网站?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  深圳网站制作培训,深圳哪些招聘网站比较好?  如何配置FTP站点权限与安全设置?  上海网站制作开发公司,上海买房比较好的网站有哪些?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何高效完成自助建站业务培训?  如何在七牛云存储上搭建网站并设置自定义域名?  如何零成本快速生成个人自助网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  MySQL查询结果复制到新表的方法(更新、插入)  淘宝制作网站有哪些,淘宝网官网主页?  如何在Windows 2008云服务器安全搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。