对比C++,Rust在内存安全上做的努力
创作时间:
作者:
@小白创作中心
对比C++,Rust在内存安全上做的努力
引用
CSDN
1.
https://blog.csdn.net/qq_50764711/article/details/143872609
近年来,越来越多的组织建议在系统级开发语言选型时优先考虑Rust而非C/C++。谷歌数据显示,Android的安全漏洞从2019年的223个降低到2022年的85个,这一显著改善主要归功于Rust代码比例的增加。在Android 13中,已有约21%的新原生代码采用Rust开发。微软、AWS和Linux内核也相继引入Rust。那么,作为后来者的Rust是如何在内存安全方面取得如此显著成效的呢?
悬空指针
悬空指针是C/C++中常见的内存安全问题之一。当一个对象被释放后,如果还有指针指向该对象并尝试解引用,就会导致未定义行为。
在C++中,这种情况可能如下所示:
int main()
{
std::string *ptr = nullptr;
{
std::string str;
ptr = &str;
}
printf("%s", ptr->c_str());
return 0;
}
而在Rust中,编译器会通过生命周期检查来避免这类问题:
fn main()
{
let str_ref;
{
let str_obj: String = String::new();
str_ref = &str_obj;
}
println!("{str_ref }");
}
尝试编译上述Rust代码时,编译器会报错,指出str_ref的生命周期超过了str_obj的生命周期:
缓冲区溢出
在C++中,使用原生数组进行索引操作时,如果没有边界检查,很容易导致缓冲区溢出。而在Rust中,即使是切片(对连续数据的引用),也会携带长度信息,从而在运行时检测到缓冲区溢出:
fn main() {
let vec: Vec<i32> = vec![1,2,3];
let vec_ref: &[i32] = &vec[0 ..];
for i in 0 .. 4 {
println!("{}", vec_ref[i]);
}
}
运行上述代码时,Rust会抛出panic,明确指出缓冲区溢出:
thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 3', src/main.rs:7:17
对空指针进行解引用
在C/C++中,对空指针进行解引用会导致程序崩溃。而在Rust中,通过强制要求引用在使用前必须被赋值,以及使用Option类型来处理可能为空的情况,可以有效避免这类问题:
fn main() {
let s: String = String::new();
let s_ref: &String = &s;
}
对于可能为空的场景,Rust推荐使用Option类型:
fn main() {
let mut s_ref_option: Option<&String> = None;
let s: String = String::new();
s_ref_option = Some(&s);
}
非法释放内存
在C/C++中,非法释放内存(如double free)会导致程序崩溃。而在Rust中,通过RAII(资源获取即初始化)机制,开发者几乎不需要手动管理内存:
pub trait Drop {
// Required method
fn drop(&mut self);
}
总结
Rust通过一系列创新机制,在内存安全方面取得了显著成效,得到了越来越多组织的认可。将其纳入技术栈,无疑是一个明智的选择。
热门推荐
【健康科普】中风病不要怕,改变生活习惯是关键!
蚝油生菜:生菜的美味吃法与营养价值
PD协议过程详解:从物理连接到智能管理的全面剖析
四十五年手机发展简史
单招是什么意思?单招简介
最新研究:神经系统症状不是大脑感染SARS-CoV-2的直接结果
新豆子研磨度怎么调?从意式到手冲全解析!
DIY高性能主机:个性化装机从硬件选择到全程攻略
成为中国·曲阜孔庙|它为何被称为中国儒家文化的核心标志?
哪种运动适合你?强度频次如何控制?科学健身这些要注意
东方Project游戏,探究其独特魅力与深度内涵
震撼!《长征》手稿竟然是毛泽东狂草的巅峰之作!
颈动脉瘤的早期症状及处理方法
六大维度全面提升工作绩效与品质
如何通过手机查询燃气余额
深究AI时代育儿新观:DeepSeek的崛起与孩子竞争力的培养
“捐钱”反而能多赚?美国顶级富豪是怎么避税的?
校园欺凌的六点危害及应对策略
贵州铜仁旅游景点推荐,贵州铜仁旅游攻略
全面指南:教你选择适合自己的高性价比运动手表
20年随访研究发现:抬头纹越多越深,心血管疾病死亡率越高
香港凤凰楼、向南楼和顶楼的风水指南与租房建议
宣布接入DeepSeek,股价涨停,A股“旧王”有的看了?
OpenWrt带宽管理实战:nlbwmon工具的安装与配置详解
古希腊神话的特点是什么(深度解析古希腊神话的文学性的意义)
《绝区零》与《鬼泣5》的比较引发热议,动作游戏的困境在这
“不粘锅”有毒且致癌?涂层刮花后还能用吗?很多人都被蒙在鼓里
听劝!别急着更新iOS 18,这类iPhone用户不建议升级!
云中谁寄锦书来?
第六套中小学生眼保健操图解