当前位置: 首页 > news >正文

RUST编程学习-碎片2-Unsafe

目录

前言

一、Unsafe的来源

二、Unsafe功能

1.Unsafe Rust 新增了两种称为原始指针的类型

2.相关应用

总结

前言

在工作中遇到了unsafe相关的知识,被导师问住了,明明之前也看过学过,在项目中却没有对这个概念的敏感度,对应的内容也比较模糊,所以特此整理一篇相关的内容记录记录,和大家一起深入学习……

一、Unsafe的来源

unsafe是 Rust 语言中的一个关键字,用于标记那些编译器无法自动验证内存安全的代码块。

Unsafe Rust 存在的原因在于,静态分析本质上是保守的。当编译器试图判断代码是否能保证这些保证,拒绝一些有效的程序总比接受一些无效的好 节目。虽然代码可能还行,但如果Rust编译器没有足够多的信息让人有信心,它会拒绝该代码。在这些情况下,你可以用不安全的代码告诉编译器:“相信我,我知道我是什么 正在做。”不过要注意,使用不安全的Rust要自行承担风险:如果你错误使用不安全的代码,可能因内存不安全而出现问题,例如空指针解调。

Rust 另一个不安全的另一个原因是底层计算机 硬件本质上是不安全的。如果Rust不让你做不安全的操作,你做不了某些任务。Rust需要允许你做低级系统 编程,比如直接与操作系统交互,甚至 自己编写操作系统。低级系统编程工作 是该语言的目标之一。让我们来探讨一下对不安全能做些什么 Rust及其操作方法。

二、Unsafe功能

可以通过 unsafe 关键字来切换到不安全 Rust,接着可以开启一个新的存放不安全代码的块。这里有五类可以在不安全 Rust 中进行而不能用于安全 Rust 的操作,它们称之为 “不安全的超能力。” 这些超能力是:

1.解引用裸指针
2.调用不安全的函数或方法
3.访问或修改可变静态变量
4.实现不安全 trait
5.访问 union 的字段

1.Unsafe Rust 新增了两种称为原始指针的类型

不安全 Rust 有两个被称为裸指针raw pointers)的类似于引用的新类型。和引用一样,裸指针是不可变或可变的,分别写作*const T*mut T。这里的星号不是解引用运算符;它是类型名称的一部分。在裸指针的上下文中,不可变意味着指针解引用之后不能直接赋值。

从引用同时创建不可变和可变裸指针

fn main() { let mut num = 5; let r1 = &num as *const i32; let r2 = &mut num as *mut i32; }

可以在安全代码中创建裸指针,不过不能解引用裸指针和读取其指向的数据。现在我们要做的就是对裸指针使用解引用运算符*,这需要一个unsafe

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); } }

2.相关应用

使用extern函数调用外部代码

Rust 代码可能需要与其他语言编写的代码交互。为此 Rust 有一个关键字,extern,有助于创建和使用外部函数接口Foreign Function Interface, FFI)。外部函数接口是一个编程语言用以定义函数的方式,其允许不同(外部)编程语言调用这些函数。

下面展示了如何集成 C 标准库中的abs函数。extern块中声明的函数在 Rust 代码中总是不安全的。因为其他语言不会强制执行 Rust 的规则且 Rust 无法检查它们,所以确保其安全是开发者的责任:

文件名: src/main.rs

extern "C" { fn abs(input: i32) -> i32; } fn main() { unsafe { println!("Absolute value of -3 according to C: {}", abs(-3)); } }

来源:不安全的 Rust - Rust 程序设计语言 中文版


总结

在这个过程中,查阅的资料有限,需要再结合资料进行相关的学习,随时进行知识迭代更新……

http://www.jsqmd.com/news/1185486/

相关文章:

  • 2026 年通辽优秀的叉车出租订做厂家哪家强,别再自己买!效率翻倍的秘密工具解析 - 企业官方推荐【认证】
  • 【Unity3D】TrailRenderer进阶:从导弹尾焰到武器挥砍的实战特效
  • 基于YOLOv8的道路坑洼检测系统:从模型训练到PyQT5界面开发全流程
  • C++ HTTP客户端库cpr:现代化网络请求的实践指南
  • Windows平台微信QQ防撤回工具RevokeMsgPatcher原理与实战指南
  • 【项目编号:project05966】SpringBoot/Vue 电影推荐系统:用户端推荐、电影资讯与后台数据管理全流程
  • Unity URP性能优化:SRP Batcher原理、配置与实战指南
  • 反应式Agent在智能控制系统中的设计与优化
  • UE5 RPG技能系统开发:从蓝图到C++的Gameplay Ability System实战指南
  • STM32与A3908驱动的高精度运动控制系统设计
  • C语言模块管理器设计与实现:从编译原理到工程实践
  • Unity 2D游戏开发入门:从基础到实战
  • C++集成学习实战:从原理到工程,掌握Bagging、Boosting与Stacking
  • LLM注意力可视化在医疗诊断中的实践与应用
  • postman 接口自动化
  • 如何解决Kimi到word的格式问题?AI 导出鸭把Markdown/LaTeX编译成docx的技术拆解
  • 【2013-11-27】《Java编程思想》读书笔记:synchronized
  • stable-diffusion.cpp:纯C/C++实现AI绘画推理,打造轻量高效的生成式AI运行时
  • 表格 deepseek 工具哪个好用无需纠结,AI 导出鸭适配全场景表格导出
  • Unity 2022.3中Spine动画导入失败排查与版本兼容性解决方案
  • 2026年版中国地下运矿车市场发展战略规划及投资方向研究报告
  • Cursor多文件上下文协同失效?97%开发者忽略的context.windowSize阈值与动态裁剪策略
  • ArduSub入门指南:水下ROV运动控制原理与实战调参
  • C++26契约编程正式入标:用前置后置条件将防御式检查从文档变成编译器强制行为
  • Windows网络管理利器:Net命令实战指南与场景解析
  • 元初混沌 6G 全域通感一体化体系架构 第一卷二阶第二十五篇 三才组网体系闭环总结
  • 从哈尔到D20:多贝西小波(DB小波函数)的演进与工程选型指南
  • 【目标检测--tricks】FPN与PAN:从结构演进到实战融合
  • Windows C盘清理终极指南:从原理到实践的完整解决方案
  • springboot2.7.16到3.5.16,srpingcloud2021.0.1->2025.0.3,jdk1.8->17,升级记录一(从踩屎坑到上岸的辛酸历程)