gpt4 book ai didi

rust - 在范围内拥有不正确(大于正确)生命周期的引用是否可以?

转载 作者:行者123 更新时间:2023-12-04 11:47:03 25 4
gpt4 key购买 nike

有没有引用&'a T如果 'a 立即导致 UB(未定义行为)是否大于引用值?或者,只要不超过 T 类型的引用值,就可以拥有这样的引用。 ?
作为对比:mem::transmute::<u8, bool>(2)是直接 UB,即使您从未访问过返回值。如果您有一个值为 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 的生命周期比实际长得多,但没有问题,因为您只能在其有效生命周期内访问它。
    这样做的危险在于, future 对代码的更改可能会尝试使用 r_incorrect超出其真实生命周期。编译器无法阻止这种情况发生,因为您已经坚持认为没问题。

    关于rust - 在范围内拥有不正确(大于正确)生命周期的引用是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68453911/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com