对比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通过一系列创新机制,在内存安全方面取得了显著成效,得到了越来越多组织的认可。将其纳入技术栈,无疑是一个明智的选择。
热门推荐
一文说清:E-CVT变速箱,到底好不好?
10个免费虚拟手机号网站
往返300公里,耗时4个多小时……京津定制快巴“攒(cuán)线人”的双城生活
道教与佛教对话两大宗教在信仰中的交汇点
如何在平面设计行业中脱颖而出
面相学的两面性:科学探究与迷信争议
银行的银行卡密码重置的方法途径有哪些?
漫威《女巫阿加莎》:深度解析剧情与角色发展谜团
如何激励团队完成目标
肠息肉有必要做手术吗?能治好吗?
资产剥离意味着什么?资产剥离有何影响?
云南米线江湖,哪碗戳中了你的乡愁?
致总是在意他人评价的你:学会课题分离,才能活出真正的自我
167个好看的书籍封面,2024年最佳书籍封面设计出炉了!
房间好热怎么办?如何有效降低室内温度?
电脑关机后风扇还在转是什么原因 这个方法可以解决
伪代码是编程语言中的什么
重视戊型肝炎监测和防控
为你的狗狗打疫苗,五大注意事项(宠物犬疫苗接种的关键步骤和要注意的事项)
全干货!铃兰入坑必看指南(购买、栽种、养护、繁殖)
虚拟货币技术分析入门:从K线图到趋势线的全面解析
协作开发如何把代码整合
你会打麻将吗?揭秘麻将背后的数学原理
中考现代文阅读概括型考点答题指导
abb式拟声词词语大全
去中心化应用程序(DApps),读完这篇就够了!
急性失血后机体如何调节
如何感谢团队成员的努力
12个实用技巧,让你的书桌瞬间整洁有序
美国学校如何注重实践教育的探索