rust学习-不安全操作

在 Rust 中,不安全代码块用于避开编译器的保护策略

四种不安全操作

  • 解引用裸指针
  • 通过 FFI (Foreign Function Interface,外部语言函数接口)调用函数
  • 调用不安全的函数
  • 内联汇编(inline assembly)

解引用裸指针

原始指针(raw pointer,裸指针)* 和引用 &T 有类似的功能
引用总是安全的,因为借用检查器保证了它指向一个有效的数据
解引用不安全,一个裸指针只能通过不安全代码块执行

fn main() {
   
    let raw_p: *const u32 = &10;

    unsafe {
   
        assert!(*raw_p == 10);
    }
}

调用不安全函数

使用了 Rust 的 unsafe 特性
从原生指针中创建 slice 是不安全的,需要手动来确保指针和长度的正确性

use std::slice;

fn main() {
   
    // 定义一个包含四个元素的 Vector
    let some_vector = vec![1, 2, 3, 4];

    // 获取指向 Vector 对象的原始指针和长度
    let pointer = some_vector.as_ptr();
    let length = some_vector.len();

	// 不安全操作,使用unsafe块
    unsafe {
   
        // 通过原始指针和长度创建一个 u32 类型的不可变 slice
        let my_slice: &[u32] = slice::from_raw_parts(pointer, length);
        
        // 使用 assert_eq! 宏进行断言,比较 Vector 和转换后的 slice 是否相等
        assert_eq!(some_vector.as_slice(), my_slice);
    }
}

附录

切片

&[u32] 是一个不可变的切片类型,也称为引用切片(slice reference)
用于表示一个基于某个 u32 类型的数组或向量的引用部分
它由一个指向数据的指针和一个长度值组成
指针指向数组或向量中第一个元素的地址
长度则表示这个切片包含的元素数目
常用于接收函数的参数/返回函数的结果

// 将数组或者向量转为slice切片
fn fn_name(slice: &[u32]) -> u32 {
   
    let mut sum = 0;
    for i in 0..slice.len() {
   
        sum += slice[i];
    }
    sum
}

fn main() {
   
    let array = [1

你可能感兴趣的:(rust,rust,学习)