Messages in this thread | | | Date | Mon, 25 Sep 2023 17:00:45 +0000 | From | Benno Lossin <> | Subject | Re: [PATCH v2 2/2] rust: arc: remove `ArcBorrow` in favour of `WithRef` |
| |
On 25.09.23 18:16, Boqun Feng wrote: > On Mon, Sep 25, 2023 at 03:07:44PM +0000, Benno Lossin wrote: >> ```rust >> struct MutatingDrop { >> value: i32, >> } >> >> impl Drop for MutatingDrop { >> fn drop(&mut self) { >> self.value = 0; >> } >> } >> >> let arc = Arc::new(MutatingDrop { value: 42 }); >> let wr = arc.as_with_ref(); // this creates a shared `&` reference to the MutatingDrop >> let arc2: Arc<MutatingDrop> = wr.into(); // increments the reference count to 2 > > More precisely, here we did a > > &WithRef<_> -> NonNull<WithRef<_>> > > conversion, and later on, we may use the `NonNull<WithRef<_>>` in > `drop` to get a `Box<WithRef<_>>`.
Indeed.
> >> drop(arc); // this decrements the reference count to 1 >> drop(arc2); // this decrements the reference count to 0, so it will drop it >> ``` >> When dropping `arc2` it will run the destructor for `MutatingDrop`, >> which mutates `value`. This is a problem, because the mutable reference >> supplied was derived from a `&`, that is not allowed in Rust. >> > > Is this an UB? I kinda wonder what's the real damage we can get, because > in this case, we just use a reference to carry a value of a pointer, > i.e. > > ptr -> reference -> ptr > > I cannot think of any real damage compiler can make, but I'm happy to be > surprised ;-)
This is UB, so anything can happen :)
-- Cheers, Benno
| |