sml icon indicating copy to clipboard operation
sml copied to clipboard

Clang UBSan Violation (Insufficient object size) when compiled with `-O2` or above

Open arrtchiu opened this issue 7 years ago • 3 comments

REPRO

  1. Use a lambda as a guard or action, stored with auto or const auto.
  2. Compile with -O3 and run with undefined-behaviour sanitiser (UBSan).

ACTUAL UBSan reports "Insufficient object size"

EXPECTED No undefined behaviour detected

NOTES:

  • Does not repro on -O0 or -O
  • Does not repro if the lambda is stored inside std::function<..> instead of auto.
  • Repros on Apple LLVM 10.0.0 (clang-1000.11.45.5) / x86_64-apple-darwin-18.0.0 (Xcode 10.1 10B61); haven't tried on other machines/compilers yet.
  • Repros on -O2, -O3, -Os, -Ofast

Stack Trace:

#0	0x000000010000186a in bool boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&, boost::sml::v1_1_0::aux::integral_constant<bool, false>) [inlined] at boost/sml.hpp:2880
#1	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute_impl<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) [inlined] at boost/sml.hpp:889
#2	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) at boost/sml.hpp:883
#3	0x000000010000185a in bool boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&, boost::sml::v1_1_0::aux::integral_constant<bool, false>) [inlined] at boost/sml.hpp:2884
#4	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute_impl<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) [inlined] at boost/sml.hpp:889
#5	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) at boost/sml.hpp:883
#6	0x000000010000185a in bool boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&, boost::sml::v1_1_0::aux::integral_constant<bool, false>) [inlined] at boost/sml.hpp:2884
#7	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute_impl<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) [inlined] at boost/sml.hpp:889
#8	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) at boost/sml.hpp:883
#9	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) at boost/sml.hpp:883
#10	0x000000010000184f in bool boost::sml::v1_1_0::back::transitions<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<(anonymous namespace)::fin_wait_1>, boost::sml::v1_1_0::front::state<(anonymous namespace)::established (boost::sml::v1_1_0::front::initial_state)>, boost::sml::v1_1_0::front::event<(anonymous namespace)::release>, boost::sml::v1_1_0::front::always, boost::sml::v1_1_0::aux::zero_wrapper<(anonymous namespace)::$_0, void> > >::execute<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::state_t&) at boost/sml.hpp:883
#11	0x000000010000132c in bool boost::sml::v1_1_0::back::policies::jump_table::dispatch<0, boost::sml::v1_1_0::back::get_event_mapping_impl_helper<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::mappings>, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >, unsigned char, (anonymous namespace)::release, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >, (anonymous namespace)::established, (anonymous namespace)::fin_wait_1, (anonymous namespace)::fin_wait_2, (anonymous namespace)::timed_wait, boost::sml::v1_1_0::back::terminate_state>(boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >&, unsigned char&, (anonymous namespace)::release const&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::aux::type_list<(anonymous namespace)::established, (anonymous namespace)::fin_wait_1, (anonymous namespace)::fin_wait_2, (anonymous namespace)::timed_wait, boost::sml::v1_1_0::back::terminate_state> const&) [inlined] at boost/sml.hpp:1137
#12	0x00000001000012ed in bool boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event_impl<boost::sml::v1_1_0::back::get_event_mapping_impl_helper<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::mappings>, (anonymous namespace)::release, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >, (anonymous namespace)::established, (anonymous namespace)::fin_wait_1, (anonymous namespace)::fin_wait_2, (anonymous namespace)::timed_wait, boost::sml::v1_1_0::back::terminate_state>((anonymous namespace)::release const&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::aux::type_list<(anonymous namespace)::established, (anonymous namespace)::fin_wait_1, (anonymous namespace)::fin_wait_2, (anonymous namespace)::timed_wait, boost::sml::v1_1_0::back::terminate_state> const&, boost::sml::v1_1_0::aux::index_sequence<0>) [inlined] at boost/sml.hpp:1615
#13	0x00000001000012ed in bool boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event_noexcept<boost::sml::v1_1_0::back::get_event_mapping_impl_helper<(anonymous namespace)::release, boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::mappings>, (anonymous namespace)::release, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&, boost::sml::v1_1_0::aux::integral_constant<bool, false>) [inlined] at boost/sml.hpp:1652
#14	0x00000001000012ed in bool boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event<(anonymous namespace)::release, boost::sml::v1_1_0::aux::pool<>, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > > >((anonymous namespace)::release const&, boost::sml::v1_1_0::aux::pool<>&, boost::sml::v1_1_0::aux::pool<boost::sml::v1_1_0::back::sm_impl<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> > >&) [inlined] at boost/sml.hpp:1492
#15	0x00000001000012ed in void boost::sml::v1_1_0::back::sm<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event<(anonymous namespace)::release, 0>((anonymous namespace)::release const&) [inlined] at boost/sml.hpp:1896
#16	0x00000001000012e2 in main at main.cpp:48
#17	0x00000001000012ed in void boost::sml::v1_1_0::back::sm<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event<(anonymous namespace)::release, 0>((anonymous namespace)::release const&) [inlined] at boost/sml.hpp:1896
#18	0x00000001000012e2 in main at main.cpp:48
#19	0x00000001000012ed in void boost::sml::v1_1_0::back::sm<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event<(anonymous namespace)::release, 0>((anonymous namespace)::release const&) [inlined] at boost/sml.hpp:1896
#20	0x00000001000012e2 in main at main.cpp:48
#21	0x00000001000012ed in void boost::sml::v1_1_0::back::sm<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event<(anonymous namespace)::release, 0>((anonymous namespace)::release const&) [inlined] at boost/sml.hpp:1896
#22	0x00000001000012e2 in main at main.cpp:48
#23	0x00000001000012ed in void boost::sml::v1_1_0::back::sm<boost::sml::v1_1_0::back::sm_policy<(anonymous namespace)::hello_world> >::process_event<(anonymous namespace)::release, 0>((anonymous namespace)::release const&) [inlined] at boost/sml.hpp:1896
#24	0x00000001000012e2 in main at main.cpp:48
#25	0x00000001000012e2 in main at main.cpp:46
#26	0x00007fff77124085 in start ()
#27	0x00007fff77124085 in start ()

Repro case:

#include <boost/sml.hpp>
#include <cassert>

namespace sml = boost::sml;

namespace {
    // events
    struct release {};
    struct ack {};
    struct fin {};
    struct timeout {};
    
    // guards
    const auto is_ack_valid = [](const ack&) { return true; };
    const auto is_fin_valid = [](const fin&) { return true; };
    
    // actions
    const auto send_fin = [] {};
    const auto send_ack = [] {};
    
    class established;
    class fin_wait_1;
    class fin_wait_2;
    class timed_wait;
    
    struct hello_world {
        auto operator()() const {
            using namespace sml;
            // clang-format off
            return make_transition_table(
                                         *state<established> + event<release> / send_fin = state<fin_wait_1>,
                                         state<fin_wait_1> + event<ack> [ is_ack_valid ] = state<fin_wait_2>,
                                         state<fin_wait_2> + event<fin> [ is_fin_valid ] / send_ack = state<timed_wait>,
                                         state<timed_wait> + event<timeout> / send_ack = X
                                         );
            // clang-format on
        }
    };
}

int main() {
    using namespace sml;
    
    sm<hello_world> sm;
    assert(sm.is(state<established>));
    
    sm.process_event(release{});
    assert(sm.is(state<fin_wait_1>));
    
    sm.process_event(ack{});
    assert(sm.is(state<fin_wait_2>));
    
    sm.process_event(fin{});
    assert(sm.is(state<timed_wait>));
    
    sm.process_event(timeout{});
    assert(sm.is(X));  // released
}

arrtchiu avatar Jan 30 '19 07:01 arrtchiu

Probably this https://github.com/boost-experimental/sml/issues/241#issuecomment-467998683 apply here not in issue #241

apmanol avatar Feb 27 '19 19:02 apmanol

building with -DBOOST_SML_CFG_DISABLE_MIN_SIZE fixes for me

tralamazza avatar Mar 22 '22 16:03 tralamazza

Still true for -O1, -O2, -O3, -Os, -Oz: compiler explorer.

b1ackviking avatar Sep 20 '22 07:09 b1ackviking