对比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通过一系列创新机制,在内存安全方面取得了显著成效,得到了越来越多组织的认可。将其纳入技术栈,无疑是一个明智的选择。
热门推荐
如何与指责型人格共舞
【中草药科普】每天认识一味中草药-鸡骨草
各省份户籍人口和常住人口最新数据:全国户籍人口比常住人口多669万人
签订农民土地流转合同的法律要点与注意事项
睡眠可以补充气血吗?医生的专业解答
冷冻海参处理全攻略:7个步骤+2个注意事项,让美味海参触手可得
农村土地流转需要什么证件
18F-FAPI-04 PET/CT对同步放化疗食管鳞癌患者的疗效预测研究
存量房、公租房、集资房买卖合同效力全解析
国内八位知名电视剧导演作品大盘点:风格各异,精彩纷呈!
举报在编老师补课证据的法律规定与实务操作
刑事诉讼有哪些证据规则
转动未来:电机控制技术的智能化革命
74HC138使用说明
什么是空调?空调的工作原理和空调机组用途、类型介绍
对方没保险可以申请代位追偿么
电脑键盘布置的原因和优化
PS图像精修完全指南:从修复到美白的全方位教程
彻底搞懂“电气五防”:从概念到高压开关柜实现方案详解
国际货运代理如何在数字时代找到新的方向?
冷饭热量揭秘:减肥利器还是健康隐患?
高血压患者可以喝黄芪泡水吗?需要注意这些事项
商密解决方案及业务场景阐述
猪肘子怎么做好吃?五种经典做法让你的味蕾起舞
什么是客户生命周期价值(CLV)?
情侣出租房查看五要素,确保舒适安全居住
一年十二个月份,每个月各开什么花,你知道吗?
如何判断自己有没有双相情感障碍?
新兴学科交叉法律问题研究:现状、意义与路径
猫草的水培方法(用水培养猫草)