2 个版本
0.0.2 | 2023 年 4 月 10 日 |
---|---|
0.0.1 | 2023 年 4 月 10 日 |
#288 in FFI
31KB
576 行
在 FFI 安全类型和 Rust 类型之间进行安全的转换。
Iffi
trait 的实现(可以派生)在一个类型 T
上,跨越一个 域 U
(特质的类型参数)提供断言,表示类型 U
的值可以安全地 转型 为类型 T
的值。
[iffi::try_from
][try_from] 和 [iffi::into
][into] 进行安全的转换。
术语表 & 概念
FFI 安全
可以与 FFI 一起使用的类型。
这可以是原始类型,带有 #[repr(C)]
或 #[repr(Int)]
标记的类型,或者带有 #[repr(transparent)]
标记的类型,只有一个非零大小的字段,该字段必须是 FFI 安全的。
位模式
表示类型潜在值的一串比特。
每个类型定义了一些位模式(与类型的位数相同),这些位模式是有效的,而其他位模式则无效。
例如,对于 u16
,所有位模式都是有效的,因为从 0x0000
到 0xffff
的所有值都是正确的 u16
值,但对于 bool
类型,只有位模式 0x00
和 0x01
(分别对应 false
和 true
)是有效的。0x02..=0xff
都是 bool
的无效位模式。
无效的位模式也称为“空隙”。所有位模式都有效的类型(如 u16
)被称为“无空隙”。
这个定义与《不安全代码指南》中的定义略有不同。在位模式方面,这个crate假定所有位都已初始化,因此无效位模式与空隙之间存在一对一的关系。
明确定义
内存中由有效位模式表示的潜在值。
例如,空引用或零初始化的 NonZero*
不是明确定义。
无空隙
没有空隙的类型,即没有无效位模式。
Nicheless
特性不能自动实现,必须通过派生或手动实现。
ZSTs(零大小类型)始终是无空隙的。无人居住的类型永远不会是无空隙的。
布局
类型的尺寸、对齐和ABI行为的组合。
宇宙
与某些可能非无空隙类型具有相同布局的无空隙类型。
MaybeInvalid<T>
是所有 T
的宇宙。
一个类型可能有多个宇宙。例如,NonZeroU8
有宇宙 MaybeInvalid<NonZeroU8>
和 u8
。
依赖关系
~0.4–0.9MB
~19K SLoC