Skip to content

Commit

Permalink
Auto merge of #1602 - RalfJung:box, r=RalfJung
Browse files Browse the repository at this point in the history
test Box::into_raw aliasing

Directly test aliasing problems caused by `Box::into_raw` issues (like we have them again right now due to rust-lang/rust#77187, but the pinned rustc is older than that so this should still be able to land).
  • Loading branch information
bors committed Oct 27, 2020
2 parents 5fdea5b + ecf330f commit c7c77b1
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 28 deletions.
28 changes: 0 additions & 28 deletions tests/run-pass/box-pair-to-vec.rs

This file was deleted.

60 changes: 60 additions & 0 deletions tests/run-pass/box.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#![feature(ptr_internals)]

fn main() {
into_raw();
into_unique();
boxed_pair_to_vec();
}

fn into_raw() { unsafe {
let b = Box::new(4i32);
let r = Box::into_raw(b);

// "lose the tag"
let r2 = ((r as usize)+0) as *mut i32;
*(&mut *r2) = 7;

// Use original ptr again
*(&mut *r) = 17;
drop(Box::from_raw(r));
}}

fn into_unique() { unsafe {
let b = Box::new(4i32);
let u = Box::into_unique(b);

// "lose the tag"
let r = ((u.as_ptr() as usize)+0) as *mut i32;
*(&mut *r) = 7;

// Use original ptr again.
drop(Box::from_raw(u.as_ptr()));
}}

fn boxed_pair_to_vec() {
#[repr(C)]
#[derive(Debug)]
struct PairFoo {
fst: Foo,
snd: Foo,
}

#[derive(Debug)]
struct Foo(u64);
fn reinterstruct(box_pair: Box<PairFoo>) -> Vec<Foo> {
let ref_pair = Box::leak(box_pair) as *mut PairFoo;
let ptr_foo = unsafe { &mut (*ref_pair).fst as *mut Foo };
unsafe {
Vec::from_raw_parts(ptr_foo, 2, 2)
}
}

let pair_foo = Box::new(PairFoo {
fst: Foo(42),
snd: Foo(1337),
});
println!("pair_foo = {:?}", pair_foo);
for (n, foo) in reinterstruct(pair_foo).into_iter().enumerate() {
println!("foo #{} = {:?}", n, foo);
}
}
File renamed without changes.

0 comments on commit c7c77b1

Please sign in to comment.