#![feature(iter_next_chunk)]
#![feature(try_trait_v2)] // needed for implement a custom try_for_each
pub struct Evil;
// iterator with an malicious try_for_each
impl Iterator for Evil {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
unreachable!()
}
fn try_for_each<F, R>(&mut self, mut f: F) -> R
where
Self: Sized,
F: FnMut(Self::Item) -> R,
R: std::ops::Try<Output = ()>,
{
loop {
// could just call with a fixed value, but this way causes an actual stack overrun even outside MIRI :)
for i in 0.. {
let _ = f(i);
}
}
}
}
pub fn main() {
// any of the following:
_ = (0usize..).filter_map(Some).next_chunk::<0>();
_ = (0usize..).filter(|_| true).next_chunk::<0>();
_ = Evil.filter_map(Some).next_chunk::<30>();
_ = Evil.filter(|_| true).next_chunk::<30>();
}
rustc 1.96.0-nightly (3102493c7 2026-03-12)
binary: rustc
commit-hash: 3102493c71626b5912d11d06c393b013569beb52
commit-date: 2026-03-12
host: x86_64-pc-windows-msvc
release: 1.96.0-nightly
LLVM version: 22.1.0
Backtrace
example 1 running normally doesn't trigger UB check
example 1 under miri
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe`
error: Undefined Behavior: memory access failed: attempting to access 8 bytes, but got alloc155 which is at or beyond the end of the allocation of size 0 bytes
--> C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:103:17
|
103 | crate::ptr::copy_nonoverlapping(opt_payload_at, dst, 1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Undefined Behavior occurred here
|
= 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
help: alloc155 was allocated here:
--> C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:71:13
|
71 | let mut array: [MaybeUninit<Self::Item>; N] = [const { MaybeUninit::uninit() }; N];
| ^^^^^^^^^
= note: stack backtrace:
0: <std::iter::FilterMap<std::ops::RangeFrom<usize>, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk::<0>::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:103:17: 103:72
1: std::iter::Iterator::try_for_each::call::<usize, std::ops::ControlFlow<()>, {closure@<std::iter::FilterMap<std::ops::RangeFrom<usize>, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk<0>::{closure#0}}>::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2544:26: 2544:30
2: <std::ops::RangeFrom<usize> as std::iter::Iterator>::try_fold::<(), {closure@std::iter::Iterator::try_for_each::call<usize, std::ops::ControlFlow<()>, {closure@<std::iter::FilterMap<std::ops::RangeFrom<usize>, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk<0>::{closure#0}}>::{closure#0}}, std::ops::ControlFlow<()>>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2485:21: 2485:32
3: <std::ops::RangeFrom<usize> as std::iter::Iterator>::try_for_each::<{closure@<std::iter::FilterMap<std::ops::RangeFrom<usize>, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk<0>::{closure#0}}, std::ops::ControlFlow<()>>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2547:9: 2547:35
4: <std::iter::FilterMap<std::ops::RangeFrom<usize>, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk::<0>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:92:22: 108:11
5: main
at src\main.rs:31:9: 31:54
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
error: aborting due to 1 previous error
error: process didn't exit successfully: `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe` (exit code: 1)
example 2 under miri
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe`
thread 'main' (1) panicked at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:50:28:
unsafe precondition(s) violated: slice::get_unchecked_mut requires that the index is within the slice
This indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
note: in Miri, you may have to set `MIRIFLAGS=-Zmiri-env-forward=RUST_BACKTRACE` for the environment variable to have an effect
thread caused non-unwinding panic. aborting.
error: abnormal termination: the program aborted execution
--> C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:847:9
|
847 | crate::process::abort();
| ^^^^^^^^^^^^^^^^^^^^^^^ abnormal termination occurred here
|
= note: stack backtrace:
0: std::panicking::panic_with_hook
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:847:9: 847:32
1: std::panicking::panic_handler::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:691:13: 696:14
2: std::sys::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::panic_handler::{closure#0}}, !>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\backtrace.rs:182:18: 182:21
3: std::panicking::panic_handler
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:689:5: 705:7
4: std::iter::Filter::<std::ops::RangeFrom<usize>, {closure@src\main.rs:32:27: 32:30}>::next_chunk_dropless::<0>::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:50:22: 50:50
5: std::iter::Iterator::try_for_each::call::<usize, std::ops::ControlFlow<()>, {closure@std::iter::Filter<std::ops::RangeFrom<usize>, {closure@src\main.rs:32:27: 32:30}>::next_chunk_dropless<0>::{closure#0}}>::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2544:26: 2544:30
6: <std::ops::RangeFrom<usize> as std::iter::Iterator>::try_fold::<(), {closure@std::iter::Iterator::try_for_each::call<usize, std::ops::ControlFlow<()>, {closure@std::iter::Filter<std::ops::RangeFrom<usize>, {closure@src\main.rs:32:27: 32:30}>::next_chunk_dropless<0>::{closure#0}}>::{closure#0}}, std::ops::ControlFlow<()>>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2485:21: 2485:32
7: <std::ops::RangeFrom<usize> as std::iter::Iterator>::try_for_each::<{closure@std::iter::Filter<std::ops::RangeFrom<usize>, {closure@src\main.rs:32:27: 32:30}>::next_chunk_dropless<0>::{closure#0}}, std::ops::ControlFlow<()>>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2547:9: 2547:35
8: std::iter::Filter::<std::ops::RangeFrom<usize>, {closure@src\main.rs:32:27: 32:30}>::next_chunk_dropless::<0>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:44:22: 53:11
9: <std::iter::Filter<std::ops::RangeFrom<usize>, {closure@src\main.rs:32:27: 32:30}> as std::iter::Iterator>::next_chunk::<0>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:114:9: 114:18
10: main
at src\main.rs:32:9: 32:54
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
error: aborting due to 1 previous error
error: process didn't exit successfully: `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe` (exit code: 1)
example 2 running normally
Compiling filter-map-ub v0.1.0 (C:\Users\kylee\scratch\filter-map-ub)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.26s
Running `target\debug\filter-map-ub.exe`
thread 'main' (10936) panicked at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\iter\adapters\filter.rs:50:28:
unsafe precondition(s) violated: slice::get_unchecked_mut requires that the index is within the slice
This indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.
stack backtrace:
0: std::panicking::panic_handler
at /rustc/3102493c71626b5912d11d06c393b013569beb52/library\std\src\panicking.rs:689
1: core::panicking::panic_nounwind_fmt
at /rustc/3102493c71626b5912d11d06c393b013569beb52/library\core\src\intrinsics\mod.rs:2447
2: core::slice::index::impl$2::get_unchecked_mut::precondition_check
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ub_checks.rs:73
3: core::iter::adapters::filter::impl$1::next_chunk_dropless::closure$0<core::ops::range::RangeFrom<usize>,filter_map_ub::main::closure_env$0,0>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:50
4: core::iter::traits::iterator::Iterator::try_for_each::call::closure$0<usize,enum2$<core::ops::control_flow::ControlFlow<tuple$<>,tuple$<> > >,core::iter::adapters::filter::impl$1::next_chunk_dropless::closure_env$0<core::ops::range::RangeFrom<usize>,filter
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2544
5: core::iter::traits::iterator::Iterator::try_fold<core::ops::range::RangeFrom<usize>,tuple$<>,core::iter::traits::iterator::Iterator::try_for_each::call::closure_env$0<usize,enum2$<core::ops::control_flow::ControlFlow<tuple$<>,tuple$<> > >,core::iter::adapt
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2485
6: core::iter::traits::iterator::Iterator::try_for_each<core::ops::range::RangeFrom<usize>,core::iter::adapters::filter::impl$1::next_chunk_dropless::closure_env$0<core::ops::range::RangeFrom<usize>,filter_map_ub::main::closure_env$0,0>,enum2$<core::ops::cont
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\traits\iterator.rs:2547
7: core::iter::adapters::filter::Filter<core::ops::range::RangeFrom<usize>,filter_map_ub::main::closure_env$0>::next_chunk_dropless<core::ops::range::RangeFrom<usize>,filter_map_ub::main::closure_env$0,0>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:44
8: core::iter::adapters::filter::impl$3::next_chunk<core::ops::range::RangeFrom<usize>,filter_map_ub::main::closure_env$0,0>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:114
9: filter_map_ub::main
at .\src\main.rs:32
10: core::ops::function::FnOnce::call_once<void (*)(),tuple$<> >
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:250
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
thread caused non-unwinding panic. aborting.
error: process didn't exit successfully: `target\debug\filter-map-ub.exe` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)
example 3 under miri
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe`
error: Undefined Behavior: memory access failed: attempting to access 8 bytes, but got alloc155+0xf0 which is at or beyond the end of the allocation of size 240 bytes
--> C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:103:17
|
103 | crate::ptr::copy_nonoverlapping(opt_payload_at, dst, 1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Undefined Behavior occurred here
|
= 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
help: alloc155 was allocated here:
--> C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:71:13
|
71 | let mut array: [MaybeUninit<Self::Item>; N] = [const { MaybeUninit::uninit() }; N];
| ^^^^^^^^^
= note: stack backtrace:
0: <std::iter::FilterMap<Evil, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk::<30>::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:103:17: 103:72
1: <Evil as std::iter::Iterator>::try_for_each::<{closure@<std::iter::FilterMap<Evil, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk<30>::{closure#0}}, std::ops::ControlFlow<()>>
at src\main.rs:23:25: 23:29
2: <std::iter::FilterMap<Evil, fn(usize) -> std::option::Option<usize> {std::option::Option::<usize>::Some}> as std::iter::Iterator>::next_chunk::<30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:92:22: 108:11
3: main
at src\main.rs:33:9: 33:49
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
error: aborting due to 1 previous error
error: process didn't exit successfully: `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe` (exit code: 1)
example 3 ran normally
Compiling filter-map-ub v0.1.0 (C:\Users\kylee\scratch\filter-map-ub)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.28s
Running `target\debug\filter-map-ub.exe`
thread 'main' (7132) panicked at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\ptr\mod.rs:531:5:
unsafe precondition(s) violated: ptr::copy_nonoverlapping requires that both pointer arguments are aligned and non-null and the specified memory ranges do not overlap
This indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.
stack backtrace:
0: std::panicking::panic_handler
at /rustc/3102493c71626b5912d11d06c393b013569beb52/library\std\src\panicking.rs:689
1: core::panicking::panic_nounwind_fmt
at /rustc/3102493c71626b5912d11d06c393b013569beb52/library\core\src\intrinsics\mod.rs:2447
2: core::ptr::copy_nonoverlapping::precondition_check
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ub_checks.rs:73
3: core::iter::adapters::filter_map::impl$2::next_chunk::closure$0<usize,filter_map_ub::Evil,enum2$<core::option::Option<usize> > (*)(usize),30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:103
4: filter_map_ub::impl$0::try_for_each<core::iter::adapters::filter_map::impl$2::next_chunk::closure_env$0<usize,filter_map_ub::Evil,enum2$<core::option::Option<usize> > (*)(usize),30>,enum2$<core::ops::control_flow::ControlFlow<tuple$<>,tuple$<> > > >
at .\src\main.rs:23
5: core::iter::adapters::filter_map::impl$2::next_chunk<usize,filter_map_ub::Evil,enum2$<core::option::Option<usize> > (*)(usize),30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter_map.rs:92
6: filter_map_ub::main
at .\src\main.rs:33
7: core::ops::function::FnOnce::call_once<void (*)(),tuple$<> >
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:250
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
thread caused non-unwinding panic. aborting.
error: process didn't exit successfully: `target\debug\filter-map-ub.exe` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)
example 4 under miri
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe`
thread 'main' (1) panicked at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:50:28:
unsafe precondition(s) violated: slice::get_unchecked_mut requires that the index is within the slice
This indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
note: in Miri, you may have to set `MIRIFLAGS=-Zmiri-env-forward=RUST_BACKTRACE` for the environment variable to have an effect
thread caused non-unwinding panic. aborting.
error: abnormal termination: the program aborted execution
--> C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:847:9
|
847 | crate::process::abort();
| ^^^^^^^^^^^^^^^^^^^^^^^ abnormal termination occurred here
|
= note: stack backtrace:
0: std::panicking::panic_with_hook
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:847:9: 847:32
1: std::panicking::panic_handler::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:691:13: 696:14
2: std::sys::backtrace::__rust_end_short_backtrace::<{closure@std::panicking::panic_handler::{closure#0}}, !>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\backtrace.rs:182:18: 182:21
3: std::panicking::panic_handler
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\panicking.rs:689:5: 705:7
4: std::iter::Filter::<Evil, {closure@src\main.rs:34:21: 34:24}>::next_chunk_dropless::<30>::{closure#0}
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:50:22: 50:50
5: <Evil as std::iter::Iterator>::try_for_each::<{closure@std::iter::Filter<Evil, {closure@src\main.rs:34:21: 34:24}>::next_chunk_dropless<30>::{closure#0}}, std::ops::ControlFlow<()>>
at src\main.rs:23:25: 23:29
6: std::iter::Filter::<Evil, {closure@src\main.rs:34:21: 34:24}>::next_chunk_dropless::<30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:44:22: 53:11
7: <std::iter::Filter<Evil, {closure@src\main.rs:34:21: 34:24}> as std::iter::Iterator>::next_chunk::<30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:114:9: 114:18
8: main
at src\main.rs:34:9: 34:49
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
error: aborting due to 1 previous error
error: process didn't exit successfully: `C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\cargo-miri.exe runner target\miri\x86_64-pc-windows-msvc\debug\filter-map-ub.exe` (exit code: 1)
example 4 ran normally
Compiling filter-map-ub v0.1.0 (C:\Users\kylee\scratch\filter-map-ub)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s
Running `target\debug\filter-map-ub.exe`
thread 'main' (27484) panicked at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\iter\adapters\filter.rs:50:28:
unsafe precondition(s) violated: slice::get_unchecked_mut requires that the index is within the slice
This indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.
stack backtrace:
0: std::panicking::panic_handler
at /rustc/3102493c71626b5912d11d06c393b013569beb52/library\std\src\panicking.rs:689
1: core::panicking::panic_nounwind_fmt
at /rustc/3102493c71626b5912d11d06c393b013569beb52/library\core\src\intrinsics\mod.rs:2447
2: core::slice::index::impl$2::get_unchecked_mut::precondition_check
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ub_checks.rs:73
3: core::iter::adapters::filter::impl$1::next_chunk_dropless::closure$0<filter_map_ub::Evil,filter_map_ub::main::closure_env$0,30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:50
4: filter_map_ub::impl$0::try_for_each<core::iter::adapters::filter::impl$1::next_chunk_dropless::closure_env$0<filter_map_ub::Evil,filter_map_ub::main::closure_env$0,30>,enum2$<core::ops::control_flow::ControlFlow<tuple$<>,tuple$<> > > >
at .\src\main.rs:23
5: core::iter::adapters::filter::Filter<filter_map_ub::Evil,filter_map_ub::main::closure_env$0>::next_chunk_dropless<filter_map_ub::Evil,filter_map_ub::main::closure_env$0,30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:44
6: core::iter::adapters::filter::impl$3::next_chunk<filter_map_ub::Evil,filter_map_ub::main::closure_env$0,30>
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\iter\adapters\filter.rs:114
7: filter_map_ub::main
at .\src\main.rs:34
8: core::ops::function::FnOnce::call_once<void (*)(),tuple$<> >
at C:\Users\kylee\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ops\function.rs:250
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
thread caused non-unwinding panic. aborting.
error: process didn't exit successfully: `target\debug\filter-map-ub.exe` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)
There are two issues causing buffer overruns in
Filter::next_chunk/FilterMap::next_chunk.N=0they each will run over their loop once, overfilling the zero length array.try_for_eachto not call the closure again after returningControlFlow::Breakbehind #98326
Repros:
I expected to see this happen: explanation
Instead, this happened: explanation
Meta
rustc --version --verbose:Backtrace
example 1 running normally doesn't trigger UB check
example 1 under miri
example 2 under miri
example 2 running normally
example 3 under miri
example 3 ran normally
example 4 under miri
example 4 ran normally