Я где-то читал, что на языке, который содержит указатели, компилятор не может полностью решить во время компиляции, будут ли все указатели правильно использованы и/или действительны (обратитесь к живому объекту) по разным причинам, поскольку это будет по существу решением проблемы прекращения. Это не удивительно, интуитивно, потому что в этом случае мы могли бы вывести поведение во время выполнения программы во время компиляции, аналогично тому, что указано в этом связанном вопросе.
Однако, из того, что я могу сказать, язык Rust требует, чтобы проверка указателя выполнялась целиком во время компиляции (не существует undefined поведения, связанного с указателями, "безопасных" указателей, по крайней мере, и нет "недопустимого указателя" или исключение "нулевой указатель" ).
Предполагая, что компилятор Rust не решает проблему остановки, где ложь лежит?
- Это так, что проверка указателя не выполняется полностью во время компиляции,, а интеллектуальные указатели Rust все еще вводят некоторые служебные данные во время выполнения по сравнению с, скажем, необработанными указателями в C?
- Или возможно, что компилятор Rust не может принимать полностью правильные решения, и иногда ему нужно просто доверять программному программисту ™, возможно, используя одну из аннотаций времени жизни (те, которые имеют синтаксис
<'lifetime_ident>
)? В этом случае означает ли это, что гарантия безопасности указателя/памяти не равна 100%, и все еще полагается на программиста, написавшего правильный код? - Другая возможность заключается в том, что указатели Rust не являются "универсальными" или ограниченными в некотором смысле, поэтому компилятор может полностью вывести свои свойства во время компиляции, но они не так полезны, как e. г. raw указатели на C или умные указатели на С++.
- Или, может быть, это нечто совершенно другое, и я неправильно интерпретирую один или несколько из
{ "pointer", "safety", "guaranteed", "compile-time" }
.