Linus:"Rust是安全的 "並不是對程式碼安全的某種絕對保證

banq發表於2022-10-03

你需要認識到:
  •  (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並更喜歡返回結果”絕對是一種文化和慣用的最佳實踐。

 

相關文章