Skip to content

Aliasing violation in drain() #34

Description

@Shnatsel

The following unit test makes miri fail, even under Tree Borrows which the more permissive aliasing model:

#[test]
fn miri_drain_drop_mutates_buffer_while_slice_borrow_is_alive() {
    let mut tester: ArrayDeque<_, 4> = ArrayDeque::new();
    tester.extend_back(0..4);

    // Issue: `Drain` stores an `Iter` containing a slice reference into the
    // deque's buffer, then `Drain::drop` reconstructs the deque by writing
    // through a raw pointer while that slice field is still alive. Safe code
    // only has to drain a middle range; Tree Borrows reports the write as
    // violating the still-protected slice borrow.
    drop(tester.drain(1..2));
}

you can reproduce it with:

MIRIFLAGS=-Zmiri-tree-borrows cargo +nightly miri test --release miri_drain_drop_mutates_buffer_while_slice_borrow_is_alive

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions