()>> 是什么意思?,rust,ffi,unsafe"/>

首页 > 解决方案 > 什么 transmute::<*mut c_void, Option()>> 是什么意思?

问题描述

这是我使用c2rust生成的一些代码,然后进行了一些清理:

#![feature(libc)]
extern crate libc;

use libc::*;
use std::mem::transmute;

extern "C" {
    #[no_mangle]
    fn read(__fd: c_int, __buf: *mut c_void, __nbytes: c_ulong) -> c_long;
    #[no_mangle]
    fn mmap(
        __addr: *mut c_void,
        __len: c_ulong,
        __prot: c_int,
        __flags: c_int,
        __fd: c_int,
        __offset: c_long,
    ) -> *mut c_void;
}

pub fn main() {
    unsafe {
        let buf: *mut c_void = mmap(
            0 as *mut c_void,
            256i32 as c_ulong,
            0x1i32 | 0x2i32 | 0x4i32,
            0x2i32 | 0x20i32,
            -1i32,
            0i32 as c_long,
        );
        read(0i32, buf, 256i32 as c_ulong);
        transmute::<*mut c_void, Option<unsafe extern "C" fn() -> ()>>(buf).unwrap()();
    }
}

虽然我理解它的作用,但我不确定如何解释最后一个表达式。是什么Option<unsafe extern "C" fn() -> ()>意思?

标签: rustffiunsafe

解决方案


我们试图调用一个unsafe extern "C" fn() -> (),它基本上是一个没有参数也没有返回类型的函数。我的第一次尝试是只使用的文档as中定义的关键字。transmute我收到以下错误:

error[E0605]: non-primitive cast: `*mut libc::c_void` as `unsafe extern "C" fn()`
  --> wx.rs:32:9
   |
32 |         (buf as unsafe extern "C" fn() -> ())();
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait

看起来该函数是非原始类型,这就是我需要transmute. 我尝试了以下方法:

transmute::<
    *mut c_void,
    unsafe extern "C" fn() -> ()
>(buf)();

并且代码按预期编译并实际运行。

我仍然不明白为什么Optionc2rust 使用它,但是没有它,代码可以正常工作。似乎unsafeextern "C"可以删除并且代码仍然有效,至少对我而言。


推荐阅读