【问题标题】:Can an FFI function modify a variable that wasn't declared mutable?FFI 函数可以修改未声明为可变的变量吗?
【发布时间】:2017-12-03 15:39:22
【问题描述】:
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 是否保持不变?

【问题讨论】:

    标签: rust


    【解决方案1】:

    我会说undefined behavior:

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

    这可能包括:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多