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

rust学习-不安全操作

在 Rust 中,不安全代码块用于避开编译器的保护策略

四种不安全操作

  • 解引用裸指针
  • 通过 FFI (Foreign Function Interface,外部语言函数接口)调用函数
  • 调用不安全的函数
  • 内联汇编(inline assembly)

解引用裸指针

原始指针(raw pointer,裸指针)* 和引用 &T 有类似的功能
引用总是安全的,因为借用检查器保证了它指向一个有效的数据
解引用不安全,一个裸指针只能通过不安全代码块执行

fn main() {let raw_p: *const u32 = &10;unsafe {assert!(*raw_p == 10);}
}

调用不安全函数

使用了 Rust 的 unsafe 特性
从原生指针中创建 slice 是不安全的,需要手动来确保指针和长度的正确性

use std::slice;fn main() {// 定义一个包含四个元素的 Vectorlet some_vector = vec![1, 2, 3, 4];// 获取指向 Vector 对象的原始指针和长度let pointer = some_vector.as_ptr();let length = some_vector.len();// 不安全操作,使用unsafe块unsafe {// 通过原始指针和长度创建一个 u32 类型的不可变 slicelet my_slice: &[u32] = slice::from_raw_parts(pointer, length);// 使用 assert_eq! 宏进行断言,比较 Vector 和转换后的 slice 是否相等assert_eq!(some_vector.as_slice(), my_slice);}
}

附录

切片

&[u32] 是一个不可变的切片类型,也称为引用切片(slice reference)
用于表示一个基于某个 u32 类型的数组或向量的引用部分
它由一个指向数据的指针和一个长度值组成
指针指向数组或向量中第一个元素的地址
长度则表示这个切片包含的元素数目
常用于接收函数的参数/返回函数的结果

// 将数组或者向量转为slice切片
fn fn_name(slice: &[u32]) -> u32 {let mut sum = 0;for i in 0..slice.len() {sum += slice[i];}sum
}fn main() {let array = [1
http://www.lryc.cn/news/142533.html

相关文章:

  • RHCE——八、DNS域名解析服务器
  • flink cdc初始全量速度很慢原因和优化点
  • 论文笔记: MOGRIFIER LSTM
  • Angular中使用drag and drop实现文件拖拽上传,及flask后端接收
  • Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务
  • 配置Flink
  • 39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页
  • 【图论】缩点的综合应用(一)
  • C++—纯虚函数
  • 经过卷积神经网络之后的图片的尺寸如何计算
  • Java升级JDK17(更高版本同理),修改maven
  • Go测试之.golden 文件
  • 回归预测 | MATLAB实现GA-RF遗传算法优化随机森林算法多输入单输出回归预测(多指标,多图)
  • springboot整合rabbitmq死信队列
  • 高中信息技术教资考试模拟卷(22下)
  • Linux中shadow及passwd格式内容解析
  • 计算机视觉 – Computer Vision | CV
  • 2.Redis 通用命令
  • 【学习FreeRTOS】第18章——FreeRTOS软件定时器
  • C++--两个数组的dp问题(2)
  • 利用人工智能彻底改变库存管理:综合指南
  • 连接器信号完整性仿真教程 七
  • Wireshark数据抓包分析之UDP协议
  • Java小游戏
  • 服务器Linux系统配置mysql数据库主从自动备份
  • Java通过PowerMockito和Mokito进行单元测试
  • 数字化技术无限延伸,VR全景点亮智慧生活
  • 抖音艺术签名小程序源码/艺术签名设计小程序源码/字节跳动小程序开发
  • 养号自动化,指纹浏览器和RPA机器人解除烦恼
  • ES6中promise的使用