Open
Description
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)
Activity
emilio commentedon Oct 28, 2019
This makes sense... I can see a few cases where it'd work, but yeah, it's sketchy at best.
derive_default
for opaque types #3096pub
member #3097jschwe commentedon Feb 5, 2025
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.