【问题标题】:Use C variable from Rust without unsafe使用 Rust 中的 C 变量而不安全
【发布时间】:2021-04-24 16:40:20
【问题描述】:

我可以通过 FFI 将 C 函数暴露给 Rust 代码,如下所示:

use std::os::raw::c_int;

mod c {
    #[link(name="...")]
    extern "C" {
        pub fn add(a: c_int, b: c_int) -> c_int;
    }
}

pub fn add(a: c_int, b: c_int) -> c_int {
    unsafe {
        c::add(a, b)
    }
}

现在我可以从 Rust 调用 add 而无需将其包装在另一个 unsafe 块中。但是如果我想对变量做同样的事情呢?即:

use std::os::raw::c_int;

mod c {
    #[link(name="...")]
    extern "C" {
        pub static VAR: c_int;
    }
}

pub static VAR: c_int = unsafe { c::VAR };

这会导致编译器错误:“无法从外部静态读取”。这样做的正确方法是什么(如果有的话)?

【问题讨论】:

  • 正确的方法是使用unsafe
  • 您仍然可以通过一些 getter/setter 围绕该变量提供一些安全接口。在那个界面中它是不安全的,就像add 的例子一样。

标签: c rust ffi


【解决方案1】:

当它确实不安全时它应该是不安全的,尽管你可以静态借用导入的全局变量。

static VAR: &i32 = unsafe { &c::VAR };

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多