#layout #memory-layout #struct #type #type-layout

type-layout-syn2

可推导特质,用于查看结构体的布局,适用于调试。针对syn 2进行修补。

1个不稳定版本

0.2.1 2024年5月16日
0.2.0 2024年5月16日

#1128 in Rust模式

MIT/Apache

12KB
125

[!注意]
这是一个针对syn 2而非syn 1的原始type-layout的修补版本。当原始作者应用补丁时,此crate将被撤回。有关此问题的进度,请参阅 PR。该补丁包含以下更改

  • 将依赖项syn v2用于替代syn v1.0.40。
  • 使用memoffset v0.9替代v0.5,以修复memoffset中已知的一个错误,该错误可能导致读取未初始化的内存。
  • 将Rust MSRV更新到1.60(继承自syn 2)。
  • 将TypeLayoutInfo中的Field结构更改为枚举,从发布源到crates.io上的v0.2.0进行功能同步。

使用此补丁的方式如下 type-layout = { version = "0.2", package = "type-layout-syn2" }。虽然这些更改在技术上具有破坏性,但原始作者将决定实际版本。

type-layout

GitHub CI Status type-layout on crates.io type-layout docs

type-layout是一个类型布局调试辅助工具,提供可#[derive]的特质,它报告

  • 类型的名称、大小和最小对齐
  • 每个字段的名称、类型、偏移和大小
  • 由于对齐要求而产生的填充

type-layout目前仅在具有命名字段的struct上起作用。 这是一个临时限制。

示例

类型布局仅在它们定义了#[repr(C)]时才被定义。此crate支持非#[repr(C)]类型,但它们的布局是不可预测的。

use type_layout::TypeLayout;

#[derive(TypeLayout)]
#[repr(C)]
struct Foo {
    a: u8,
    b: u32,
}

println!("{}", Foo::type_layout());
// prints:
// Foo (size 8, alignment 4)
// | Offset | Name      | Size |
// | ------ | --------- | ---- |
// | 0      | a         | 1    |
// | 1      | [padding] | 3    |
// | 4      | b         | 4    |

对齐类型有尾随填充,这可能在某些FFI场景中成为bug的来源。

use type_layout::TypeLayout;

#[derive(TypeLayout)]
#[repr(C, align(128))]
struct OverAligned {
    value: u8,
}

println!("{}", OverAligned::type_layout());
// prints:
// OverAligned (size 128, alignment 128)
// | Offset | Name      | Size |
// | ------ | --------- | ---- |
// | 0      | value     | 1    |
// | 1      | [padding] | 127  |

最小支持的Rust版本(MSRV)

type-layout支持Rust 1.34.1及更高版本。直到type-layout达到1.0,MSRV的更改将需要主要版本号的增加。在1.0之后,MSRV的更改将仅需要小版本号的增加,但需要充分的理由。

许可证

许可协议为以下之一

任选其一。

贡献

除非你明确声明,否则根据Apache-2.0许可证定义,你提交的任何旨在包含在作品中的贡献都将按照上述方式双重许可,不附加任何额外的条款或条件。

依赖关系

~0.3–0.8MB
~19K SLoC