不安全 Rust

发布时间: 更新时间: 总字数:510 阅读时间:2m 作者: IP上海 分享 网址

不安全(unsafe)Rust:不提供强制的内存安全保证。

介绍

存在原因:

  • 解决静态分析保守问题,通过 unsafe rust 程序员承担对象风险时实现额外 超能力
  • Rust 需要底层系统编程,但计算机硬件本身是不安全的

unsafe 超能力

通过 unsafe 关键字来切换 unsafe rust,可以执行4个动作:

  • 解引用 原始指针(raw point)
    • 可变的 *mut T,如 let r1 = &mut num as *mut i32;
    • 不可变的(解引用后不能直接对其进行复制) *const T,如 let r1 = &num as *const i32;
      • 此处的 * 不是解引用符号,它是类型名的一部分
    • 存在原因
      • 与 C 语音进行交互的接口,使用 extern 关键字调用 外部函数接口(FFI, Foreign Function Interface)
      • 构建借用检查器无法理解的安全抽象
  • 调用 unsafe 函数或方法:在函数或方法前加 unsafe 关键的函数或方法
    • 必须在 unsafe 块里调用
    • 满足特定的条件(见官网)
unsafe fn unsafe_fn {
    ...
}

fn some_fn() {
    unsafe {
        unsafe_fn();
    }
}
  • 访问或修改可变的静态变量(static)static SCRESMING_SNAKE_CASE: &str = "hello world!";
  • 实现 unsafe trait
    • 该 trait 只能在 unsafe 代码库中实现
    • 声明示例:
unsafe trait Foo {
    // ...
}

unsafe impl Foo for i32 {
    // ...
}

说明:

  • unsafe 并没有关闭借用检查或停用其他安全检查
  • 任何内存安全相关的错误必须留着 unsafe 块里
  • 尽可能隔离 unsafe 代码,如封装在安全的抽象里,对外提供安全的 API

unsafe 代码使用

  • 开发者需要保证 unsafe 代码的正确,因为编译器无法保证 unsafe 代码的安全
  • 出现问题,需要优先排查 unsafe 代码
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数