Linus:"Rust是安全的 "并不是对代码安全的某种绝对保证

22-10-03 banq

你需要认识到:
  •  (a) 现实胜过幻想
  •  (b) 核心的需要胜过了任何Rust的需要


而*现实是,没有绝对的保证。  永远不会。而
"Rust是安全的 "并不是对代码安全的某种绝对保证。
从来都不是。

即使是用户空间的 "安全 "Rust代码也会做一些事情,比如当事情出错(溢出、分配失败等)时就会抛panic(类似Exception)。
事情出错时(溢出、分配失败等),也会做出panic的事情。如果你不
意识到这不是某种真正的安全,我不知道该说些什么。

(出错时)不继续完成操作,并不*比得到错误的答案好,它只是更容易被调试而已。

在内核中,"panic和停止 "不是一个选项(它甚至比错误的答案更糟糕,因为它真的无法调试)。
它甚至比错误的答案还要糟糕,因为它真的无法调试),所以
所以内核版的 "panic "是 "WARN_ON_ONCE()警告一次",并继续执行完成错误的答案。

因此,我真的*需要*Rust的人去理解这一点。
整个 "安全 "的现实不是某种绝对的的现实,以及内核方面*需要*与用户空间传统上稍有不同的规则的现实。

。。。
(在用户空间)你有一个错误。该死的事情发生了。我们有很多的调试工具
当发生这种错误情况时,会给你一个*大的警告,包括发送自动报告给发行版制造商。然后你修复错误。

要把 "调试工具给出一个巨大的警告 "看成是相当于标准Rust中的std::panic。
但是,内核应该在错误是继续运行(除非你设置了 panic-on-warn),因为内核*必须*继续,以便有 "向上游报告 "发生情况的机会。

所以从技术上讲,它与std:panic的实现非常不同:
但你基本上应该把它看作是:一个*技术上的*,而不是概念上的差异。
内核如何处理bug的规则是不同的,因为我们没有核心文件,
在一般情况下,我们没有核心文件和调试器。

(是的,你可以有一个内核调试器,而且你可以让
WARN_ON_ONCE触发调试器,但是想想那些在普通用户手中的数十亿设备)。

....
或者,你知道,如果你不能处理好内核所要求的规则,那么就不要做内核编程。

因为到最后,它真的就这么简单。  我真的需要你理解内核中的Rust是依赖于*内核*规则的。而不是一些存在于其他地方的随机规则。

(banq:领域规则说了算,内核领域不同于内核以外的使用内核的用户领域)


Reddit网友:
1、Linus 真正想说的是,在内核中继续运行比 Rust 的安全保证更重要。内核更关心这一点而不是安全性,这并不是 Rust 的错。

2、崩溃比继续不正确的状态或允许非法操作要好得多?
请记住,美国范围内的 AT&T 中断是由崩溃和崩溃引起的崩溃引起的。

https://users.csc.calpoly.edu/~jdalbey/SWE/Papers/att_collap

3、内核崩溃可能相当于将您的设备变砖。对于大多数用户来说,这绝对是最糟糕的安全漏洞。

4、数量惊人的内核代码可以在不关闭系统的情况下运行?

5、,“Rust 是安全的”具有明确定义的技术含义,而不是“每个 Rust 程序都有绝对的代码安全保证”。

6、panic(抛Exception)在 Rust 意义上是“安全的”,因为它不会导致未定义的行为,没有机会访问未初始化或已释放的内存。但这在生产化库和二进制文件中也被认为是不好的做法。“永远不要panic”不是该语言做出的承诺,但“避免panic并更喜欢返回结果”绝对是一种文化和惯用的最佳实践。

 

1