我正在努力了解以下警告的含义以及如果我的代码没有实际问题,最好的方法就是保持沉默。
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)
答案 0 :(得分:3)
基本上,警告只是“这看起来很可疑:你真的可以通过复制原始指针来克隆这个结构吗?”。如果你确定你所做的事情是正确的,你可以手动实现复制和克隆。
在这种特殊情况下......你可能不应该首先尝试从Rust代码中操作Go切片。您可能希望从Rust端传入一个原始指针,并将其转换为Go代码中的一个切片。否则,下一个修改Go代码的人将假设切片的生命周期由Go垃圾收集器管理。