第 22 章 不安全代码(2)
吉姆•布兰迪
22.6 未定义行为
如本章开头所述,术语未定义行为的意思是“Rust 坚定地认为你的代码永远不会出现的行为”。这是一个奇怪的措辞,特别是因为我们从使用其他语言的经验中就能知道这些行为确实会以某种频率偶然发生。为什么这个概念对厘清不安全代码的责任有帮助?
编译器是从一种编程语言到另一种编程语言的翻译器。Rust 编译器是将 Rust 程序翻译成等效的机器语言的程序。但是,说“两个使用完全不同语言的程序是等效的”意味着什么呢?
幸运的是,这个问题对程序员来说比对语言学家更容易理解。我们通常说两个程序是等效的,意思是它们在执行时总是具有相同的可见行为,比如会进行相同的系统调用,以等效的方式与外部库交互,等等。这有点儿像程序界的图灵测试:如果不能分辨自己是在与原文交互还是与译文交互,那它们就是等效的。
现在考虑以下代码:
即使对 very_trustworthy 的定义一无所知,也可以看到它仅接收对 i 的共享引用,因此该调用肯定无法更改 i 的值。由于传给 println! 的值永远是 1000,因此 Rust 可以将这段代码翻译成机器语言,就像我们写过的一样:
这个转换后的版本与原始版本具有相同的可见行为,而且速度可能更快一点儿。但只有在保证它与原始版本具有相同含义的前提下,才值得去考虑此版本的性能。如果 very_trustworthy 的定义是下面这样的该怎么办?
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
本文深入探讨了Rust编程语言中的不安全代码和不安全特型。首先介绍了未定义行为的概念,并强调了Rust对代码行为的坚定信念。文章通过示例展示了不安全代码可能导致的问题,如打破共享引用规则,以及Rust对程序是否“遵纪守法”的规则。此外,还介绍了不安全特型的概念,以及实现不安全特型的契约和风险。最后,强调了在使用不安全特性时,遵守规则成为程序员的责任。总的来说,本文提供了全面的技术知识,涉及裸指针的使用、转换和解引用,以及与其他语言的交互等方面,为读者提供了深入了解Rust中不安全代码和不安全特型的内容。文章还介绍了联合体在Rust中的应用,展示了如何操纵字节并选择如何解释它们。通过具体的代码示例,读者可以了解联合体的构建和赋值过程,以及读取字段时的不安全性。整体而言,本文为读者提供了深入了解Rust编程语言中不安全代码和联合体的内容,对于想要深入了解Rust语言特性的读者具有重要参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论