Skip to content

#[deriving] and unsafe pointers are easy to get wrong #13032

Closed
@huonw

Description

@huonw

In the following, the deriving does the wrong thing: it shallow copies the pointer when the semantics mean it should be making a new allocation and copying the data; there's no indication of this until runtime double-frees/segfaults.

/// Wrapper around an owned allocation
#[deriving(Clone)]
struct Struct {
     owned: *mut int
}

impl Struct {
     fn new(x: int) { Struct { owned: unsafe {cast::transmute(~x)} } }
}
impl Drop for Struct {
    fn drop(&mut self) {
         let _: ~int = unsafe {cast::transmute(self.owned)};
    }
}

Some possible resolutions:

  • do nothing: unsafe code is unsafe
  • have lints for deriving + unsafe pointers
  • have deriving completely disabled on unsafe pointers
  • remove the trait impls for raw pointers

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions