sml
sml copied to clipboard
Clang UBSan Violation (Insufficient object size) when compiled with `-O2` or above
REPRO
- Use a lambda as a guard or action, stored with
autoorconst auto. - Compile with
-O3and run with undefined-behaviour sanitiser (UBSan).
ACTUAL UBSan reports "Insufficient object size"
EXPECTED No undefined behaviour detected
NOTES:
- Does not repro on
-O0or-O - Does not repro if the lambda is stored inside
std::function<..>instead ofauto. - 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
}
Probably this https://github.com/boost-experimental/sml/issues/241#issuecomment-467998683 apply here not in issue #241
building with -DBOOST_SML_CFG_DISABLE_MIN_SIZE fixes for me
Still true for -O1, -O2, -O3, -Os, -Oz: compiler explorer.