对比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通过一系列创新机制,在内存安全方面取得了显著成效,得到了越来越多组织的认可。将其纳入技术栈,无疑是一个明智的选择。
热门推荐
生成式AI助力城市规划,但仍面临成本与数据偏见挑战
真空机使用指南:6个步骤轻松掌握包装技巧
人民币汇率形成机制:市场化改革下的金融稳定之道
《说文解字》第769课:细说“冓”字,是“相遇”还是“架木材”
淮河能源重组,投资者如何应对?
宁波汤圆与慈城年糕:冬日里的传统美味
远程特权访问管理:企业网络安全的守护者
“遗物三不留,留下害子孙”,老人去世后,这三样遗物需谨慎处理
血竭:孕妇禁用的活血化瘀中药
中芯国际Q3营收首破20亿美元,AI需求驱动业绩创新高
如何计算房产置换的价值以优化资产配置?这些计算方法如何影响你的财务规划?
厨房水槽堵了?8个小妙招让你秒变疏通达人
探访西昌建昌古城:600年历史的秘密
从细菌到智人:生物进化关键阶段全解析
手球运动规则详解:7人制比赛从入门到欣赏
扬州瘦西湖:乾隆六巡必游,五亭桥白塔见证千年风韵
稻盛和夫的“利他之心”如何拯救日航?
沙海之中漾碧波——探秘世界遗产巴丹吉林沙漠—沙山湖泊群
10部寒假必看的高质量动画片,带孩子一起看!
家庭聚会:如何向家人表达感谢?
冬季滋补猪骨汤的最佳搭配
研究证实:运城盐湖温泉对皮肤病确有效果
京剧脸谱:用色彩线条勾勒人物性格的东方艺术
中国彩票年销千亿跻身全球第一,福利体彩双轮驱动
郑州周末晴朗,最佳出游时机!
猫砂选购指南:六种主流产品特点与适用场景
电动车驾考新规来了!年龄放宽、流程简化,这些变化与你息息相关
电动车新规下,你真的懂怎么骑了吗?
复印机缩印技巧:轻松将A3纸张缩印成A4大小
除草剂使用三大技巧:打小不打大、打早不打晚、打湿不打干