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库,这样它就不会公开一个以切片为参数的函数。