相关疑难解决方法(0)

别名可变的原始指针(* mut T)是否会导致不确定的行为?

&mut T&mut T导致编译错误;太好了,两次可变地借款是客观上的错误。

*mut T*mut T未定义的行为,还是这是完全正确的事情?也就是说,可变指针别名有效吗?

是什么使事情变得更糟的是,&mut T*mut T实际上编译和作品如预期,我可以通过引用,指针,然后再参考修改值...但我看到有人说,这是不确定的行为。是的,“有人说过”是我唯一的信息。

这是我测试的内容:

fn main() {
    let mut value: u8 = 42;

    let r: &mut u8 = &mut value;
    let p: *mut u8 = r as *mut _;

    *r += 1;

    unsafe { *p += 1; }

    *r -= 1;

    unsafe { *p -= 1; }

    println!("{}", value);
}
Run Code Online (Sandbox Code Playgroud)

当然,主要的问题是:

注意 —感谢trentcl 指出此示例在创建时实际上会导致复制p2。可以通过用u8Copy类型替换来确认。然后,编译器抱怨此举。可悲的是,这并不能使我更接近答案,仅是提醒我,仅由于Rust的move语义,我就可以得到意想不到的行为而不会成为未定义的行为。

fn main() { …
Run Code Online (Sandbox Code Playgroud)

unsafe undefined-behavior rust

10
推荐指数
1
解决办法
158
查看次数

FFI函数可以修改未声明为可变的变量吗?

fn main() {
    let val = 0;
    unsafe { foo(&val) }
}

extern "C" {
    pub fn foo(val: *const u32);
}
Run Code Online (Sandbox Code Playgroud)

在C中实施:

void foo(unsigned* val) { *val=1; }
Run Code Online (Sandbox Code Playgroud)

当然,我应该通过val: *mut u32,但是在我传递不可变引用的情况下会发生什么?什么编译器规则适用?是否val保持不变,即使我一个指针传递给本地变量?

rust

6
推荐指数
1
解决办法
91
查看次数

标签 统计

rust ×2

undefined-behavior ×1

unsafe ×1