Rust进阶(13)-不安全代码

不安全代码

1. 概述

  1. 之前介绍的都是安全的Rust,即Rust在编译时会强制执行的内存安全保证。不会强制执行这类内存安全保证的,就是不安全的Rust.
  2. 不安全的Rust存在的两大原因:
    1. 静态分析本质上是保守的,就意味着某些代码可能是合法的,但是Rust也会拒绝。在此情况下,可使用不安全的代码
    2. 底层计算机硬件固有的不安全性。如果Rust不允许进行不安全操作,有些任务根本就完成不了
  3. 不安全的Rust具有的超级力量,Rust会通过unsafe关键字切换到不安全的Rust。不安全的Rust具有以下超级力量:
    1. 解引用裸指针,看第2节代码
      1. 不可变和可变的,分别写作*const T, *mut T
        1. 允许忽略借用规则,可以同时拥有不可变和可变的指针,或者是多个指向相同位置的可变指针
        2. 不保证指向的内存是有效的
        3. 允许为空
        4. 不能实现任何自动清理的功能
    2. 调用不安全的函数或者方法
    3. 访问或修改可变静态变量
    4. 实现不安全的trait
  4. 注意:unsafe并不会关闭借用检查器或禁用任何其它的Rust安全检测规则,它只提供上述几个不被编译器检查内存安全的功能。unsafe也不意味着块中的代码一定就是不ok的,它只是表示由程序员来确保安全的。

2. 解引用裸指针

1
2
3
4
5
6
7
8
9
10
11
12
13
fn main() {
let mut num = 5;
//创建不可变和可变的裸指针可以在安全的代码中,只是不能再安全代码块之外解引用裸指针
let r1 = &num as *const i32; //不可变裸指针
let r2 = &mut num as *mut i32;
unsafe {
println!("r1 is: {}", *r1);
println!("r2 is: {}", *r2);
}

let add = 0x12345usize;
let r = add as *const i32;
}

3. 不安全函数以及C语言和rust互调

c语言调用rust,这里不考虑
调用不同语言,本身就不安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
extern "C"{
fn abs(input:i32)-> i32;
}

unsafe fn dangerous(){
println!("do something dengerous");
}

fn foo(){
let mut num = 5;
let r1 = &num as *const i32;
let r2 = &mut num as *mut i32;
unsafe {
println!("*r1 = {}",*r1);
println!("*r2 = {}",*r2);
}
}

fn main() {
unsafe {
dangerous();
}
foo();

//调用c语言
unsafe{
println!("abs(-3): {}",abs(-3));
}
}

4. 访问或者修改可变静态变量

  1. 静态变量有一个固定的内存地址(使用这个值总会访问相同的地址),常量则允许在任何被用到的时候复制其数据
  2. 静态变量可以是可变的,虽然这可能是不安全(使用unsafe包含)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static mut COUNTER: u32 = 0;

fn add_counter(inc:u32){
unsafe {
COUNTER += inc;
}
}

fn main() {
add_counter(3);
unsafe {
println!("counter:{}",COUNTER);
}
}

5. 实现不安全的trait

  1. 当至少又一个方法中包含编译器不能验证的不变量时,该trait就是不安全的
  2. 在trait之前增加unsafe声明其为不安全的,同时trait的实现也必须用unsafe标记
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsafe trait Foo {
fn foo(&self);
}

struct Bar();

unsafe impl Foo for Bar {
fn foo(&self) {
println!("foo");
}
}

fn main() {
let a = Bar();
a.foo();
}

总结

本文编辑完毕

参考

[1] Rust 程序设计语言

  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信