9 个版本

0.3.2 2022 年 6 月 27 日
0.3.1 2022 年 4 月 5 日
0.2.3 2022 年 4 月 1 日
0.2.2 2022 年 3 月 31 日
0.1.1 2022 年 3 月 28 日

#95Rust 模式

Download history 51110/week @ 2024-03-14 51754/week @ 2024-03-21 49035/week @ 2024-03-28 53862/week @ 2024-04-04 55679/week @ 2024-04-11 63392/week @ 2024-04-18 57868/week @ 2024-04-25 61741/week @ 2024-05-02 64588/week @ 2024-05-09 70161/week @ 2024-05-16 61157/week @ 2024-05-23 67751/week @ 2024-05-30 65762/week @ 2024-06-06 72015/week @ 2024-06-13 71619/week @ 2024-06-20 60477/week @ 2024-06-27

每月 282,835 次下载
用于 291 个crate (直接使用 32 个)

MIT/Apache

58KB
521 行代码(不包括注释)

sptr: 严格的来源 Polyfill

crates.io Rust CI

此库为 Rust 的 [严格来源] 实验提供了一个稳定的 Polyfill。

映射到 STD API

此crate "覆盖"了许多不稳定的 std API,以下是映射关系

core::ptr (sptr)

core::pointer (sptr::Strict)

  • pub fn addr(self) -> usize;
  • pub fn expose_addr(self) -> usize;
  • pub fn with_addr(self, addr: usize) -> Self;
  • pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self;

非标准扩展(默认禁用,自行承担风险)

  • sptr::uptr(功能 = uptr)
  • sptr::iptr(功能 = uptr)
  • sptr::OpaqueFnPtr(功能 = opaque_fn)

应用覆盖

在 sptr 和 core::ptr 之间切换应该与在静态函数之间切换 sptr::ptr:: 一样简单。对于方法,您必须将 sptr::Strict 导入到您的模块中,以便扩展 trait 的方法覆盖 std。编译器会(可以理解地)抱怨您正在覆盖 std,因此您还需要像以下示例中那样抑制该错误。

#![allow(unstable_name_collisions)]
use sptr::Strict;

let ptr = sptr::invalid_mut::<u8>(1);
println!("{}", ptr.addr());

默认情况下,此软件包还将指针上的方法标记为“已过时”,如果它们与 strict_provenance 不兼容。如果您不希望这样做,请在 Cargo.toml 中设置 default-features = false

Rust 是这些 API 和语义的定义的规范来源,但这里的文档将尝试大致反映 Rust 中的文档。

无运行时依赖项

功能