Categories
程式開發

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


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

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

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

环境:Cent OS 8,gcc,g++,cargo。

C

#include

int main() {
int a[] = {1, 2, 3, 4, 5};
int index = 10;

int element = a[index];

printf("The value of element is: %dn", element);

return 0;
}

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

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

C++

#include

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);
}

$ cargo run
Compiling varibles v0.1.0 (/home/ervin/rust)
Finished dev [unoptimized + debuginfo] target(s) in 0.19s
Running `target/debug/varibles`
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/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++ 的使用者足够细心,自己能提供安全保证的话,是同样可以避免错误的。