C++ 最折磨人的 bug 不是崩溃,而是「时好时坏」。这类问题十有八九落在未定义行为的领地上。
两类经典现象
优化等级改变行为,多半是越界访问或违反严格别名规则;加了 printf 就正常,多半是数据竞争或未初始化变量。
定位工具
sanitizers,编译期插桩,能把越界、use-after-free 这类问题在发生的第一现场抓住,比肉眼看代码高效一个数量级。
预防
CI 里常开未定义行为检测器,把 UB 拦在合入之前。
release 能跑 debug 崩溃、加了打印就好了——两类经典 UB 现象的定位方法。
C++ 最折磨人的 bug 不是崩溃,而是「时好时坏」。这类问题十有八九落在未定义行为的领地上。
优化等级改变行为,多半是越界访问或违反严格别名规则;加了 printf 就正常,多半是数据竞争或未初始化变量。
sanitizers,编译期插桩,能把越界、use-after-free 这类问题在发生的第一现场抓住,比肉眼看代码高效一个数量级。
CI 里常开未定义行为检测器,把 UB 拦在合入之前。