Rust 遇上 C/C++ (一):数组操作

用户头像
Coding Fatty
关注
发布于: 2020 年 05 月 24 日
Rust 遇上 C/C++ (一):数组操作

Rust 第一个稳定版本于 2015 年发布,与上世纪 80 年代左右诞生的 C/C++ 相比,可谓是后起之秀。



同样作为系统级编程语言,Rust 的设计准则为安全、速度和并发。当然,C/C++ 可能对此表示不服!



那么当 Rust 遇上 C/C++ 会在哪些方面进行讨论呢?我们先从数组操作谈起。

环境:Cent OS 8(Kernel 4.18.0),gcc 8.3.1,g++ 8.3.1,rustc 1.43.1。

C

#include <stdio.h>
int main() {
int a[] = {1, 2, 3, 4, 5};
int index = 10;
int element = a[index];
printf("The value of element is: %d\n", element);
return 0;
}



$ gcc main.c
$ ./a.out
The value of element is: -721516429



编译没有产生任何错误,程序正常运行,“成功”访问了无效的内存 a[10]。

C++

#include <iostream>
using namespace std;
int main() {
int a[] = {1, 2, 3, 4, 5};
int index = 10;
int element = a[index];
cout << "The value of element is: " << element << endl;
return 0;
}



$ g++ main.cc
$ ./a.out
The value of element is: 1914456179



同样,编译没有产生任何错误,程序正常运行并访问了无效的内存 a[10]。

Rust

fn main() {
let a = [1, 2, 3, 4, 5];
let index = 10;
let element = a[index];
println!("The value of element is: {}", element);
}



$ rustc main.rs
$ ./main
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', main.rs:5:19
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace



编译没有产生任何错误,但程序导致运行时错误并没有成功退出。



当我们尝试使用索引访问一个元素时,Rust 将检查您指定的索引是否小于数组长度。如果索引大于或等于数组长度,Rust 将陷入 Panic。

总结

当提供不正确的索引时,C/C++ 可以访问无效的内存。



Rust通过立即退出而不是允许内存访问,从而避免这种错误。大家是否觉得这样更安全呢?

Rust 由于提供了额外安全保证,可能会降低一些性能。

哪有什么岁月静好,都是有人替你负重前行!



当然,如果 C/C++ 的使用者足够细心,自己能提供安全保证的话,是同样可以避免错误的。

发布于: 2020 年 05 月 24 日 阅读数: 949
用户头像

Coding Fatty

关注

怀揣技术信仰,不忘初心前行。 2018.11.12 加入

即将步入工作的应届毕业生 协议栈开发工程师 喜爱C/C++,Rust,Linux Kernel

评论 (6 条评论)

发布
用户头像
好久之前就想学Rust,终于遇到这么好的学习资料,跟大神一起学习。
2020 年 05 月 27 日 14:47
回复
收获一枚小粉丝,好开心。
2020 年 05 月 28 日 23:44
回复
用户头像
牛逼
2020 年 05 月 25 日 15:00
回复
用户头像
赞👍
2020 年 05 月 25 日 14:46
回复
用户头像
感谢分享,期待这个系列。InfoQ首页推荐。
2020 年 05 月 25 日 09:16
回复
用户头像
2020 年 05 月 25 日 09:12
回复
没有更多了
Rust 遇上 C/C++ (一):数组操作