在范围内拥有不正确(大于正确)生命周期的引用是否可以?
&'a T如果'a引用值大于引用值,引用是否会立即导致 UB(未定义行为)?或者,只要不超过 type 的引用值,就可以拥有这样的引用T吗?
作为比较:mem::transmute::<u8, bool>(2)是直接 UB,即使您从未访问过返回值。如果您有一个带有 value 的引用,情况也是如此0,因为引用必须始终有效。即使您从未访问过它们。另一方面,在ptr::null()您尝试取消引用空指针之前,拥有不是问题。
考虑这个代码:
let x = '';
let r_correct: &char = &x;
{
let r_incorrect: &'static char = unsafe { mem::transmute(r_correct) };
println!("{}", r_incorrect);
}
在这段代码中,有两个对x. 都活不下去了x。但这种类型r_incorrect显然是谎言,因为x不会永远活着。
这段代码是否表现出明确定义的行为?我看到三个选项:
- (a) 此代码表现出未定义的行为。
- (b) 此代码的行为定义明确(“安全”)。
- (c) Rust 还没有定义关于这部分语言的规则。
回答
不。只有r_incorrect在x超出范围后访问时才会发生未定义的行为,而您在这里没有这样做。
Rust 中的生命周期注释由编译器检查,以确保您没有做任何会导致内存不安全的事情,但是——假设借用检查器很高兴——它们对生成的二进制文件或变量实际存在的时间没有影响。
在您的示例中,您向编译器声称 的生命周期r_incorrect比实际长得多,但没有问题,因为您只能在其有效生命周期内访问它。
这样做的危险在于,未来对代码的更改可能会尝试r_incorrect在其真实生命周期之外使用。编译器无法阻止这种情况发生,因为您已经坚持认为没问题。