3个不稳定版本

使用旧的Rust 2015

0.2.0 2018年3月29日
0.1.1 2018年3月27日
0.1.0 2018年3月27日

内存管理 中排名434

每月下载27
敏感 中使用

MIT/Apache

14KB
135

防弹内存访问

Build Status License Cargo Documentation

不知道内存位置是否有效?不用担心,这里有防弹内存访问!

示例

将此内容添加到您的 Cargo.toml

[dependencies]
bulletproof = "0.2"

接下来,享受防弹内存访问如下

use bulletproof::Bulletproof;
use std::ptr;

let mut x = 42usize;
let y = 42u8;

unsafe {
    let bulletproof = Bulletproof::new();

    assert_eq!(bulletproof.load_usize(&x), Ok(42));
    assert_eq!(bulletproof.load_usize(ptr::null()), Err(()));

    assert_eq!(bulletproof.store_usize(&mut x, 37), Ok(()));
    assert_eq!(bulletproof.store_usize(ptr::null_mut(), 37), Err(()));
    assert_eq!(bulletproof.load_usize(&x), Ok(37));
    assert_eq!(ptr::read(&x), 37);

    assert_eq!(bulletproof.load(&y), Ok(42));
    assert_eq!(bulletproof.load::<[usize; 32]>(ptr::null()), Err(()));
}

如何?

内部,Bulletproof::new() 安装了段错误(SIGSEGV)的信号处理程序,使用 siglongjmp() 从故障中恢复。

安全吗?

即使位置已释放,它仍然可能可访问,因为它尚未返回给操作系统。

由于 Bulletproof::new() 注册了 SIGSEGV 信号处理程序,它可能会干扰现有的或未来的信号处理程序。最值得注意的是,Rust在初始化时安装了一个SIGSEGV信号处理程序来保护堆栈免受溢出。通过创建一个 Bulletproof,堆栈不再受到保护。

为什么?

您可能不应该使用这个库:不要依赖防弹访问,而是移除您的段错误!然而,如果您想构建如虚拟机或垃圾回收器等底层系统,防弹加载可以作为提高效率的额外工具。例如,请参阅Java HotSpot虚拟机中的ThreadCrashProtection

许可证

在MIT许可证和Apache许可证(版本2.0)的条款下授权。

有关详细信息,请参阅LICENSE-MITLICENSE-APACHE

依赖关系

~225KB