boost-ext / sml

C++14 State Machine library
https://boost-ext.github.io/sml
Boost Software License 1.0
1.1k stars 173 forks source link

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

Open arrtchiu opened 5 years ago

arrtchiu commented 5 years ago

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:

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
}
apmanol commented 5 years ago

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

tralamazza commented 2 years ago

building with -DBOOST_SML_CFG_DISABLE_MIN_SIZE fixes for me

b1ackviking commented 1 year ago

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