如何安全地获取两个指向同一个 int 的可变指针?

rid*_*ish 1 unsafe-pointers rust

我想创建一个包装 libcsem_postsem_wait函数的 Rust 信号量,它们都采用可变int *参数。这要求服务员和海报同时拥有一个指向同一个 int 的可变指针。我该如何安排而不冒 UB 的风险?

我的一个想法是使用UnsafeCell

use libc;
use std::cell::UnsafeCell;

pub struct Sema {
    sema: UnsafeCell<i32>,
}

impl Sema {
    pub fn post(&self) {
        unsafe { libc::sem_post(self.sema.get()) };
    }

    pub fn wait(&self) {
        unsafe { libc::sem_wait(self.sema.get()) };
    }
}
Run Code Online (Sandbox Code Playgroud)

这安全吗?有更好的方法吗?谢谢你的帮助!

Kev*_*eid 6

原始指针*mut T*const T类型没有别名要求或其他有效性约束。创建指针总是安全的;请注意,这UnsafeCell::get()不是一个unsafe fn.

在这种情况下,通过使用,UnsafeCell您还可以确保 Rust 不会因为使用指针而违反预期libcsema: i32(例如,如果您有 ,情况就不会如此。)

我不会说你的信号量代码是健全或正确的,因为我不熟悉这些函数,但我有信心说它没有滥用 Rust 指针类型。