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 日 |
#95 在 Rust 模式 中
每月 282,835 次下载
用于 291 个crate (直接使用 32 个)
58KB
521 行代码(不包括注释)
sptr: 严格的来源 Polyfill
此库为 Rust 的 [严格来源] 实验提供了一个稳定的 Polyfill。
映射到 STD API
此crate "覆盖"了许多不稳定的 std API,以下是映射关系
core::ptr (sptr)
pub fn
invalid
<T>(addr: usize) -> *const T;
pub fn
invalid_mut
<T>(addr: usize) -> *mut T;
pub fn
from_exposed_addr
<T>(addr: usize) -> *const T;
pub fn
from_exposed_addr_mut
<T>(addr: usize) -> *mut T;
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 中的文档。