-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Description
Miri says that the following code has undefined behavior:
use once_map::OnceMap;
fn main() {
let map = OnceMap::new();
map.insert(0, |_| Box::new(0));
}
$ cargo +nightly miri run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
Running `/home/tyilo/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo-miri runner target/miri/x86_64-unknown-linux-gnu/debug/test_once_map`
error: Undefined Behavior: trying to retag from <84399> for SharedReadOnly permission at alloc26540[0x0], but that tag does not exist in the borrow stack for this location
--> /home/tyilo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_map-0.4.23/src/sync.rs:577:24
|
577 | Ok((v, ret))
| ^^^ this error occurs as part of retag at alloc26540[0x0..0x4]
|
= help: this indicates a potential bug in the program: it performed an invalid operation, but the Stacked Borrows rules it violated are still experimental
= help: see https://github.com/rust-lang/unsafe-code-guidelines/blob/master/wip/stacked-borrows.md for further information
help: <84399> was created by a SharedReadOnly retag at offsets [0x0..0x4]
--> src/main.rs:5:5
|
5 | map.insert(0, |_| Box::new(0));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: <84399> was later invalidated at offsets [0x0..0x4] by a Unique retag
--> src/main.rs:5:5
|
5 | map.insert(0, |_| Box::new(0));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: BACKTRACE (of the first span):
= note: inside closure at /home/tyilo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_map-0.4.23/src/sync.rs:577:24: 577:27
= note: inside `once_map::sync::Shard::<i32, std::boxed::Box<i32>>::get_or_try_insert::<std::convert::Infallible, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}, &i32, once_map::RandomState, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_try_insert<&i32, std::convert::Infallible, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_insert<&i32, {closure@src/main.rs:5:19: 5:22}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#0}}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#0}}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_try_insert<&i32, std::convert::Infallible, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_insert<&i32, {closure@src/main.rs:5:19: 5:22}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#0}}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#1}}>` at /home/tyilo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_map-0.4.23/src/sync.rs:285:28: 285:49
= note: inside `once_map::OnceMap::<i32, std::boxed::Box<i32>>::get_or_try_insert::<{closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}, &i32, std::convert::Infallible, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_try_insert<&i32, std::convert::Infallible, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_insert<&i32, {closure@src/main.rs:5:19: 5:22}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#0}}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#0}}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_try_insert<&i32, std::convert::Infallible, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_insert<&i32, {closure@src/main.rs:5:19: 5:22}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#0}}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#1}}>` at /home/tyilo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_map-0.4.23/src/sync.rs:619:17: 619:101
= note: inside `once_map::OnceMap::<i32, std::boxed::Box<i32>>::map_try_insert::<&i32, std::convert::Infallible, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::map_insert<&i32, {closure@src/main.rs:5:19: 5:22}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>::{closure#0}}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>` at /home/tyilo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_map-0.4.23/src/sync.rs:571:9: 580:10
= note: inside `once_map::OnceMap::<i32, std::boxed::Box<i32>>::map_insert::<&i32, {closure@src/main.rs:5:19: 5:22}, {closure@once_map::OnceMap<i32, std::boxed::Box<i32>>::insert<{closure@src/main.rs:5:19: 5:22}>::{closure#0}}>` at /home/tyilo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_map-0.4.23/src/sync.rs:547:9: 547:67
= note: inside `once_map::OnceMap::<i32, std::boxed::Box<i32>>::insert::<{closure@src/main.rs:5:19: 5:22}>` at /home/tyilo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_map-0.4.23/src/sync.rs:486:9: 486:77
note: inside `main`
--> src/main.rs:5:5
|
5 | map.insert(0, |_| Box::new(0));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
error: aborting due to 1 previous error
This is probably caused by Storyyeller/stable_deref_trait#15, but that still means that this crate is also unsound :/
Maybe this crate could use its own definition of StableDeref which excludes Box.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels