rust关键字unsafe

news/2025/11/27 17:36:54/文章来源:https://www.cnblogs.com/guxuanqing/p/19278889
一看到unsafe关键字,第一印象就是这代码危险的,还是别用了。其实呢,根据个人使用及理解,可以认为作为rust的一种行为扩展机制,胆子大一点做常人之不敢做的事。
在 Rust 中,unsafe 是一个特殊的关键字,它允许开发者进入一个“不安全”的代码块或调用标记为 unsafe 的函数
unsafe 并不是说被标记的代码会立即导致内存错误,而是表示编译器将停止强制执行某些 Rust 的核心内存安全保证,并将维护这些保证的责任交给了程序员
理解 unsafe 的核心思想是:它并没有禁用整个 Rust 语言的安全检查,它只是提供了一组额外的超能力,要求你手动维护安全契约。

1. 如何理解 unsafe

Rust 的静态分析是保守的,有些在逻辑上安全但编译器无法证明的代码会被拒绝。unsafe 机制提供了一个“逃生舱口”,允许程序员执行五种“不安全的超能力”(但并非所有都是真正危险的,只是编译器无法验证):
  • 解引用裸指针(Dereferencing raw pointers):*const T 和 *mut T 类型的指针可以让你直接访问内存地址,类似于 C/C++ 中的指针操作。
  • 调用不安全的函数或方法:标记为 unsafe fn 的函数(包括调用 C 函数)要求调用者手动确保满足特定的安全前提条件。
  • 访问或修改可变静态变量(mutable static variables):全局可变状态可能导致数据竞争,因此访问它需要 unsafe

关于这句话的理解:unsafe 不会 自动为你加锁。你需要加锁,但要通过使用 std::sync::Mutex 或 RwLock 这样的安全的、并发原语来实现。使用 Mutex 或 RwLock 包装的静态变量,可以在完全安全的 Rust 代码中进行访问,从而避免了 unsafe一句话,责任在你负责,编译器不保证哦。

  • 实现不安全的 trait:某些 trait(如 Send 和 Sync)需要实现者保证特定的并发安全不变性,这需要标记为 unsafe impl
  • 访问联合体(union)的字段:由于 union 实例中只存储其声明字段之一,Rust 无法保证当前存储的数据类型,因此访问字段不安全。

2. 何时使用 unsafe

在日常的 Rust 编程中,你很少需要直接编写 unsafe 代码。unsafe 主要用于以下场景:
  • 与外部 C 语言代码进行 FFI(Foreign Function Interface)交互: 当调用 C 库函数时,你必须使用 unsafe 块,因为 Rust 编译器无法保证 C 代码的内存安全。可参考rust FFI跨语言调用
  • 实现操作系统底层接口: 直接与硬件或操作系统内核交互时可能需要。
  • 实现高性能数据结构: 实现像链表、树、自定义分配器这类需要复杂内存管理的结构时。
  • 操作裸指针: 例如,手动管理内存缓冲区或实现一个自定义智能指针。
关键原则: 应尽量将 unsafe 代码封装在安全的抽象接口后面。标准库就是最好的例子:Vec<T>(动态数组)内部充满了 unsafe 代码来管理堆内存,但 Vec<T> 提供了一个完全安全的公共 API 供用户使用。

 

3. 如何安全地使用 unsafe

使用 unsafe 时,你必须确保你手动维护了编译器原本会检查的安全规则。
 
示例:一个安全的抽象
假设我们想实现一个函数,它接受一个指向整数的裸指针,并安全地解引用它。
 
rust
use std::os::raw::c_int;// 这是一个安全函数,因为它将不安全操作封装起来了
fn safe_deref(p: *const c_int) -> Option<c_int> {// 进入 unsafe 块执行不安全操作unsafe {// 前提条件:我们必须确保 p 是一个有效的、非空指针if p.is_null() {return None;}// 我们保证这个操作是安全的Some(*p) }// 离开 unsafe 块,我们返回的是一个安全的 Option<i32>
}fn main() {let x = 42;let ptr = &x as *const c_int; // 创建一个裸指针// 调用安全的封装函数let value = safe_deref(ptr);println!("解引用的值: {:?}", value);
}
Use code with caution.
在这个例子中:
  • unsafe 块内部包含了不安全的操作(解引用 *p)。
  • 我们在进入 unsafe 块之前和内部手动检查了指针有效性。
  • 最终提供给外部调用的 safe_deref 函数是完全安全的。
 
总结
unsafe 是 Rust 语言的一个关键组成部分,它提供了必要的灵活性来处理底层系统任务和 FFI。它不是“坏代码”的标志,而是安全抽象的基石。正确使用 unsafe 意味着承担起验证内存安全性的责任,并将其隐藏在安全的 API 之下。

参考资料:

1.不安全 Rust

2.避免写 unsafe 代码《Effective Rust 中文版》

3.rust语言基础

4.认识 Safe 与 Unsafe 《Rust 秘典(死灵书)》

5.unsafe 简介《Rust语言圣经(Rust Course)》

6.Rust 语言中文版unsafe 

7.rust FFI跨语言调用

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

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

相关文章

2025 年液化气泵厂家最新推荐榜,聚焦技术创新与质量保障的优质品牌深度解析无密封/磁力/倒罐/双端面机械密封/屏蔽/增压液化气泵公司推荐

引言 在石油化工、燃气、煤化工等关键领域的全球发展进程中,液化气泵作为输送低沸点易挥发性液体的核心设备,其性能与质量直接关系到企业生产的安全性、稳定性与效率。据国际流体机械协会(IFMA)2024 年度全球液化气…

完整教程:TouchDIVER Pro 触觉手套:Weart把火星岩石触感、手术操作感搬进 XR

完整教程:TouchDIVER Pro 触觉手套:Weart把火星岩石触感、手术操作感搬进 XR2025-11-27 17:34 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

【水印检查】字符串处理和矩阵的存入

暴力求解方法: 逐块检查; 关键:字符串处理;矩阵的存入和读取; 字符串处理: 基于< string >:(append)string cur = "";如果在字符串后面拼接上什么>东西:cur+="[str]";或者cur.app…

06.入门篇-AI编程助手

06.入门篇-AI编程助手6 AI编程助手 6.1 常见 AI 编程助手编程助手 公司 支持的IDE 地址 备注GitHub Copilot 微软+OpenAl VS Code、JetBrains、Visual Studio等 https://github.com/features/copilotAmazon Q 亚马逊 V…

高品质牛肉品牌推荐:安心之选,守护家庭餐桌

前言​ 牛肉作为优质蛋白质的重要来源,凭借丰富的营养与多元的烹饪方式,成为中国家庭餐桌的常客。随着消费升级,消费者对牛肉的需求已从 “吃” 转向 “吃口感、吃健康”,高品质、可溯源、安全健康成为核心诉求。​…

中药品牌十强排名彰显实力,好医生以完整产业链布局未来

在中医药蓬勃发展的大背景下,好医生集团作为中国医药行业的标杆企业,凭借其卓越的产品品质和持续的创新能力,在2025年中药品牌十强排名评选中展现出非凡实力。作为一家深耕中医药领域三十余年的现代化医药企业集团,…

2025年11月电线电缆最新推荐厂家,高压电缆、中压电缆、低压电缆、铜芯电缆、铝芯电缆、铝合金电缆多维度综合考量

当前电力工程、建筑施工、工业生产等场景对电线电缆的需求愈发精细化,传输稳定性、安全防护、场景适配等核心诉求不断升级,但市场上设备厂家资质良莠不齐,部分产品存在导电性能不达标、抗老化能力弱、售后响应滞后等…

从零部署网站客服系统:我踩过的域名和服务器坑,帮你省下几千块!

wx:llike620 gofly.v1kf.com 最近有朋友问我部署网站客服系统的事,让我想起自己第一次搭建时的迷茫。今天就把我的经验总结分享给大家,特别是关于域名和服务器的那点事儿——毕竟这是我当初最头疼的部分! 成本真的不…

U634637 Star way to heaven

像对偶图一样,转化成最小生成树问题(最小瓶颈生成树)。 稠密图求最小生成树使用 Prim 算法可以做到 \(O(m + n^2)\)。

【51单片机】【protues仿真】基于51单片机自动浇花强大的系统

【51单片机】【protues仿真】基于51单片机自动浇花强大的系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

2025 年不锈钢水管厂家最新推荐榜,深度剖析品牌技术实力与市场口碑的核心竞争力薄壁/沟槽/卫生级/环压/快装/316/卡压式不锈钢水管/不锈钢水管工程/不锈钢水管管件/不锈钢水管安装公司推荐

引言 在全球建筑与家装管道系统升级浪潮中,不锈钢水管因安全卫生、耐用性强等优势,成为行业主流选择之一,但市场品牌良莠不齐,给消费者与工程采购带来困扰。为筛选优质品牌,本次推荐榜参考了国际管道协会(IPCA)…

产学研融合!2025年中成药品牌排行榜10强好医生集团的创新引擎

在中成药产业迈向高质量发展的征程中,“中成药品牌排行榜10强”不仅是企业综合实力的硬核证明,更是承载中医药传承使命、守护大众健康的核心力量。这些品牌以“守正”锚定传统根基,以“创新”开拓发展新局,好医生药…

FrameWork4.5 项目下使用EF6 同一项目操作多种数据库

本贴用于记录 EF6不通过配置文件去获取连接字符串也可以成功一个项目同时访问多种数据库的情况 项目下包含 // Contexts/BaseDbContext.cs internal class BaseDbContext : DbContext { public BaseDbContext(string c…

微波烘干设备厂家技术实力与行业应用解析

微波烘干设备作为工业生产中高效节能的新型干燥设备,广泛应用于食品、医药、化工、农副产品等多个领域。其核心技术通过高频电磁波实现物料内外同时加热,具有烘干速度快、热效率高、物料均匀性好等特点,同时可集成微…

2025年定期排污扩容器生产商权威推荐榜单:电厂疏水扩容器/定连排疏水扩容器/定期排污疏水扩容器源头厂家精选

定期排污扩容器作为电站锅炉系统与工业锅炉装置中的关键辅机设备,其设计与制造质量直接关系到排污系统的安全、热能回收效率与环境保护合规性。随着电力行业节能要求的提升与工业锅炉系统环保标准的趋严,市场对高可靠…

2025 年最新推荐激光切管机厂家排行榜:聚焦高效高精度设备,助力企业提升金属管材加工品质高速 / 高精度 / 零尾料 / 免画图 / 全自动 / 三卡盘激光切管机公司推荐

引言 随着金属管材加工行业在全球范围内的快速发展,下游校具、体育器材、工程机械、五金家具等领域对管材切割的质量、精度与效率要求持续攀升。然而,市场上激光切管机品牌繁杂,设备性能差异显著,给企业选购带来极…

2025 年升降柱机芯厂家最新推荐榜,技术实力与市场口碑深度解析,筛选高性能可靠货源IP68 升降柱机芯 / 防撞升降柱机芯 / 低压升降柱机芯 / 液压升降柱机芯 / 路障机升降柱机芯公司推荐

引言 在安防与交通管理领域持续发展的背景下,升降柱机芯作为核心部件,其品质直接影响设备可靠性与防护效果。据国际安防设备协会(ISDA)2024 年度测评数据显示,全球升降柱机芯市场中,仅 38% 的产品同时满足 IP67 …

不只是制药!中药品牌排行榜10强好医生,用石榴谱写产业富民传奇

在中国中医药产业蓬勃发展的当下,好医生集团作为中药品牌排行榜10强企业,展现了传统医药现代化转型的典范力量。这家总部位于四川的医药企业历经三十余年发展,已成长为集研发、生产、销售于一体的全产业链现代化医药…

java 上转型对象调用

点击查看代码 class Base {public int id = 100;public void doSomething() {System.out.println("Base");} }public class Child extends Base {public int id = 101;@Overridepublic void doSomething() {…

比较好吸收的奶粉怎么选?这篇文章里有答案

在育儿路上,新手爸妈总有绕不开的“小烦恼”:宝宝喝完奶后频繁胀气哭闹,换尿布时总能遇上硬便,体重增长也比同龄宝宝慢半拍。这些看似寻常的表现,实则都指向同一个核心问题——消化吸收不畅。宝宝的肠胃功能尚未发…