1个不稳定版本
0.0.1 | 2023年4月10日 |
---|
#102 in #assertions
在iffi中使用
22KB
543 行
在FFI安全和舒适的Rust类型之间进行安全转换。
在类型 T
上实现 Iffi
特性(可以派生)的 领域 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假设所有位都已初始化,因此无效位模式和空隙之间存在一一对应的关系。
well-defined
在内存中由有效位模式表示的潜在值。
例如,空引用或零初始化的 NonZero*
不是 well-defined。
nicheless
没有空隙的类型,即没有无效位模式。
不可自动实现的 Nicheless
特性必须通过派生或手动实现。
ZSTs 总是 nicheless。无人居住的类型永远不会 nicheless。
layout
类型的尺寸、对齐和ABI行为的组合。
universe
具有与某些可能非 nicheless 类型相同布局的 nicheless 类型。
MaybeInvalid<T>
是所有 T
的宇宙。
类型可能有多个宇宙。例如,NonZeroU8
有宇宙 MaybeInvalid<NonZeroU8>
和 u8
。
Dependencies
~290–750KB
~18K SLoC