减少 C 语言中的未定义行为
LWN 记录了 Kernel Recipes 2026 会议上 Martin Uecker 的演讲:讨论 C 语言中的未定义行为(UB)以及 C 是否有可能成为内存安全语言。 文章梳理了 C89 抽象机器模型、UB 给编译器优化带来的自由度(包括著名的 nasal demons),并给出多个编译器实际出错或产生争议的例子(结构体 padding、除法零优化、volatile hoisting、时间旅行 bug)。 C23 已加入“no time travel”规则,C2y 草案已移除约 45 处 UB。Uecker 将内存安全拆解为类型安全、空间安全性和时间安全性,分别讨论 tagless union、数组边界检查(counted_by)、use-after-free 检测(Fil-C、CHERI 等)。 结论:完全内存安全在近期需依赖受限子语言加形式化验证,但 C 语言仍在持续改进,C23/C2y 移除多项遗留特性并新增位精确整数类型、受检整数运算等。