C++ 最折磨人的 bug 不是崩溃,而是「时好时坏」。这类问题十有八九落在未定义行为的领地上。

两类经典现象

优化等级改变行为,多半是越界访问或违反严格别名规则;加了 printf 就正常,多半是数据竞争或未初始化变量。

定位工具

sanitizers,编译期插桩,能把越界、use-after-free 这类问题在发生的第一现场抓住,比肉眼看代码高效一个数量级。

预防

CI 里常开未定义行为检测器,把 UB 拦在合入之前。