rust-bindgen icon indicating copy to clipboard operation
rust-bindgen copied to clipboard

Do not derive Clone/Copy/etc for opaque types

Open VeaaC opened this issue 6 years ago • 2 comments

Currently bindgen will generate code that derives for opaque types, e.g.:

typedef struct MyOpaqueStruct MyOpaqueStruct;
#[derive(Copy, Clone, Debug)]
pub struct MyOpaqueStruct {
    _unused: [u8; 0],
}

This has several problems:

  • If a user can obtain a reference to a type they can clone it, even though that is normally only possible through FFI calls, and will almost always result in UB
  • It prevents a user from implementing those traits on their own

The only current solution seems to be to turn of those derivations completely, forcing a user to implement them manually on the non-opaque types.

I would suggest to just not derive any of these in case of an opaque struct (since I cannot come up with a use-case were they would actually work)

VeaaC avatar Oct 24 '19 14:10 VeaaC

This makes sense... I can see a few cases where it'd work, but yeah, it's sketchy at best.

emilio avatar Oct 28 '19 11:10 emilio

#[derive(Copy, Clone, Debug)]
pub struct MyOpaqueStruct {
    _unused: [u8; 0],
}

Probably worth mentioning that in the bindgen code, these are "forward declared types". E.g. the opaque annotation does not cause bindgen to generate a struct like the above.

jschwe avatar Feb 05 '25 13:02 jschwe