#value #assertions #traits #conversion #parameters #safely

无 std iffi

关于通过 FFI 使用的值的断言

2 个版本

0.0.2 2023 年 4 月 10 日
0.0.1 2023 年 4 月 10 日

#288 in FFI

MIT/ApacheLGPL-2.0

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,所有位模式都是有效的,因为从 0x00000xffff 的所有值都是正确的 u16 值,但对于 bool 类型,只有位模式 0x000x01(分别对应 falsetrue)是有效的。0x02..=0xff 都是 bool 的无效位模式。

无效的位模式也称为“空隙”。所有位模式都有效的类型(如 u16)被称为“无空隙”。

这个定义与《不安全代码指南》中的定义略有不同。在位模式方面,这个crate假定所有位都已初始化,因此无效位模式与空隙之间存在一对一的关系。

明确定义

内存中由有效位模式表示的潜在值。

例如,空引用或零初始化的 NonZero* 不是明确定义。

无空隙

没有空隙的类型,即没有无效位模式。

Nicheless 特性不能自动实现,必须通过派生或手动实现。

ZSTs(零大小类型)始终是无空隙的。无人居住的类型永远不会是无空隙的。

在《不安全代码指南》中可找到更技术性的定义。

布局

类型的尺寸、对齐和ABI行为的组合。

宇宙

与某些可能非无空隙类型具有相同布局的无空隙类型。

MaybeInvalid<T> 是所有 T 的宇宙。

一个类型可能有多个宇宙。例如,NonZeroU8 有宇宙 MaybeInvalid<NonZeroU8>u8

依赖关系

~0.4–0.9MB
~19K SLoC