Skip to content

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

Closed

Description

@arrtchiu

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
}

Activity

  1. apmanol commented on Feb 27, 2019

    @apmanol

    Probably this #241 (comment) apply here not in issue #241

  2. tralamazza commented on Mar 22, 2022

    @tralamazza

    building with -DBOOST_SML_CFG_DISABLE_MIN_SIZE fixes for me

  3. b1ackviking commented on Sep 20, 2022

    @b1ackviking

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions