ndarray icon indicating copy to clipboard operation
ndarray copied to clipboard

Stacked borrows miri failure in `test_map_axis`

Open 5225225 opened this issue 2 years ago • 1 comments

Running MIRIFLAGS="-Zmiri-tag-raw-pointers" cargo miri test test_map_axis yields this stack trace

test test_map_axis ... error: Undefined Behavior: trying to reborrow for SharedReadOnly at alloc186627+0xc, but parent tag <502102> does not have an appropriate item in the borrow stack
    --> /home/jess/src/ndarray/src/iterators/mod.rs:225:63
     |
225  |         unsafe { self.inner.fold(init, move |acc, ptr| g(acc, &*ptr)) }
     |                                                               ^^^^^ trying to reborrow for SharedReadOnly at alloc186627+0xc, but parent tag <502102> does not have an appropriate item in the borrow stack
     |
     = help: this indicates a potential bug in the program: it performed an invalid operation, but the 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
             
     = note: inside closure at /home/jess/src/ndarray/src/iterators/mod.rs:225:63
     = note: inside `<ndarray::iterators::Baseiter<i32, ndarray::Dim<[usize; 1]>> as std::iter::Iterator>::fold::<i32, [closure@<ndarray::iterators::ElementsBase<i32, ndarray::Dim<[usize; 1]>> as std::iter::Iterator>::fold<i32, [closure@ndarray::numeric::impl_numeric::<impl ndarray::ArrayBase<ndarray::ViewRepr<&i32>, ndarray::Dim<[usize; 1]>>>::sum::{closure#0}]>::{closure#0}]>` at /home/jess/src/ndarray/src/iterators/mod.rs:95:29
     = note: inside `<ndarray::iterators::ElementsBase<i32, ndarray::Dim<[usize; 1]>> as std::iter::Iterator>::fold::<i32, [closure@ndarray::numeric::impl_numeric::<impl ndarray::ArrayBase<ndarray::ViewRepr<&i32>, ndarray::Dim<[usize; 1]>>>::sum::{closure#0}]>` at /home/jess/src/ndarray/src/iterators/mod.rs:225:18
     = note: inside `<ndarray::iter::Iter<i32, ndarray::Dim<[usize; 1]>> as std::iter::Iterator>::fold::<i32, [closure@ndarray::numeric::impl_numeric::<impl ndarray::ArrayBase<ndarray::ViewRepr<&i32>, ndarray::Dim<[usize; 1]>>>::sum::{closure#0}]>` at /home/jess/src/ndarray/src/iterators/mod.rs:398:37
     = note: inside `ndarray::numeric::impl_numeric::<impl ndarray::ArrayBase<ndarray::ViewRepr<&i32>, ndarray::Dim<[usize; 1]>>>::sum` at /home/jess/src/ndarray/src/numeric/impl_numeric.rs:44:29
note: inside closure at tests/array.rs:2131:40
    --> tests/array.rs:2131:40
     |
2131 |     let b = a.map_axis(Axis(0), |view| view.sum());
     |                                        ^^^^^^^^^^
     = note: inside closure at /home/jess/src/ndarray/src/impl_methods.rs:2711:17
     = note: inside closure at /home/jess/src/ndarray/src/iterators/mod.rs:1495:29
     = note: inside `<std::slice::Iter<i32> as std::iter::Iterator>::fold::<(), [closure@ndarray::iterators::to_vec_mapped<std::slice::Iter<i32>, [closure@ndarray::impl_methods::<impl ndarray::ArrayBase<ndarray::OwnedRepr<i32>, ndarray::Dim<[usize; 2]>>>::map_axis<i32, [closure@tests/array.rs:2131:33: 2131:50]>::{closure#1}], i32>::{closure#0}]>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:2171:21
     = note: inside `ndarray::iterators::to_vec_mapped::<std::slice::Iter<i32>, [closure@ndarray::impl_methods::<impl ndarray::ArrayBase<ndarray::OwnedRepr<i32>, ndarray::Dim<[usize; 2]>>>::map_axis<i32, [closure@tests/array.rs:2131:33: 2131:50]>::{closure#1}], i32>` at /home/jess/src/ndarray/src/iterators/mod.rs:1494:5
     = note: inside `ndarray::impl_constructors::<impl ndarray::ArrayBase<ndarray::OwnedRepr<i32>, ndarray::Dim<[usize; 1]>>>::from_shape_trusted_iter_unchecked::<ndarray::StrideShape<ndarray::Dim<[usize; 1]>>, std::slice::Iter<i32>, [closure@ndarray::impl_methods::<impl ndarray::ArrayBase<ndarray::OwnedRepr<i32>, ndarray::Dim<[usize; 2]>>>::map_axis<i32, [closure@tests/array.rs:2131:33: 2131:50]>::{closure#1}]>` at /home/jess/src/ndarray/src/impl_constructors.rs:538:17
     = note: inside `ndarray::impl_methods::<impl ndarray::ArrayBase<ndarray::ViewRepr<&i32>, ndarray::Dim<[usize; 1]>>>::map::<i32, [closure@ndarray::impl_methods::<impl ndarray::ArrayBase<ndarray::OwnedRepr<i32>, ndarray::Dim<[usize; 2]>>>::map_axis<i32, [closure@tests/array.rs:2131:33: 2131:50]>::{closure#1}]>` at /home/jess/src/ndarray/src/impl_methods.rs:2476:17
     = note: inside `ndarray::impl_methods::<impl ndarray::ArrayBase<ndarray::OwnedRepr<i32>, ndarray::Dim<[usize; 2]>>>::map_axis::<i32, [closure@tests/array.rs:2131:33: 2131:50]>` at /home/jess/src/ndarray/src/impl_methods.rs:2710:13
note: inside `test_map_axis` at tests/array.rs:2131:13
    --> tests/array.rs:2131:13
     |
2131 |     let b = a.map_axis(Axis(0), |view| view.sum());
     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: inside closure at tests/array.rs:2128:1
    --> tests/array.rs:2128:1
     |
2127 |   #[test]
     |   ------- in this procedural macro expansion
2128 | / fn test_map_axis() {
2129 | |     let a = arr2(&[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]);
2130 | |
2131 | |     let b = a.map_axis(Axis(0), |view| view.sum());
...    |
2157 | |     itertools::assert_equal(result.iter().cloned().sorted(), 1..=3 * 4);
2158 | | }
     | |_^
     = note: inside `<[closure@tests/array.rs:2128:1: 2158:2] as std::ops::FnOnce<()>>::call_once - shim` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
     = note: inside `<fn() as std::ops::FnOnce<()>>::call_once - shim(fn())` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
     = note: inside `test::__rust_begin_short_backtrace::<fn()>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:585:5
     = note: inside closure at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:576:30
     = note: inside `<[closure@test::run_test::{closure#2}] as std::ops::FnOnce<()>>::call_once - shim(vtable)` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
     = note: inside `<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send> as std::ops::FnOnce<()>>::call_once` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/boxed.rs:1811:9
     = note: inside `<std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>> as std::ops::FnOnce<()>>::call_once` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/panic/unwind_safe.rs:271:9
     = note: inside `std::panicking::r#try::do_call::<std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>>, ()>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:406:40
     = note: inside `std::panicking::r#try::<(), std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>>>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:370:19
     = note: inside `std::panic::catch_unwind::<std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>>, ()>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:133:14
     = note: inside `test::run_test_in_process` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:608:18
     = note: inside closure at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:500:39
     = note: inside `test::run_test::run_test_inner` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:538:13
     = note: inside `test::run_test` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:572:28
     = note: inside `test::run_tests::<[closure@test::run_tests_console::{closure#2}]>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:313:17
     = note: inside `test::run_tests_console` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/console.rs:290:5
     = note: inside `test::test_main` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:124:15
     = note: inside `test::test_main_static` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:143:5
     = note: inside `main`
     = note: inside `<fn() as std::ops::FnOnce<()>>::call_once - shim(fn())` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
     = note: inside `std::sys_common::backtrace::__rust_begin_short_backtrace::<fn(), ()>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/backtrace.rs:123:18
     = note: inside closure at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:145:18
     = note: inside `std::ops::function::impls::<impl std::ops::FnOnce<()> for &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>::call_once` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:259:13
     = note: inside `std::panicking::r#try::do_call::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:406:40
     = note: inside `std::panicking::r#try::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:370:19
     = note: inside `std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:133:14
     = note: inside closure at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:128:48
     = note: inside `std::panicking::r#try::do_call::<[closure@std::rt::lang_start_internal::{closure#2}], isize>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:406:40
     = note: inside `std::panicking::r#try::<isize, [closure@std::rt::lang_start_internal::{closure#2}]>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:370:19
     = note: inside `std::panic::catch_unwind::<[closure@std::rt::lang_start_internal::{closure#2}], isize>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:133:14
     = note: inside `std::rt::lang_start_internal` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:128:20
     = note: inside `std::rt::lang_start::<()>` at /home/jess/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:144:17
     = note: this error originates in the attribute macro `test` (in Nightly builds, run with -Z macro-backtrace for more info)

5225225 avatar Dec 19 '21 21:12 5225225

Thanks for reporting this. I've created #1138 to fix the issue.

jturner314 avatar Dec 20 '21 00:12 jturner314