rust 安全性
Rust 是 静态类型(statically typed) 语言, 也就是说在编译时就必须知道所有变量的类型, 这一点将贯穿整个章节。
C/C++的安全问题
-
内存的不正确访问引发的内存安全问题
-
由于多个变量指向同一块内存区域导致的数据一致性问题
-
由于变量在多个线程中传递,导致的数据竞争的问题,由第一个问题引发的内存安全问题一般有 5 个典型情况:
- 使用未初始化的内存
- 对空指针解引用
- 悬垂指针(使用已经被释放的内存)
- 缓冲区溢出
- 非法释放内存(释放未分配的指针或重复释放指针)
Rust 解决以上问题的方法
| 编号 | 问题 | 方案 |
|---|---|---|
| 1 | 使用未初始化的内存 | 编译器禁止变量读取未赋值变量 |
| 2 | 对空指针解引用 | 使用 Option 枚举替代空指针 |
| 3 | 悬垂指针 | 生命周期标识与编译器检查 |
| 4 | 缓冲区溢出 | 编译器检查,拒绝超越缓冲区边界的数据访问 |
| 5 | 非法释放内存 | 语言级的 RAII 机制,只有唯一的所有者才有权释放内存(引用不能释放借用的变量内存) |
| 6 | 多个变量修改同一块内存区域 | 允多个变量借用所有权,但是同一时间只允许一个可变借用 |
| 7 | 变量在多个线程中传递时的安全问题 | 对基本数据类型用 Sync 和 Send 两个 Trait 标识其线程安全特性,即能否转移所有权或传递可变借用,把这作为基本事实。再利用泛型限定语法和 Trait impl 语法描述出类型线程安全的规则。编译期间使用类似规则引擎的机制,基于基本事实和预定义规则为用户代码中的跨线程数据传递做推理检查 |
安全措施
所有权转移
避免大块内存的拷贝,直接通过所有权转移即可避免全量数据的拷贝,提高效率。
变量的不可变性
一旦绑定就不能修改,需要显示的重新绑定新的变量。
let a = 8;
类型的显示转换
在操作的过程中不能进行隐式转换,避免编程时隐式转换到导致的问题;
// u32 和 f64 相加会编译报错
let sum = 3 + 3.1;// 使用 u8 类型做简单判断是编译报错
let number: u8 = 3;
if number { // 可以改为 if number != 0println!("number was three");
}
严格的数值溢出检查
计算时提供严格的数值溢出检查,会直接在编译时就会报错而不是在执行的过程中发现问题。
// 编译时直接报错
let a_u8: u8 = 254;
let b = a_u8 + 20;
严格的静态数组越界检查
在编译时会检查数组是否越界,如果越界则会直接报错。
let arry = [1, 2, 3];
println!("a1: {}, a2: {}, a3: {}", arry[0], arry[1], arry[2]);
// 编译时直接报错
println!("a3: {}", arry[3]);
结构体全员初始化
结构体初始化时必须要初始化所有成员,防止出现未初始化使用问题。
struct User { // 定义结构体类型,注意类型之后不带 ;age: u8,height: f32,name: String,email: String,}let user4 = User {// 结构体初始化,每个字段都需要进行初始化age: 18,height: 180.3,name: String::from("Tom"),email:String::from("Tom@qq.com"),};
字符串内存的自动释放
可变字符串在创建时是申请堆内存进行创建的,在离开作用域时会自动调用drop() 函数进行内存释放,从而实现自动的内存释放.
{let s = String::from("你好A");for i in s.chars() { // 以Unicode 编码遍历字符串println!("{}", i);}println!();
}// s 绑定的字符串在离开作用域时会自动调用drop() 函数进行内存释放
支持 Option 类型
支持Option,可以有效的检查到 None 情况,例如动态数组中数组越界问题,通过语法的强制性解决潜在问题。
let v = vec![1, 2, 3, 4, 5];// 执行时会出现问题
let does_not_exist = &v[100];
// 执行是
let does_not_exist = v.get(100);
match v.get(does_not_exist) {Some(x) => // TODO:,None => // 为None 情况:TODO
}
同一作用域内引用的强制管理
不允许同一作用域中在使用可变引用后再使用不可变引用,防止出现可变引用修改了内存,再次使用不可变引用时导致问题。
let mut v = vec![1, 2, 3, 4, 5];
let first = &v[0]; // 不可变引用
v.push(6); // 可变引用
println!("The first element is: {}", first);// 在同一作用域内在使用可变引用后不允许再使用不可变引用
可变借用只能一次
同一个变量的可变借用只能有一个,防止多个引用修改变量导致出现一致性问题。
let mut v = 10;
let x = &v; // 不可变引用可以存在多个
let mut a = &v; // 可变引用
// let mut b = &v; // 出现错误,变量可变引用只能的存在一个
*a = 12
生命周期
生命周期的存在解决C/C++中函数可能返回局部指针导致野指针的问题。
struct V{v:i32
}
fn bad_fn() -> &V{ //编译错误:期望一个命名的生命周期参数,因为返回了一个悬垂指针let a = V{v:10};&a
} let res = bad_fn();
const fn 编译时计算
const fn 支持在编译时将函数的结果结算出来,提高编译效率。
const fn add(a: usize, b: usize) -> usize {a + b}const RESULT: usize = add(5, 10); // 在编译时就已经计算出值为15,而不需在运行时计算println!("The result is: {}", RESULT);
🌀路西法 的个人博客拥有更多美文等你来读。
相关文章:
rust 安全性
Rust 是 静态类型(statically typed) 语言, 也就是说在编译时就必须知道所有变量的类型, 这一点将贯穿整个章节。 C/C的安全问题 内存的不正确访问引发的内存安全问题 由于多个变量指向同一块内存区域导致的数据一致性问题 由于…...
大模型驱动的围术期质控系统全面解析与应用探索
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 研究创新点 二、大模型技术与围术期管理概述 2.1 大模型技术原理与发展现状 2.2 围术期管理流程与挑战 三、大模型在术前的应用 3.1 病历内涵质控 3.2 智能医学问答与知识查询 3.3 疾病风险预测与评估 3.…...
中兴B863AV3.2-T/B863AV3.1-T2/B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包
中兴B863AV3.2-T/B863AV3.1-T2/B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包 B863AV3.2-T B863AV3.1-T2 已知可通刷贵州、江苏、贵州、北京、河南、陕西等省份。 线刷方法:(新手参考借鉴一下) 1、准备好一…...
Android Binder机制
Binder是IPC(进程间通信)的一种机制,它允许不同的应用或系统服务在不同的进程中安全地交换数据。Binder的核心原理是基于客户端-服务器模型(C/S架构)。 一、Binder的定义 1. Binder是Android中的一个类,它继承了IBind…...
【算法】初等数论
初等数论 模 取余,遵循尽可能让商向0靠近的原则,结果的正负和左操作数相同 取模,遵循尽可能让商向负无穷靠近的原则,结果的正负和右操作数相同 7/(-3)-2.3,产生了两个商-2和-3,取…...
Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统
前言 在生成式AI技术蓬勃发展的今天,大语言模型已成为企业智能化转型和个人效率提升的核心驱动力。作为国产大模型的优秀代表,DeepSeek凭借其卓越的中文语义理解能力和开发者友好的API生态,正在成为构建本土化AI应用的首选平台。 本文将以S…...
Spring事务原理 二
在上一篇博文《Spring事务原理 一》中,我们熟悉了Spring声明式事务的AOP原理,以及事务执行的大体流程。 本文中,介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中,我们将结合案例,来讲解实战中有关事务的易…...
JVM预热
阿里电商平台每年的各种大促活动,对于Java技术来说,其中重要一个操作环节就是预热操作。 目录 预热是什么?为什么要预热? java 程序不预热和预热的调用对比 预热是什么? 预热是指,在 JVM 启动后࿰…...
基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强,医院就诊量逐年增加。传统的现场…...
DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发
Spring Boot 实现 DeepSeek API 调用 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…...
easelog(1)基础C++日志功能实现
EaseLog(1)基础C日志功能实现 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 注:本简易日志组件代码实现参考了Google …...
epoll_event的概念和使用案例
epoll_event 是 Linux 下 epoll I/O 多路复用机制的核心数据结构,用于描述文件描述符(File Descriptor, FD)上发生的事件及其关联的用户数据。通过 epoll,可以高效地监控多个文件描述符的状态变化(如可读、可写、错误等…...
Leetcode2506:统计相似字符串对的数目
题目描述: 给你一个下标从 0 开始的字符串数组 words 。 如果两个字符串由相同的字符组成,则认为这两个字符串 相似 。 例如,"abca" 和 "cba" 相似,因为它们都由字符 a、b、c 组成。然而,"…...
蓝桥月赛 之 26场
文章目录 好汤圆灯笼猜谜元宵分配摆放汤圆 好汤圆 好汤圆 思路分析:由于2025能够被15整除,所以我们直接输出对应的答案即可 import os import sys# 请在此输入您的代码print(2025//15)灯笼猜谜 灯笼猜谜 思路分析:首先呢,我就考…...
机器学习面试八股文——决战金三银四
大家好,这里是好评笔记,公主 号:Goodnote,专栏文章私信限时Free。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。 公主号合集地址 点击进入优惠地…...
umi: valtio的使用
一、基本用法 import { proxy, useSnapshot } from umijs/max;// 1、定义数据 const state proxy({ count: 33 });export default () > {// 2、使用数据const snap useSnapshot(state);function increaseCount() {state.count 1;}return (<><h1>{snap.count}…...
区块链相关方法-波特五力分析模型
一、定义:波特五力分析模型(Porters Five Forces Framework)是迈克尔・波特(Michael Porter)于 1979 年提出的一种用于分析行业竞争态势的工具。它通过考察五种力量的相互作用来评估一个行业的吸引力和竞争环境,这五种…...
纷析云开源版- Vue2-增加字典存储到localStorage
main.js //保存字典数据到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夹里面 // 获取字典数据 export function getDictByType(dictType) {const dicts JSON.par…...
HTML项目一键打包工具:HTML2EXE 最新版
HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件,直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 一、功能特点 类别序号功能标题1支持程序图标自定义(支持…...
Windows 中的启动项如何打开?管理电脑启动程序的三种方法
在日常使用电脑时,我们经常会发现一些应用程序在开机时自动启动,这不仅会拖慢系统的启动速度,还可能占用不必要的系统资源。幸运的是,通过几个简单的步骤,你可以轻松管理这些开机自启的应用程序。接下来,我…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
