RUST网络客户端的基本技术说明-裸指针和unsafe

一、unsafe

unsafe这个英文单词,几乎可以让人明白这种用法是为了兼容其它“低级”语言的用法的,意味着这种作法是不推荐不安全的。这种作法在c#等其它语言都有类似的形制。比如c#在操作指针时,也会有类似的操作。这也是后发的高级语言的一个痛点,如果想在某个领域尽快的扩大影响,就不可避免的已经在这个领域已经占据有广泛的影响力的语言。
从某种意义上来讲,在C/C++语言中直接操作汇编语言,也可以划到这种unsafe的用法中。
换句话说,新的高级语言提供了一系列的高级的安全用法,但是在某些情况下又必须使用一些其它不安全的用法打破自己的设计,为了安全计,就必须显示的标明这些操作行为是不安全的。一方面,可以提醒尽量不要使用这种操作;另一方面,也不断演进语言本身,把这种不安全的用法不断的降低范围。
在Rust中,也不可避免的出现这种现象。Rust之所以安全,就是因为其从设计上保证上内存应用的安全。但是正如前面所提到的,Rust不光要提供自己的安全用法,对已经存在的在Rust眼中不安全的用法,也不得不提供支持;另外,它自己本身也在一些特定的领域内提供了一些非安全的用法。
这里需要说的是,unsafe和safe和应用程序开发的BUG不能混淆在一起,符合安全规范的代码,未必不会有Bug,反之,也不代表一定会有bug。
在Rust中unsafe主要有几种用法 :
1、裸指针
2、可变静态变量
3、不安全函数
看一下相关的例程:

//裸指针
let x = 5;
let raw = &x as *const i32;
let points_at = unsafe { *raw };
println!("raw points at {}", points_at);
//可变静态变量
static mut N: i32 = 5;
unsafe {
    N += 1;
    println!("N: {}", N);
}
//不安全函数
unsafe fn foo() {
    //实现
}
fn main() {
    unsafe {
        foo();
    }
}

代码出自《RustPrimer》。

二、裸指针

在Rust中,为了保证内存的安全,在编译器级别进行了内存安全的类型检查和校验。但特定场合下,仍然需要对指针进行直接操作,形如const T和mut T在Rust中即是现在提到的“裸指针”。既然是裸指针,搞c++的就明白了,这玩意儿说白了整个一个不靠谱啊,主要表现为:
1、指针指向的内存是不可信的。
2、指针需要手动处理内存资源
3、Rust的所有权移动和生命周期无法在这方面应用。所以很容易出现悬垂指针。
4、没有别名或可变性的保障(不允许强转)
而在实际的应用中,裸指针和unsafe在Rust中的操作一般是引用和裸指针之间可以隐式转换,但隐式转换后再解引用需要使用unsafe。
看一下相关的例程:

// 显式
let a = 1;
let b: *const i32 = &a as *const i32; //或者let b = &a as *const i32;
// 隐式
let c: *const i32 = &a;
unsafe {
    println!("{}", *c);
}

代码出自《RustPrimer》。
代码很简单,没有什么可讲的,大家可以在机器上实践一下。

三、总结

完全打破对过去的依赖和支持,正如打破一个旧的秩序,就必须要建立一个新的秩序。但新旧秩序的交替之间的苦痛,又是不得不承受的一种莫名的心酸。Rust现在也在经历这种苦痛,能不能破茧而出,就看时间的造化了。
努力吧,归来的少年!
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值