欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
全部教程·
Rust语言·
Rust高级编程
[目录]
·
变形
Rust 高级编程
Rust 非安全程序设计
Rust 安全代码
安全与非安全代码对比 安全与非安全代码交互 非安全Rust能做什么 编写非安全代码数据布局
repr(Rust) 类型中的奇行种 可选的数据表达方式所有权
所有权 引用 别名 生命周期 生命周期的局限 省略生命周期 无界生命周期 高阶trait边界 子类型和变性 Drop检查 幽灵数据 分解借用类型转换
类型转换 强制类型转换 点操作符 显式类型转换 变形未初始化内存
未初始化内存 安全方式 Drop标志 非安全方式资源管理
基于所有权的资源管理 构造函数 析构函数 泄露展开
展开 异常安全性 污染并发
并发 竞争 Send和Sync 原子操作实现 Vec
实现 Vec 布局 内存分配 push和pop 回收资源 DeRef 插入和删除 IntoIter RawVec Drain 处理零尺寸类型 最终代码FFI
FFI
Rust 高级编程
Rust 非安全程序设计
Rust 安全代码
安全与非安全代码对比 安全与非安全代码交互 非安全Rust能做什么 编写非安全代码数据布局
repr(Rust) 类型中的奇行种 可选的数据表达方式所有权
所有权 引用 别名 生命周期 生命周期的局限 省略生命周期 无界生命周期 高阶trait边界 子类型和变性 Drop检查 幽灵数据 分解借用类型转换
类型转换 强制类型转换 点操作符 显式类型转换 变形未初始化内存
未初始化内存 安全方式 Drop标志 非安全方式资源管理
基于所有权的资源管理 构造函数 析构函数 泄露展开
展开 异常安全性 污染并发
并发 竞争 Send和Sync 原子操作实现 Vec
实现 Vec 布局 内存分配 push和pop 回收资源 DeRef 插入和删除 IntoIter RawVec Drain 处理零尺寸类型 最终代码FFI
FFIRust 变形
类型系统你给我滚开!我要自己解析这些字节,不成功便成仁!虽然本书都是关于非安全的内容,我还是希望你能仔细考虑避免使用本章讲到的内容。这是你在Rust中所能做到的真真正正、彻彻底底、最最可怕的非安全行为。所有的保护机制都形同虚设。
mem::transmute<T, U>接受一个T类型的值,然后将它重新解析为类型U。唯一的限制是T和U必须有同样的大小。可能产生未定义行为的情况让人看着头疼。
- 最重要的,创建任一类型的处于不合法状态的示例,都将产生不可预知的混乱
- transmute有一个重载的返回类型。如果没有明确指定返回类型,它会返回一个满足类型推断的奇怪类型
- 使用不合法的值构建基本类型是未定义行为
- 非repr(C)的类型之间相互变形是未定义行为
&变形为&mut是未定义行为&变形为&mut永远都是未定义行为- 不要多想,你绝对不能这么做
- 不要多想,你没有什么特殊的
- 变形为一个未指定生命周期的引用会产生无界生命周期
mem::transmute_copy<T, U>很神奇地比这更加不安全。它从&T拷贝size_of<U>个字节并将它们解析为U。mem::transmute仅有的类型大小的检查都不见了(因为拷贝类型前缀有可能是合法的),只不过U的尺寸比T大会被视为一个未定义行为。
当然,本章大部分的功能都可以通过指针的显式转换实现。
下一章:Rust 未初始化内存
未初始化内存:所有运行期分配的内存开始时都是"未初始化"状态。这种状态下内存的值是一组不确定的字节,甚至有可能不是使用这块内存的类型的合法值。将这段内存的值解析为任何类型都是未定义行为。千万不要这么做。Rust提供了处理未初始化内存的方式, ...
AI 中文社