-
Notifications
You must be signed in to change notification settings - Fork 400
Closed
Description
Hi!
I must read memory that is considered uninitialized by Rust. For that purpose I am using the core::ptr::read_volatile function. However, when running the program under miri it complains with the following error:
$ cargo +nightly miri run
Preparing a sysroot for Miri (target: x86_64-unknown-linux-gnu)... done
Compiling defmt-ringbuf-miri v0.2.0 (/data/surban/dev/defmt-ringbuf-miri)
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `/home/surban/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo-miri runner target/miri/x86_64-unknown-linux-gnu/debug/defmt-ringbuf-miri`
error: Undefined Behavior: using uninitialized data, but this operation requires initialized memory
--> src/ring_buffer.rs:44:29
|
44 | let signature = (addr_of!((*ptr).signature) as *const u32).read_volatile();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ using uninitialized data, but this operation requires initialized memory
|
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
= note: BACKTRACE:
= note: inside `ring_buffer::RingBuffer::<8192>::init` at src/ring_buffer.rs:44:29: 44:87
note: inside `main`
--> src/main.rs:13:27
|
13 | let buffer = unsafe { RingBuffer::init(&mut BUFFER) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
error: aborting due to previous error
The code is available at https://github.com/surban/defmt-ringbuf-miri.
See also this discussion thread for more background information. The conclusion is that core::ptr::read_volatile on uninitialized memory is okay because the compiler cannot make any assumptions about it, i.e. it could be IO memory that changes with every read.
Thus, to be consistent with the compiler's behavior, miri should allow reading of "uninitialized" memory through core::ptr::read_volatile.
Metadata
Metadata
Assignees
Labels
No labels