我在某处读到,在具有指针的语言中,由于各种原因,编译器不可能在编译时完全确定所有指针是否正确使用和/或是否有效(引用活动对象),因为那会本质上构成解决停机问题。直观地说,这并不奇怪,因为在这种情况下,我们将能够在编译时推断程序的运行时行为,类似于这个相关问题中所述的内容。
然而,据我所知,Rust 语言要求指针检查完全在编译时完成(没有与指针相关的未定义行为,至少是“安全”指针,并且没有“无效指针”或“空指针”运行时例外)。
假设 Rust 编译器没有解决停机问题,那么谬误在哪里?
- 是不是指针检查没有完全在编译时完成,并且与 C 中的原始指针相比,Rust 的智能指针仍然引入了一些运行时开销?
- 或者 Rust 编译器是否可能无法做出完全正确的决定,并且它有时需要 Just Trust The Programmer™,可能使用生命周期注释之一(具有
<'lifetime_ident>
语法的注释)?在这种情况下,这是否意味着指针/内存安全保证不是 100%,仍然依赖于程序员编写正确的代码? - 另一种可能性是,Rust 指针是非“通用的”或在某种意义上受到限制,因此编译器可以在编译时完全推断它们的属性,但它们不如 C 中的原始指针或 C++ 中的智能指针有用。
- 或者也许它是完全不同的东西,我误解了一个或多个
{ "pointer", "safety", "guaranteed", "compile-time" }
.