Appearance
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 代码的时候出现,这都是需要读者注意的地方。