2017-01-13 4 views
0

В Rust reference состоянии:Почему разыменовывается неопределенный необработанный указатель null?

  • Ниже приведен список поведения, который запрещен во всем коде Руста, в том числе в небезопасных блоках и небезопасные функциях:
    • Разыменования нуля/оборванных сырого указателя

Этот вопрос исключительно о нулевой части. Не существует неотъемлемой причины требовать, чтобы определенный, но неизвестный адрес в адресном пространстве был недоступен. Это мой тезис (это то, что делают большинство реализаций нулевого указателя), так почему же Rust следит за этими стопами с it seems merely ancient C cruft?

Я слышал несколько историй (example, another, another) в моей карьере, где существует необходимость получить доступ к такому указателю, так почему позволить спецификации (и, следовательно, реализация), чтобы получить в пути снова?

Существует сборка и много контекста in the C++ Reddit thread, из которого возникает этот вопрос. Это также было поднято в этом Rust Reddit thread.

Несмотря на многие «военные истории», о которых говорилось выше, то, что на самом деле расстраивает меня, не в той сфере, а больше на абстрактной: предоставление доступа к адресному пространству (которое поставляется аппаратным обеспечением) неравномерно с языка спецификации, априорно для всех аппаратных/ОС/архитектур, к которым он может когда-либо использоваться.

+1

Обратите внимание, что (даже в C) нулевой указатель не нужен указателю, значение которого равно 0. Если адрес 0 был допустимым значением для указателя на какой-либо платформе, он мог бы использовать любой другой заполнитель для своего нулевого указателя. – mcarton

+2

@mcarton Я стараюсь избегать этого заблуждения при постановке вопроса и терпеть неудачу, потому что каждый раз, когда кто-то указывает на это. И бесконечное обсуждение начинается с нулевого указателя, не являющегося значением 0. Извините, но вопрос не в этом, он пытается избежать этой интерпретации. –

+0

Вы отредактировали свой вопрос, чтобы добавить «априори ко всему оборудованию/ОС/архитектурам, для которых он может когда-либо использоваться», но это точка нулевого указателя: он не установлен априори для * всех * аппаратных/ОС/архитектур , Он устанавливается априори для * a * hardware/OS/architecture, но значение может быть любым значением, которое не имеет смысла для разыменования этого оборудования/архитектуры OS /. – mcarton

ответ

3

Нулевой указатель имеет специальную обложку в другом месте на языке. Например, Option<Box<T>> (где T: Sized) будет использовать только одно слово, а не два, поскольку нулевой указатель используется для представления None. Отказ от кода, который следует за нулевыми указателями, согласуется с этой идеей.

В более широком смысле, Rust не уделяет столько внимания поддержке экзотических архитектур, как C. Это не из-за злобы, а просто вопрос приоритетов во время его проектирования. Язык был создан для modern web browser, ведь – приложение, которое запускается в пользовательском режиме на x86 или ARM. Это не тот случай использования, в котором эти проблемы возникли бы. Возможно, если бы кто-то довел его до версии 1.0, это могло бы пойти по-другому.

+1

Не желая спорить об этом, но я согласен, что он выглядит последовательным, но все же только это. Нет никаких оснований полагать, что это может повлиять на небезопасный доступ к адресному пространству в сыром пространстве, если бы это было так. Я имею в виду, что я думаю в контексте, когда реализация сама полагается на такой null для создания и предоставления своих функций, используя его в качестве инструмента, но все же не запрещая и не заботясь о том, какой адрес будет доступен в небезопасных Режим. На платформах, да, я тоже согласен, но вы не можете остановить прогресс :), и теперь я вижу, как Rust появляется в пространстве ядра/драйверов, unikernels и т. Д. –