Rust:一个不再有 C/C+的,实现安全实时软件的未来( 八 )

这里使用 lambda 的方式很大程度上导致了这种危险的发生。编译器在调用时只能看到以一个函数指针,它并不能像标准函数那样检查 lambda。

结合上下文来理解这个 bug 的话,最初使用 shared_ptr 来存储数据,这一部分没有问题。然而我们却错误地将数据存储在了 unique_ptr 里,当我们试图进行更改时就会有问题,它并没有引起注意是因为编译器并没有报错。

这是 C++ 内存安全问题并没有引起重视的真实例子,作者和审核代码的人直到一次测试前都没有注意到这点。不管你有多少年的编程经验,这类 bug 根本躲不开!哪怕是编译器都不能拯救你。这时就需要更好的工具了,不仅仅是为了我们的理智着想,也是为了公众安全,这关乎职业道德。

接下来让我们看一看同样问题在 Rust 中的体现。

在 Rust 中,这种糟糕的 move() 是不会被允许的。

这是我们第一次看到 Rust 的代码。需要注意的是,默认情况下变量都是不可变的,但可以在变量前加 mut 关键词使其可变,mut 类似于 C/C++ 中的 const 的反义词。

推荐阅读