新闻中心

c++如何使用 sanitizers 发现未定义行为_c++ UBSan使用教程【调试】

2025-12-13
浏览次数:
返回列表
UBSan检测C++未定义行为需编译时加-fsanitize=undefined,运行时直接报错定位;推荐clang++ -fsanitize=undefined -O2 -g -fno-omit-frame-pointer,配合UBSAN_OPTIONS可全量报告,适用于CI和本地开发但不可用于发布。

c++如何使用 sanitizers 发现未定义行为_c++ ubsan使用教程【调试】

用 UBSan(UndefinedBeh*iorSanitizer)检测 C++ 中的未定义行为,核心就两点:编译时加 -fsanitize=undefined,运行时观察报错信息。它比静态分析更准,比 Valgrind 更轻量,专治数组越界、整数溢出、空指针解引用、未初始化读取等常见“玄学崩溃”。

编译时启用 UBSan

在 g++ 或 clang++ 编译命令中加入 sanitizer 选项即可:

  • 基础启用:g++ -fsanitize=undefined -O1 -g main.cpp -o main
  • 推荐组合(兼顾性能与检测精度):clang++ -fsanitize=undefined -O2 -g -fno-omit-frame-pointer main.cpp -o main
  • 若想捕获更多类型(如返回未初始化值、不完整类型转换),可扩展:-fsanitize=undefined,return,unreachable,vptr
  • 注意:UBSan 不兼容 -O3 下的部分优化(如循环展开可能掩盖问题),-O2 是较稳妥选择

运行时快速定位问题

程序触发未定义行为时,UBSan 会直接打印带源码位置的错误,例如:

main.cpp:12:15: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int'

Figma Figma

Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

Figma 1371 查看详情 Figma
  • 错误信息含文件名、行号、列号和具体原因,无需额外调试器就能快速跳转修复
  • 默认只报第一次错误;如需报告所有(适合批量排查),加环境变量:UBSAN_OPTIONS=halt_on_error=0:print_stacktrace=1 ./main
  • print_stacktrace=1 可显示调用栈,对函数内联或模板代码尤其有用

常见误报与规避技巧

UBSan 对某些合法但“危险”的写法也会警告(尤其涉及底层操作),不必盲目修复,但要理解是否真有问题:

  • 有符号整数溢出:C++ 标准确实未定义,但若逻辑上允许(如哈希计算),可用 std::numeric_limits<int>::max()</int> 检查,或改用 unsigned int
  • 未初始化局部变量读取:UBSan 默认检测,但可能误报(如 union 成员切换使用)。可加 -fsanitize=undefined -fno-sanitize=undefined 局部禁用,或用 __attribute__((no_sanitize("undefined"))) 标记函数
  • 虚函数表(vptr)相关警告:多出现在对象构造/析构期间调用虚函数,属标准未定义行为,应重构避免

集成进日常开发流程

别只在出 bug 时才想起来用——把它变成 CI 或本地构建的一部分:

  • CMake 中开启:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -g -O2"),配合 add_compile_options(-fno-omit-frame-pointer)
  • CI 脚本里跑 UBSan 版本的单元测试,失败即阻断合并
  • 本地开发时,用一个 alias 快速切换:alias ubbuild='clang++ -fsanitize=undefined -O2 -g -fno-omit-frame-pointer'
  • 注意:UBSan 生成的二进制不能发布(体积大、性能降约 2–3 倍),仅用于调试和测试

基本上就这些。UBSan 不复杂但容易忽略,一旦养成习惯,很多“偶发崩溃”、“结果不一致”类问题会在编码阶段就被拦住。

以上就是c++++如何使用 sanitizers 发现未定义行为_c++ UBSan使用教程【调试】的详细内容,更多请关注其它相关文章!


# 适用于  # 濮阳seo优化运营公司  # 阆中网络推广营销招聘网  # 都匀水产业网站推广  # 北滘seo优化案例  # 益阳粮食网站建设公司  # 国外网站宣传推广服务  # 新房营销推广费多少钱啊  # 祁县项目营销推广报告书  # 晋江网站建设文章怎么写  # 花溪区怎样网络推广营销  # 把它  # 会在  # c++  # 就能  # 也会  # 头文件  # 报错  # 行号  # 重构  # 如何使用  # overflow  # 环境变量  # ai  #   # 编码 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 12306怎么选座位选到安静区_12306选座安静区域选择策略  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  铃兰之剑为这和平的世界希里技能组及加点推荐  Node.js中HTML按钮与J*aScript函数交互的正确姿势  Python大型XML文件高效流式解析教程  4399免费游戏网址入口 4399小游戏免费入口点开即玩  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  qq游戏网页版直接玩_qq游戏免下载快速入口  J*a递归快速排序中静态变量的状态管理与陷阱  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  快速CSGO开箱网站指南 CSGO开箱平台推荐  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  iCloud登录入口网页版 苹果iCloud官网登录  如何在CSS中使用浮动制作导航栏_float实现水平菜单  黑猫投诉统一入口官网 消费者权益保护投诉平台  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  J*a递归快速排序中静态变量导致数据累积问题的解决方案  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  快手赚钱渠道_快手收益来源  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Python getattr() 异常处理深度解析:避免程序意外退出  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  押井守高度称赞《辐射4》:玩了八年都停不下来!  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  如何使用纯J*aScript判断Input元素是否在特定类容器内  Lar*el递归关系中排除子孙节点的策略  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  Go语言HTML解析:利用Goquery精准获取指定元素内容  J*a应用集成GitHub CLI与API认证指南  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  痛风发作了怎么办? 快速止痛和后期饮食调理  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  铁路12306的积分有效期是多久_铁路12306积分有效期说明 

搜索