Skip to content

19.6 未定义行为

在 C/C++等语言中,未定义行为(undefined behavior,简称 UB)指的是,在某些情况下语言标准允许编译器做任何事情,无论发生什么后果都是正常的,不属于编译器的 bug。比如,对空指针做“解引用”操作,在 C/C++里面就是未定义行为,编译器可以决定做任何事情。

在 C/C++标准里面,很多情况下,都有充分的理由将某些行为定义为 UB,这是语言本身的定位决定的。它可以简化编译器的设计,也可以最大化执行效率,还可以最大化跨平台,等等。但是我们也应该承认,过多的 UB 是对用户极其不友好的。在 Rust 里面,UB 被限制在了一个较小的范围内,只有 unsafe 代码有可能制造出 UB,这也是在写 unsafe 代码的时候需要注意的。

下面列举一些 undefined behavior,摘抄自 Rust 的 Reference 文档:

  • 数据竞争

  • 解引用空指针或者悬空指针

  • 使用未对齐的指针读写内存而不是使用 read_unaligned 或者 write_unaligned

  • 读取未初始化内存

  • 破坏了指针别名规则

  • 通过共享引用修改变量(除非数据是被 UnsafeCell 包裹的)

  • 调用编译器内置函数制造 UB

  • 给内置类型赋予非法值

  • 给引用或者 Box 赋值为空或者悬空指针

  • 给 bool 类型赋值为 0 和 1 之外的数字

  • 给 enum 类型赋予类型定义之外的 tag 标记

  • 给 char 类型赋予超过 char::MAX 的值

  • 给 str 类型赋予非 utf-8 编码的值

以上只是一些典型的问题,完整列表请大家参考官方文档。这些问题只可能在写 unsafe 代码的时候出现,这都是需要读者注意的地方。

Released under the MIT License