test Box::into_raw aliasing
This commit is contained in:
parent
086e9c49a9
commit
ecf330f39e
@ -1,28 +0,0 @@
|
|||||||
#[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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
60
tests/run-pass/box.rs
Normal file
60
tests/run-pass/box.rs
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user