Closed
Description
use std::sync::Arc;
struct Foo<'a>(&'a String);
impl<'a> Drop for Foo<'a> {
fn drop(&mut self) {
println!("{:?}", self.0);
}
}
fn main() {
let (y, x);
x = "alive".to_string();
y = Arc::new(Foo(&x));
}
Output after compiling with rustc 1.5.0-nightly (6cdf31b12 2015-10-15)
:
thread '<main>' panicked at 'index 0 and/or 0 in `�25` do not lie on character boundary', ../src/libcore/str/mod.rs:1444
Compiling with alloc_system
and running under Valgrind confirms the use-after-free. Note that replacing Arc::new
with Rc::new
results in the same invalid runtime behavior, while replacing it with Box::new
reports the correct lifetime error at compile time.
I believe this is a result of Arc
and Rc
failing to include PhantomData<T>
in their internals~~, while simultaneously specifying #[unsafe_destructor_blind_to_params]
on their destructors~~. Assuming my analysis of the issue is correct, I have a patch for this incoming, which will also address #29037.