#ffi #value #assertions #layout #api-bindings #iffi #nicheless

iffi-macros

对在FFI中使用的值进行断言

1个不稳定版本

0.0.1 2023年4月10日

#102 in #assertions


iffi中使用

MIT/Apache

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