gpt4 book ai didi

rust - 这个 `unsafe` 代码是 Rust 中的未定义行为吗?

转载 作者:行者123 更新时间:2023-12-05 03:20:15 24 4
gpt4 key购买 nike

我想从成员引用中获取对结构的引用。所以,我写了下面的代码。

#[repr(C)]
struct Data {
x: i32,
y: u32,
}

fn compose<'a>(x: &'a i32, y: &'a u32) -> Option<&'a Data> {
use memoffset::offset_of;

let x_address = x as *const i32 as usize;
let y_address = y as *const u32 as usize;

if x_address + offset_of!(Data, y) != y_address {
return None;
}

return Some(unsafe { &*(x_address as *const Data) });
}

它似乎可以正常工作,但我不知道它是否安全。这是未定义的行为还是有解决此问题的好 crate ?

最佳答案

是的。这是未定义的行为。 Miri 没有报告它(尽管 a similar code is ),因为它不跟踪 ptr-to-int-to-ptr 往返,但访问超出其边界的引用仍然是未定义的行为,更不用说即使这很好 compose() 仍然是不合理的,因为两个引用可能碰巧有相邻的地址,但来自不同的分配。

如果UCG#134,它可能不是未定义的行为/UCG#256将被决定不是未定义的行为(你将被允许阅读越过引用的界限)。但是,即使在那种情况下我也不确定,因为您有 y 的有效引用(尽管这不太重要)。同时,最好避免这种情况。

关于rust - 这个 `unsafe` 代码是 Rust 中的未定义行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73229378/

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