2017-01-13 4 views
0

Rust reference状態:生ポインタをダングリング/ヌルを間接参照 ヌル・ロー・ポインタの逆参照が未定義の動作であるのはなぜですか?

    • 危険ブロックと安全でない関数内を含め、すべてのさびコードで禁止されている行動のリストであります

この質問はあります唯一ヌル部分について。アドレス空間内の明確ではあるが未知のアドレスをアクセス不可能にする必要があるという固有の理由はありません。それは私の論文です(これはヌルポインタのほとんどの実装で行われています)、it seems merely ancient C cruft以来、これらの足跡にはなぜRustが続くのですか?

私は、このようなポインタにアクセスする必要があったところ、私のキャリアの中でいくつかの物語(exampleanotheranotherを)聞いて、なぜスペック(したがって、実装は)再びの方法で取得することができましたか?

この質問が出てくるアセンブリ出力と多くのコンテキストin the C++ Reddit threadがあります。これはまたRust Reddit threadに育てられました。

上記の多くの "戦争物語"にもかかわらず、私にとって本当に嫌なことは、その領域にはありませんが、抽象的なものではなく、ハードウェアによって提供されるアドレススペースへのアクセスを言語のすべてのハードウェア/ OS /アーキテクチャに先験的に使用されています。

+1

(Cであっても)nullポインタは値が0のポインタである必要はありません。アドレス0があるプラットフォーム上のポインタの有効な値だった場合は、そのヌルポインタに他のプレースホルダを使用できます。 – mcarton

+2

@mcarton質問をするときにこの誤解を避けるために頑張ります。誰かがそれを指摘するたびに失敗するからです。そして、無限の議論は値0ではないヌルポインタから始まります。申し訳ありませんが、問題はそれに関するものではなく、この解釈を避けようとしています。 –

+0

質問を編集して、これまで使用していたかもしれないすべてのハードウェア/ OS /アーキテクチャを先験的に追加しましたが、これはヌルポインタのポイントです。*すべてのハードウェア/ OS /アーキテクチャに先験的に設定されていません。これは、* a *ハードウェア/ OS /アーキテクチャのために先験的に設定されていますが、その値はそのハードウェア/ OS /アーキテクチャで逆参照するのに意味のない値であればどれでもかまいません。 – mcarton

答えて

3

ヌルポインタは、言語の別の場所に特殊ケースがあります。たとえば、Option<Box<T>>(ここではT: Sized)は、NULLポインタがNoneを表すために使用されるため、2つではなく1つの語しか使用しません。ヌルポインタに続くコードを許可しないことは、この考え方と一貫しています。

広い意味では、RustはエキゾチックなアーキテクチャをC言語としてサポートするほどの注意を払っていません。これは悪意のあるのではなく、設計時の優先事項です。言語はmodern web browserのために作成されました。すべて–の後に、x86またはARMでユーザーモードで実行されるアプリケーションです。これらの問題が発生するユースケースではありません。もし誰かが1.0よりも前にそれを持ってきたのであれば、それは違うかもしれません。

+1

それについて論じたくはありませんが、一貫しているように見えますが、それでもなおそうです。もしそれが望めば、安全ではない生のアドレススペースへのアクセスにどう影響するかについては、推論がありません。私は、実装がそのようなヌルに依存してその機能を構築し提供し、ツールとして使用するが、安全でないアドレスでどのアドレスにアクセスするかを依然として許容しないし、気にしないことも考えているモード。プラットフォームでは、確かに私も同感ですが、進歩を止めることはできません:)そして今、私はRustがカーネル/ドライバ空間、unikernelsなどでポップアップしているのを見ています。 –