In refcount, when the union is reinterpreted, saving the pointer returned by a union accessor is resulting in a dangling pointer. For example:
/*
union U {
int i;
float f;
};
*/
pub struct U {
__bytes: Value<Box<[u8]>>,
}
impl Number {
pub fn i(&self) -> Ptr<i32> {
(self.__bytes.as_pointer() as Ptr<u8>).reinterpret_cast()
}
pub fn f(&self) -> Ptr<f32> {
(self.__bytes.as_pointer() as Ptr<u8>).reinterpret_cast()
}
}
fn foo() {
let p: Ptr<...> = ...;
let reinterpreted_u: Ptr<U> = p.reinterpret_cast();
let p_i: Ptr<i32> = reinterpreted_u.upgrade().deref().i();
...
// p_i is dangling because reinterpreted_u.deref().upgrade() is creating a temporary union
}
In refcount, when the union is reinterpreted, saving the pointer returned by a union accessor is resulting in a dangling pointer. For example: