gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:48:21 27 4
gpt4 key购买 nike

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

extern "C" {
pub fn foo(val: *const u32);
}

C 中的实现:

void foo(unsigned* val) { *val=1; }

当然,我应该传递 val: *mut u32,但是如果传递不可变引用会怎样?适用哪些编译器规则?即使我将指针传递给局部变量,val 是否保持不变?

最佳答案

我会说 undefined behavior :

Mutating non-mutable data — that is, data reached through a shared reference or data owned by a let binding), unless that data is contained within an UnsafeCell<U>.

这可能包括:

  • 如果您使用 val在 FFI 调用之后,它可能会忽略您所做的写入(例如,将值缓存在寄存器中或由于 constant propagation )
  • FFI 中的段错误,因为引用的内存可能是只读的
  • 来自 FFI 的写入可能会出现在看似无关的位置,因为编译器重用了内存并假定它具有明确定义的值
  • 更糟的是:)

关于rust - FFI 函数可以修改未声明为可变的变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47620011/

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