对比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通过一系列创新机制,在内存安全方面取得了显著成效,得到了越来越多组织的认可。将其纳入技术栈,无疑是一个明智的选择。
热门推荐
GraphRAG与传统RAG的深度对比及主流项目分析
关于英寸与厘米换算的重要性及其实际应用的探讨
蛋壳颜色和鸡蛋的营养价值有关系吗?
谷丙转氨酶与谷草转氨酶,哪个升高更危险?该怎样降下来 ...
【老年心理】工作记忆与认知老化
锁骨骨折、肩锁关节脱位术后护理指南
如何制定有效的员工工资薪酬方案?企业信息化视角下的实践指南
车辆抵押贷款全面解析:如何轻松借款,快速获取资金
蜂蜜的保质期一般是多少
猫绦虫病:症状、诊断与防治全攻略
确认早孕的四种方法:从验孕棒到B超检查
进行期货交易的合适时机是什么?怎样判断这个时机?
浅析现代企业数字化转型的策略与实践
万万没想到,地毯这样铺,家里想不美都难
家庭影院音响配置解析:5.1、7.1还是杜比全景声?
第三代社保卡怎样开通交通卡?三代社保卡乘公交教程
5600G可以装Win11吗?详解安装步骤与系统兼容性分析
《哪吒2》带给我们哪些教育启示?
粽韵艾香 端午安康
零件工程图的设计规范:机械工程师必备的专业指南
华为服务器安装Windows系统
甲醛释放量气候箱法临界值分析的最佳实践方法
莲花山公园有哪些景物?莲花山公园寻宝:探索不容错过的美景!
睡眠障碍最常见的疾病类型有哪些
洪秀全:太平天国运动的领袖
拍摄高山滑雪的器材设置与技巧
血凝块长什么样
FFKM O 形圈材料是什么?特性、应用和优点说明
《无尽空虚》:一首关于存在与虚无的哲学之歌
花费千亿打造的重装合成旅战力有多强?治愈陆军火力不足“恐惧症”