3个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年3月29日 |
---|---|
0.1.1 | 2018年3月27日 |
0.1.0 | 2018年3月27日 |
在 内存管理 中排名434
每月下载27次
在 敏感 中使用
14KB
135 行
防弹内存访问
不知道内存位置是否有效?不用担心,这里有防弹内存访问!
示例
将此内容添加到您的 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-MIT和LICENSE-APACHE。
依赖关系
~225KB