Rust “理解”;警告:将“#[derive]”与原始指针一起使用;警告 总结
我试图理解下面的警告是什么意思,如果我的代码没有实际问题,那么最好的沉默方式是什么Rust “理解”;警告:将“#[derive]”与原始指针一起使用;警告 总结,rust,Rust,我试图理解下面的警告是什么意思,如果我的代码没有实际问题,那么最好的沉默方式是什么 warning: use of `#[derive]` with a raw pointer, #[warn(raw_pointer_derive)] on by default 细节 我最感兴趣的是理解这个警告意味着什么,但我看到它的原因是,我有一些用Go编写的库代码,我已经导出了这些代码,并希望从Rust调用它。从1.5版开始,Go有一个生成C接口的选项。这包括生成的头文件,其中包含声明: typedef
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文件中,我还有一个导出的函数,它使用这个结构:
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
对象,这就是为什么我添加了#[派生(复制,克隆)]
,但我不确定警告是否意味着存在真正的问题。如果没有,如果可能的话,我想让它静音,如果有实际问题,那么我想修复我的代码
我每晚都在使用rust,而此警告发生在rustc 1.4.0-nightly(20a8412e0 2015-08-28)
基本上,警告只是“这看起来可疑:您真的可以通过复制原始指针克隆此结构吗?”。如果你确信你所做的是正确的,你可以手工实现复制和克隆
在这种特殊情况下。。。首先,您可能不应该试图操纵Rust代码的Go切片。您可能希望从Rust端传入一个原始指针,并将其转换为Go代码中的切片。否则,下一个来修改Go代码的人将假定片的生存期由Go垃圾收集器管理。我不确定“您可能想从生锈的一端传入一个原始指针”是什么意思。我正在尝试看看是否可以使用Go公开的C接口,因此,理论上,Go库函数不知道它是否是从Rust、C、Python等调用的。Go公开的接口有一个GoSlice结构,它接受原始指针,然后在内部使用。至少我认为这是正在发生的事情,我仍然在弄清楚事情的真相,因此我的问题。我想说的是,你应该改变Go库,这样它就不会公开一个以切片为参数的函数。