Rust-Panic

什么是panic

在Rust中,有一类错误叫作panic。示例如下:

在这里插入图片描述
编译,没有错误,执行这段程序,输出为:

在这里插入图片描述
这种情况就引发了一个panic。在这段代码中,我们调用了Option::unwrap()方法,正是这个方法有可能导致panic。根据提示,我们设置一个环境变量RUST_BACKTRACE=1之后再执行这个程序,可以看到这个程序在发生panic时候的函数调用栈。

Panic实现机制

在Rust中,Panic的实现机制有两种方式:unwind和abort。

  • unwind方式在发生panic的时候,会一层一层地退出函数调用栈,在此过程中,当前栈内的局部变量还可以正常析构。
  • abort方式在发生panic的时候,会直接退出整个程序。

在常见的操作系统上,默认情况下,编译器使用的是unwind方式。所以在发生panic的时候,我们可以通过一层层地调用栈找到发生panic的第一现场,就像前面例子展示的那样。

但是,unwind并不是在所有平台上都能获得良好支持的。在某些嵌入式系统上,unwind根本无法实现,或者占用的资源太多。在这种时候,我们可以选择使用abort方式实现panic.

编译器提供了一个选项,供用户指定panic的实现方式。

Panic Safety

C++中引入了“异常”这个机制之后,同时也带入了一个“异常安全”(exception safety)的概念。

异常安全存在四种层次的保证:

  • No-throw——这种层次的安全性保证了所有的异常都在内部正确处理完毕,外部毫无影响;
  • Strong exception safety——强异常安全保证可以保证异常发生的时候,所有的状态都可以“回滚”到初始状态,不会导致状态不一致的问题;
  • Basic exception safety——基本异常安全保证可以保证异常发生的时候不会导致资源泄漏;
  • No exception safety——没有任何异常安全保证。

在Rust中,什么情况下panic会导致bug呢?这种情况的产生需要两个条件:

  • panic导致了数据结构内部的状态错误;
  • 这个错误的状态会在以后被观测到。

在unsafe代码中,这种情况非常容易出现。所以,在写unsafe代码的时候,需要对这种情况非常敏感小心,一不小心就可能因为这个原因制造出“内存不安全”。

在不用unsafe的情况下,Panic Safety是基本有保障的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SparkSQL初体验

SparkSQL初体验 命令式的 API RDD 版本的 WordCount val conf new SparkConf().setAppName("ip_ana").setMaster("local[6]") val sc new SparkContext(conf)sc.textFile("hdfs://master:9000/dataset/wordcount.txt").flatMap(_.split("…

设计一个抽奖系统

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

复试 || 就业day16(2024.01.16)算法篇

文章目录 前言环和杆检查是否每一行每一列都包含全部整数将找到的值乘以 2数组中紧跟 key 之后出现最频繁的数字将数组划分成相等数对找出两数组的不同多个数组求交集移除字母异位词后的结果数组* 前言 💫你好,我是辰chen,本文旨在准备考研复…

在uniapp Vue3版本中如何解决web/H5网页浏览器跨域的问题

问题复现 uniapp项目在浏览器运行,有可能调用某些接口会出现跨域问题,报错如下图所示: 什么是跨域? 存在跨域问题的原因是因为浏览器的同源策略,也就是说前端无法直接发起跨域请求。同源策略是一个基础的安全策略&a…

前端下载文件流,设置返回值类型responseType:‘blob‘无效的问题

前言: 本是一个非常简单的请求,即是下载文件。通常的做法如下: 1.前端通过Vue Axios向后端请求,同时在请求中设置响应体为Blob格式。 2.后端相应前端的请求,同时返回Blob格式的文件给到前端(如果没有步骤…

shell脚本 $0-$n $* $@ $# $? $$

各命令详解 1.$0-$n :表示脚本或函数的参数。$0 是脚本的名称,$1 到 $n 是位置参数,每个对应一个传递给脚本或函数的参数。 2.$* :表示所有传递给脚本或函数的参数。它将所有位置参数作为单个字符串显示。 3.$ :表示所…

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤)

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤) 目录 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现GRNN广义回归神经网络时间序列…

大语言模型面试问题【持续更新中】

自己在看面经中遇到的一些面试题,结合自己和理解进行了一下整理。 transformer中求和与归一化中“求和”是什么意思? 求和的意思就是残差层求和,原本的等式为y H(x)转化为y x H(x),这样做的目的是防止网络层数的加深而造成的梯…

openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramgen.c

文章目录 openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramgen.c概述笔记END openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramgen.c 概述 产生DSA的_evp_pkey_ctx 初始化_evp_pkey_ctx 设置参数到_evp_pkey_ctx 由_evp_pkey_ctx产生_evp_pkey 打印_evp_pkey公…

Angular系列教程之观察者模式和RxJS

文章目录 引言RxJS简介RxJS中的设计模式观察者模式迭代器模式 示例代码RxJS 在 Angular 中的应用总结 引言 在Angular开发中,我们经常需要处理异步操作,例如从后端获取数据或与用户的交互。为了更好地管理这些异步操作,Angular中引入了RxJS&…

el-table嵌套两层el-dropdown-menu导致样式错乱

问题&#xff1a; 解决方式&#xff1a; <el-table-column label"操作" fixed"right" width"132" align"center"><template slot-scope"scope"><div v-if"scope.row._index ! 合计"><el-d…

Android 实现跑马灯效果

Android 实现跑马灯效果 Android中实现跑马灯效果有多种方式,本篇简单介绍下: 1: TextView属性实现 <TextViewandroid:layout_width"150dp"android:layout_height"wrap_content"android:background"#77000000"android:padding"5dp&quo…

笨蛋学设计模式结构型模式-装饰者模式【9】

结构型模式-装饰者模式 7.3装饰者模式:arrow_up::arrow_up::arrow_up:7.3.1概念7.3.2场景7.3.3优势 / 劣势7.3.4装饰者模式可分为7.3.5装饰者模式7.3.6实战7.3.6.1题目描述7.3.6.2输入描述7.3.6.3输出描述7.3.6.4代码 7.3.7总结装饰者模式 7.3装饰者模式⬆️⬆️⬆️ 7.3.1概念…

【PWN · GOT表劫持 | 整数溢出】[HGAME 2023 week1]choose_the_seat

整数溢出&#xff0c;加之保护开的不全&#xff0c;可以反复越界修改got表&#xff0c;劫持puts函数实现利用 一、题目概述 限制&#xff1a;v0不可以大于9 理想中数组所在bss端地址&#xff1a; 注意到与got表项距离很近 危险函数只能执行一遍&#xff0c;然后回exit(0) 二…

Next.js 开发指​南(GitHub 115k star​)

Next.js 是一个构建于 Node.js 之上的开源 Web 开发框架&#xff0c;它扩展了最新的 React 特性&#xff0c;集成了基于 Rust 的 JavaScript 工具&#xff0c;可以帮助你快速创建全栈 Web 应用 &#xff08;full-stack Web applications&#xff09; 。 对于有一定 React 基础…

华为数通方向HCIP-DataCom H12-831题库(判断题:21-40)

第21题 OSPF的NSSA区域内,在ASBR路由器上不论路由表中是否存在缺省路由,都会自动产生描述缺省路由的Type7LSA,通告到整个NSSA区域 正确 错误 答案:错误 解析: 在NSSA区域中,ASBR默认情况下不会产生7类LSA表示的默认路由。 第22题 BFD单跳检测是指对两个直连接口进行IP连…

Express安装与基础使用

一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c; 官方网站&#xff1a; Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 中文文档&#xff1a; 路由 - Express 中文文档 简单来说&am…

数据库概念大全

1.数据库的四个基本概念 (1)数据 data:描述事物的符号&#xff0c;数据库中存储的基本对象。 (2)数据库 DataBase, DB:长期存储在计算机内的&#xff0c;有组织的&#xff0c;可共享的大量数据集合、 (3)数据库管理系统 DMBS&#xff1a;位于用户与操作系统之间的一层数据管…

Kafka生产消费流程

Kafka生产消费流程 1.Kafka一条消息发送和消费的流程图(非集群) 2.三种发送方式 准备工作 创建maven工程&#xff0c;引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.3.1…

笔试面试题——继承和多态

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是多态&#xff1f;二、什么是重载、重写(覆盖)、重定义(隐藏)&#xff1f;三、 inli…