2017-01-13 24 views
0

Rust reference狀態:爲什麼解引用null原始指針未定義的行爲?

  • 以下是其在所有鏽病代碼禁止,包括不安全塊和不安全的函數內行爲的列表:
    • 取消對NULL /懸空原始指針

這個問題僅關於零部件。沒有固有的理由要求在地址空間中確定但未知的地址無法訪問。這就是我的論點(這是空指針的大部分實現),那麼爲什麼Rust自從it seems merely ancient C cruft以後就在這些腳步之後?

我聽說過一些故事(exampleanotheranother)在我的職業生涯,那裏有一個需要訪問這些指針,那麼爲什麼允許規範(因此,實現),以再次礙事?

有彙編輸出和很多上下文in the C++ Reddit thread這個問題來源。它也在這個Rust Reddit thread提出。

儘管上面提到了許多「戰爭故事」,但真正讓我不快的東西不在這個領域,而更多的是抽象的東西:讓語言的地址空間訪問(由硬件提供)不統一規範,它可以用於所有硬件/操作系統/體系結構。

+1

請注意,即使在C中,空指針也不是必需的,其值爲0的指針。如果地址0是某個平臺上的指針的有效值,則它可以使用任何其他佔位符來指定其空指針。 – mcarton

+2

@mcarton當提出問題時,我儘量避免這種誤解,並且失敗,因爲每次有人來指出它。而無休止的討論開始於空指針不是0值。對不起,但問題不在於它,它試圖避免這種解釋。 –

+0

你已經編輯了你的問題來添加「它可能曾經用過的所有硬件/操作系統/體系結構的優先事項」,但這是空指針的一個重點:它不是爲所有硬件/操作系統/體系結構事先設置的。它被設置爲* a *硬件/操作系統/體系結構的先驗值,但是該值可以是任何對在該硬件/操作系統/體系結構上解除引用無意義的值。 – mcarton

回答

3

空指針是特殊的語言已經在其他地方。例如,Option<Box<T>>(其中T: Sized)將只使用一個字,而不是兩個,因爲空指針用於表示None。禁止遵循空指針的代碼與此想法一致。

從更廣泛的意義上講,Rust並沒有像支持C那樣注重支持外來建築。這並非出於惡意,而僅僅是在設計過程中優先考慮的問題。該語言是爲modern web browser而構建的,畢竟–是在x86或ARM上以用戶模式運行的應用程序。這不是那種會出現這些問題的用例。也許如果有人在1.0之前提出它,它可能會有所不同。

+1

不想爭論它,但我同意它看起來一致,但仍然是這樣。如果願意的話,沒有理由說明如何影響不安全的原始地址空間訪問。我的意思是,我在考慮執行本身依賴於這樣的null來構造和提供它的特性,將它用作工具,但仍然不禁止,甚至不關心在不安全中訪問什麼地址的情況下模式。在平臺上,我確實也同意,但你無法停止進展:)現在我看到Rust在內核/驅動程序空間,unikernels等等中出現了。 –

相關問題