理解“警告:使用`#[derive]`和原始指针”警告

时间:2015-08-28 23:10:25

标签: rust

摘要

我正在努力了解以下警告的含义以及如果我的代码没有实际问题,最好的方法就是保持沉默。

warning: use of `#[derive]` with a raw pointer, #[warn(raw_pointer_derive)] on by default

详细信息

我最感兴趣的是理解这个警告意味着什么,但是为什么我看到它的细节是我有一些用Go编写的库代码,我已经导出了那些代码,并想从Rust调用它。从版本1.5开始,Go可以选择生成C接口。这包括生成的头文件,其中包含声明:

typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

我在生成的C文件中也有一个使用此struct

的导出函数
extern GoUint64 Foo(GoSlice p0);

要从Rust调用此函数,我创建一个struct,如下所示:

#[repr(C)]
#[derive(Copy, Clone)]
pub struct GoSlice {
    pub data: *const u64,
    pub len:  c_long,
    pub cap:  c_long,
}

我还将函数导入为:

extern fn Foo(data: GoSlice) -> c_ulong;

然后,当我使用该功能时,我会执行以下操作:

fn call_foo(arr: &[u64]) -> u64 {
    let res: u64;
    let go_slice = GoSlice {
        data: arr.as_ptr(),
        len: arr.len() as i64,
        cap: arr.len() as i64
    };
    unsafe {
        res = Foo(go_slice);
    }
    return res;
}

所以我认为我需要复制go_slice对象,这就是我添加#[derive(Copy, Clone)]的原因,但我不确定警告是否意味着存在真正的问题。如果没有,我想尽可能保持沉默,如果有实际问题,那么我想修复我的代码。

我每晚都在使用锈,这个警告发生在rustc 1.4.0-nightly (20a8412e0 2015-08-28)

1 个答案:

答案 0 :(得分:3)

基本上,警告只是“这看起来很可疑:你真的可以通过复制原始指针来克隆这个结构吗?”。如果你确定你所做的事情是正确的,你可以手动实现复制和克隆。

在这种特殊情况下......你可能不应该首先尝试从Rust代码中操作Go切片。您可能希望从Rust端传入一个原始指针,并将其转换为Go代码中的一个切片。否则,下一个修改Go代码的人将假设切片的生命周期由Go垃圾收集器管理。