rust-lang / miri

An interpreter for Rust's mid-level intermediate representation
Apache License 2.0
4.18k stars 323 forks source link

Box::into_raw no longer does proper retag-to-raw #3473

Closed RalfJung closed 3 months ago

RalfJung commented 3 months ago

The following program used to work, but now it fails:

use std::{
    cell::UnsafeCell,
    sync::atomic::{AtomicPtr, Ordering},
};

#[repr(C)]
#[derive(Default)]
struct Node {
    _meta: UnsafeCell<usize>,
    value: usize,
}

impl Node {
    fn value(&self) -> &usize {
        &self.value
    }
}

fn main() {
    unsafe {
        let a = Box::into_raw(Box::new(Node::default()));
        let ptr = &*a;
        *UnsafeCell::raw_get(a.cast::<UnsafeCell<usize>>()) = 2;
        println!("{}", ptr.value());
    }
}

That is caused by https://github.com/rust-lang/rust/issues/122647. That PR even has a commenting about this situation -- code doing a box-to-raw cast while being generic over the allocator is just not something we can handle properly.