faern / oneshot

Oneshot Rust channel working both in and between sync and async environments
71 stars 9 forks source link

`STATUS_STACK_BUFFER_OVERRUN` / nondeterministic execution in loom test #38

Open Wuelle opened 4 months ago

Wuelle commented 4 months ago

The send_recv_different_threads test (tests/loom.rs) occasionally fails with STATUS_STACK_BUFFER_OVERRUN on x86_64-pc-windows-msvc. Only default features, rustc 1.79.0-nightly (3a36386dc 2024-04-25).

Curiously, sometimes loom panics before this happens:

---- send_recv_different_threads stdout ----
thread 'send_recv_different_threads' panicked at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\path.rs:171:14:
Reached unexpected exploration state. Is the model fully deterministic?
stack backtrace:
   0: std::panicking::begin_panic_handler
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe/library\std\src\panicking.rs:652
   1: core::panicking::panic_fmt
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe/library\core\src\panicking.rs:72
   2: core::panicking::panic_display<ref$<str$> >
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe/library\core\src\panicking.rs:263
   3: core::option::expect_failed
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe/library\core\src\option.rs:1994
   4: enum2$<core::option::Option<loom::rt::object::Ref<loom::rt::path::Load> > >::expect<loom::rt::object::Ref<loom::rt::path::Load> >
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe\library\core\src\option.rs:895
   5: loom::rt::path::Path::branch_load
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\path.rs:169
   6: loom::rt::atomic::impl$0::rmw::closure$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >,tuple$<> >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\atomic.rs:321
   7: loom::rt::synchronize::closure$0<loom::rt::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >,tuple$<> >,enum2$<core::result::Result<u8,tuple$<> > >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\mod.rs:141
   8: loom::rt::scheduler::impl$0::with_execution::closure$0<loom::rt::synchronize::closure_env$0<loom::rt::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\scheduler.rs:48
   9: loom::rt::scheduler::impl$0::with_state::closure$0<loom::rt::scheduler::impl$0::with_execution::closure_env$0<loom::rt::synchronize::closure_env$0<loom::rt::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,lo
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\scheduler.rs:130
  10: scoped_tls::ScopedKey<core::cell::RefCell<loom::rt::scheduler::State> >::with<core::cell::RefCell<loom::rt::scheduler::State>,loom::rt::scheduler::impl$0::with_state::closure_env$0<loom::rt::scheduler::impl$0::with_execution::closure_env$0<loom::rt::synch
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\scoped-tls-1.0.1\src\lib.rs:171
  11: loom::rt::scheduler::Scheduler::with_state<loom::rt::scheduler::impl$0::with_execution::closure_env$0<loom::rt::synchronize::closure_env$0<loom::rt::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\scheduler.rs:130
  12: loom::rt::scheduler::Scheduler::with_execution<loom::rt::synchronize::closure_env$0<loom::rt::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >,tup
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\scheduler.rs:48
  13: loom::rt::execution<loom::rt::synchronize::closure_env$0<loom::rt::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >,tuple$<> >,enum2$<core::result
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\mod.rs:171
  14: loom::rt::synchronize<loom::rt::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >,tuple$<> >,enum2$<core::result::Result<u8,tuple$<> > > >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\mod.rs:138
  15: loom::rt::atomic::Atomic<u8>::rmw<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >,tuple$<> >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\atomic.rs:309
  16: loom::sync::atomic::atomic::Atomic<u8>::try_rmw<u8,loom::sync::atomic::atomic::impl$0::rmw::closure_env$0<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >,tuple$<> >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\sync\atomic\atomic.rs:57
  17: loom::sync::atomic::atomic::Atomic<u8>::rmw<u8,loom::sync::atomic::atomic::impl$0::swap::closure_env$0<u8> >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\sync\atomic\atomic.rs:49
  18: loom::sync::atomic::atomic::Atomic<u8>::swap<u8>
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\sync\atomic\atomic.rs:62
  19: loom::sync::atomic::int::AtomicU8::swap
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\sync\atomic\int.rs:70
  20: oneshot::impl$5::recv_deadline::closure$0<u128>
             at .\src\lib.rs:711
  21: oneshot::Receiver<u128>::start_recv_ref<u128,oneshot::errors::RecvTimeoutError,oneshot::impl$5::recv_deadline::closure_env$0<u128> >
             at .\src\lib.rs:798
  22: oneshot::Receiver<u128>::recv_deadline<u128>
             at .\src\lib.rs:684
  23: oneshot::Receiver<u128>::recv_timeout<u128>
             at .\src\lib.rs:639
  24: loom::send_recv_different_threads::closure$0::closure$0
             at .\tests\loom.rs:44
  25: loom::thread::spawn_internal::closure$0<loom::send_recv_different_threads::closure$0::closure_env$0,tuple$<> >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\thread.rs:161
  26: loom::rt::spawn::closure$1<loom::thread::spawn_internal::closure_env$0<loom::send_recv_different_threads::closure$0::closure_env$0,tuple$<> > >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\mod.rs:76
  27: core::ops::function::FnOnce::call_once<loom::rt::spawn::closure_env$1<loom::thread::spawn_internal::closure_env$0<loom::send_recv_different_threads::closure$0::closure_env$0,tuple$<> > >,tuple$<> >
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe\library\core\src\ops\function.rs:250
  28: alloc::boxed::impl$48::call_once<tuple$<>,dyn$<core::ops::function::FnOnce<tuple$<>,assoc$<Output,tuple$<> > > >,alloc::alloc::Global>
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe\library\alloc\src\boxed.rs:2022
  29: loom::rt::scheduler::spawn_threads::closure$0::closure$0
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\loom-0.5.6\src\rt\scheduler.rs:149
  30: generator::gen_impl::impl$9::init_code::closure$0<enum2$<core::option::Option<alloc::boxed::Box<dyn$<core::ops::function::FnOnce<tuple$<>,assoc$<Output,tuple$<> > > >,alloc::alloc::Global> > >,tuple$<>,loom::rt::scheduler::spawn_threads::closure$0::closur
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\generator-0.7.5\src\gen_impl.rs:336
  31: generator::stack::StackBox<generator::gen_impl::impl$9::init_code::closure_env$0<enum2$<core::option::Option<alloc::boxed::Box<dyn$<core::ops::function::FnOnce<tuple$<>,assoc$<Output,tuple$<> > > >,alloc::alloc::Global> > >,tuple$<>,loom::rt::scheduler::s
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\generator-0.7.5\src\stack\mod.rs:139
  32: generator::stack::Func::call_once
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\generator-0.7.5\src\stack\mod.rs:121
  33: generator::gen_impl::gen_init::closure$0
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\generator-0.7.5\src\gen_impl.rs:552
  34: core::ops::function::FnOnce::call_once<generator::gen_impl::gen_init::closure_env$0,tuple$<> >
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe\library\core\src\ops\function.rs:250
  35: std::panicking::try::do_call<generator::gen_impl::gen_init::closure_env$0,tuple$<> >
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe\library\std\src\panicking.rs:559
  36: generator::stack::impl$13::fmt
  37: std::panicking::try<tuple$<>,generator::gen_impl::gen_init::closure_env$0>
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe\library\std\src\panicking.rs:523
  38: std::panic::catch_unwind<generator::gen_impl::gen_init::closure_env$0,tuple$<> >
             at /rustc/3a36386dc1075018dc7ca2640a2656adb31a61fe\library\std\src\panic.rs:149
  39: generator::gen_impl::catch_unwind_filter<generator::gen_impl::gen_init::closure_env$0,tuple$<> >
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\generator-0.7.5\src\gen_impl.rs:543
  40: generator::gen_impl::gen_init
             at C:\Users\Lenovo\.cargo\registry\src\index.crates.io-6f17d22bba15001f\generator-0.7.5\src\gen_impl.rs:570
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

It appears that the callback from recv_deadline is doing something nasty when reaching the end of the timeout...

I'm seeing four different results for this test in total:

Wuelle commented 4 months ago

https://github.com/faern/oneshot/actions/runs/9013866130/job/24765443642?pr=39 seems to have the same issue

faern commented 3 months ago

I just upgraded loom by quite a few versions. Can you still reproduce the issue?