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

时间:2017-12-03 15:39:23

标签: rust

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仍保持不变吗?

1 个答案:

答案 0 :(得分:6)

我会说undefined behavior

  

变异非可变数据 - 即通过共享引用或let绑定所拥有的数据到达的数据),除非该数据包含在UnsafeCell<U>中。

这可能包括:

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