任何事情都是相对的,就像Rust给我们的印象一直是安全、快速,但实际上,完全的安全是不可能实现的。因此,Rust中也是会有不安全的代码的。

严格来讲,Rust语言可以分为Safe RustUnsafe Rust。Unsafe Rust是Safe Rust的超集。在Unsafe Rust中并不会禁用任何的安全检查,Unsafe Rust出现的原因是为了让开发者可以做一些更加底层的操作。这些事情本身也是不安全的,如果仍然要进行Rust的安全检查,那么就无法进行这些操作。

在进行下面这5种操作时,Unsafe Rust不会进行安全检查。

  • 解引用原生指针
  • 调用unsafe的函数或方法
  • 访问或修改可变的静态变量
  • 实现unsafe的trait
  • 读写联合体中的字段

基础语法

Unsafe Rust的关键字是unsafe,它可以用来修饰函数、方法和trait,也可以用来标记代码块。

标准库中也有不少函数是unsafe的。例如String中的from_utf8_unchecked()函数。它的定义如下:

pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String {String { vec: bytes }
}

这个函数被标记为unsafe的原因是函数并没有检查传入参数是否是合法的UTF-8序列。也就是提醒使用者注意,使用这个函数要自己保证参数的合法性。

用unsafe标记的trait也比较常见,在前面我们见过的Send和Sync都是unsafe的trait。它们被用来保证线程安全, 将其标记为unsafe是告诉开发者,如果自己实现这两个trait,那么代码就会有安全风险。

我们在调用unsafe函数或方法时,需要使用unsafe代码块。

fn main() {let sparkle_heart = vec![240, 159, 146, 150];let sparkle_heart = unsafe {String::from_utf8_unchecked(sparkle_heart)};assert_eq!("												

Rust入坑指南:居安思危相关推荐

  1. Rust 入坑指南:鳞次栉比 | CSDN 博文精选

    作者 | Jackyzhe 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉 ...

  2. Rust入坑指南:齐头并进(上)

    我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级.为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外. 聊到并发,就离不开多进程和多线程这两个概念. ...

  3. Rust入坑指南:朝生暮死

    今天想和大家一起把我们之前挖的坑再刨深一些.在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚. ...

  4. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  5. Rust入坑指南:鳞次栉比

    很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...

  6. Rust入坑指南:核心概念

    如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...

  7. Rust入坑指南:千人千构

    坑越来越深了,在坑里的同学让我看到你们的双手! 前面我们聊过了Rust最基本的几种数据类型.不知道你还记不记得,如果不记得可以先复习一下.上一个坑挖好以后,有同学私信我说坑太深了,下来的时候差点崴了脚 ...

  8. Rust入坑指南:常规套路

    搭建好了开发环境之后,就算是正式跳进Rust的坑了,今天我就要开始继续向下挖了. 由于我们初来乍到 ,对Rust还不熟悉,所以我决定先走一遍常规套路. 变不变的变量 学习一门语言第一个要了解的当然就是 ...

  9. Rust入坑指南:坑主驾到

    欢迎大家和我一起入坑Rust,以后我就是坑主,我主要负责在前面挖坑,各位可以在上面看,有手痒的也可以和我一起挖.这个坑到底有多深?我也不知道,我是抱着有多深就挖多深的心态来的,下面我先跳了,各位请随意 ...

最新文章

  1. nginx 配置并发数限制
  2. python自带 python2转python3 代码工具
  3. Mysql事务隔离级别及MVCC(多版本并发控制)
  4. @capire/common is not needed at runtime at all
  5. 小米真蓝牙耳机说明书_小米真无线蓝牙耳机Air2 SE评测:仅需169元,享受随心畅听体验...
  6. 我的女朋友漏电了–论C++中的失败(failure),缺陷(bug)和异常(exception)
  7. 【linux】RedHat 7.x 升级 openssh 为 8.x 版本
  8. 解决Spring Boot集成Shiro,配置类使用Autowired无法注入Bean问题
  9. 【MVC】bootstrap-paginator 分页
  10. [置顶]mybatis分页插件实现分页...
  11. 【C/C++】【VS开发】结构体存储空间数据对齐说明
  12. 合并账号_亚马逊账号最新死法:合并listing和折扣促销
  13. linux cuda 编程指南,CUDA编程指南阅读笔记
  14. php银行卡三要素实名认证
  15. RO、RW和ZI数据解析
  16. 使用 BulkLoad 向 HBase 中批量导入数据
  17. 问题解决:下载的网页打开后自动跳转到首页
  18. 【Android】自定义控件实现自动补齐邮箱后缀的输入框
  19. ch341a_USB转串口/并口驱动
  20. 基于U盘传播的简单病毒

热门文章

  1. ifunbox_如何使用iFunBox作为强大的iTunes替代产品
  2. wikioi 1069 关押罪犯
  3. 抢滩智能门锁的内卷之争
  4. 将win10 v2004-20H2-21H1更新到 Win10 21H2
  5. Python3.6爬虫记录
  6. 计算机专业 俄语,俄语计算机专业词汇
  7. java exp5_[Core Java® for the Impatient]重载Java1
  8. 大数据篇(3)在学习大数据的过程中教会你煮菜!!!
  9. linux中主成分分析软件,基于全基因组snp数据进行主成分分析(PCA)
  10. Leaning How to learn