Hi,
I tried running my program under Valgrind to look for any pesky memory
corruption bugs, but in addition to taking an inordinately long time to start
up (e.g. creating the font atlas takes 3 minutes), I get a lot of errors about
invalid reads and writes such as those listed in this attachment. What really
baffles me is that they show that the reads happened in a region of allocated
memory.
My initial guess is that it has something to do with my program handling memory
very weirdly: some of the code switches the stack pointer in order to implement
coroutines. In fact, Valgrind does warn of this.
My code is here in case anyone actually wants to try it:
https://gitlab.com/nagakawa/tdr
– T
==10767== Warning: client switching stacks? SP change: 0x1ffefff490 -->
0xa628318
==10767== to suppress, use: --max-stackframe=137247945080 or greater
start shot task
==10767== Invalid write of size 8
==10767== at 0x160941: kcrManagerYieldEx (kcr.c:563)
==10767== by 0x160A18: kcrYieldEx (kcr.c:589)
==10767== by 0x1352A5: kcr::yield()
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:227)
==10767== by 0x1299B4:
TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>&&)::$_0::operator()() const (TestGame.cpp:259)
==10767== by 0x12995D: void std::__invoke_impl<void,
TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>&&)::$_0&>(std::__invoke_other,
TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&)::$_0&)
(invoke.h:60)
==10767== by 0x12994D:
std::__invoke_result<TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0&>::type
std::__invoke<TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite>
>&&)::$_0&>(TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0&) (invoke.h:95)
==10767== by 0x12993D: decltype(auto)
std::__apply_impl<TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0&,
std::tuple<>&>(TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0&, std::tuple<>&, std::integer_sequence<unsigned long>)
(tuple:1678)
==10767== by 0x12990E: decltype(auto)
std::apply<TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0&,
std::tuple<>&>(TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0&, std::tuple<>&) (tuple:1687)
==10767== by 0x129821: void
kcr::proxyCallback<std::tuple<TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0, kcr::ManagerObserver::Entry
kcr::ManagerObserver::spawn<TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite>
>&&)::$_0>(TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel,
TDRTestView, TestSharedData, std::variant<Graze, Hit, ScorePopup,
SetBossSprite> >&&)::$_0&&)::{lambda()#1}, std::tuple<> > >(void*)
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:114)
==10767== by 0x160B34: ??? (switch.s:46)
==10767== by 0x160B34: ??? (switch.s:46)
==10767== by 0x5: ???
==10767== Address 0xa62a018 is 8 bytes inside a block of size 48 alloc'd
==10767== at 0x483877F: malloc (vg_replace_malloc.c:299)
==10767== by 0x15F47D: kcrManagerCreate (kcr.c:136)
==10767== by 0x133658: kcr::Manager::Manager()
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:198)
==10767== by 0x12C37F: tdr::GameModel<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::GameModel(tdr::GameModelOptions<TDRTestModel, TDRTestView, TestSharedData,
std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&)
(include/TDR/Game.h:100)
==10767== by 0x1271CC:
TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&)
(TestGame.cpp:225)
==10767== by 0x1418F5: void std::_Optional_base_impl<TDRTestModel,
std::_Optional_base<TDRTestModel, false, false>
>::_M_construct<tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite> >
>(tdr::GameModelOptions<TDRTestModel, TDRTestView, TestSharedData,
std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&) (optional:629)
==10767== by 0x13F721:
_ZNSt8optionalI12TDRTestModelE7emplaceIJN3tdr16GameModelOptionsIS0_11TDRTestView14TestSharedDataSt7variantIJ5Graze3Hit10ScorePopup13SetBossSpriteEEEEEEENSt9enable_ifIXsr16is_constructibleIS0_DpOT_EE5valueERS0_E4typeESH_
(optional:1140)
==10767== by 0x13F356: tdr::GameView<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::startStage(unsigned int) (include/TDR/Game.h:817)
==10767== by 0x12E168: tdr::GameView<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::initialise() (include/TDR/Game.h:698)
==10767== by 0x149FD4:
_ZN3agl21ScenedGLFWApplicationI14TestSharedDataE11insertSceneI11TDRTestViewEENSt9enable_ifIXsr3stdE12is_base_of_vINS_5SceneIS1_EET_EEPS8_E4typeEOSt10unique_ptrIS8_St14default_deleteIS8_EE
(include/AGL/ScenedGLFWApplication.h:116)
==10767== by 0x1496D3: test(char const*) (Test.cpp:75)
==10767== by 0x1498BA: main (Test.cpp:107)
==10767==
==10767== Invalid read of size 8
==10767== at 0x145611: TDRTestStage0::initialise()::$_1::operator()() const
(stage0.cpp:40)
==10767== by 0x1454C1: void
kcr::proxyCallback<std::tuple<TDRTestStage0::initialise()::$_1,
kcr::ManagerObserver::Entry
kcr::ManagerObserver::spawn<TDRTestStage0::initialise()::$_1>(TDRTestStage0::initialise()::$_1&&)::{lambda()#1},
std::tuple<> > >(void*)
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:114)
==10767== by 0x160B34: ??? (switch.s:46)
==10767== by 0x160B34: ??? (switch.s:46)
==10767== Address 0xa62a1e0 is 0 bytes inside a block of size 8 alloc'd
==10767== at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==10767== by 0x1453F6: kcr::ManagerObserver::Entry
kcr::ManagerObserver::spawnTeardown<TDRTestStage0::initialise()::$_1&,
kcr::ManagerObserver::Entry
kcr::ManagerObserver::spawn<TDRTestStage0::initialise()::$_1>(TDRTestStage0::initialise()::$_1&&)::{lambda()#1}>(TDRTestStage0::initialise()::$_1&&,
kcr::ManagerObserver::Entry
kcr::ManagerObserver::spawn<TDRTestStage0::initialise()::$_1>(TDRTestStage0::initialise()::$_1&&)::{lambda()#1}&&)
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:155)
==10767== by 0x144BF6: TDRTestStage0::initialise() (stage0.cpp:40)
==10767== by 0x12C46D: tdr::GameModel<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::GameModel(tdr::GameModelOptions<TDRTestModel, TDRTestView, TestSharedData,
std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&)
(include/TDR/Game.h:489)
==10767== by 0x1271CC:
TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&)
(TestGame.cpp:225)
==10767== by 0x1418F5: void std::_Optional_base_impl<TDRTestModel,
std::_Optional_base<TDRTestModel, false, false>
>::_M_construct<tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite> >
>(tdr::GameModelOptions<TDRTestModel, TDRTestView, TestSharedData,
std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&) (optional:629)
==10767== by 0x13F721:
_ZNSt8optionalI12TDRTestModelE7emplaceIJN3tdr16GameModelOptionsIS0_11TDRTestView14TestSharedDataSt7variantIJ5Graze3Hit10ScorePopup13SetBossSpriteEEEEEEENSt9enable_ifIXsr16is_constructibleIS0_DpOT_EE5valueERS0_E4typeESH_
(optional:1140)
==10767== by 0x13F356: tdr::GameView<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::startStage(unsigned int) (include/TDR/Game.h:817)
==10767== by 0x12E168: tdr::GameView<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::initialise() (include/TDR/Game.h:698)
==10767== by 0x149FD4:
_ZN3agl21ScenedGLFWApplicationI14TestSharedDataE11insertSceneI11TDRTestViewEENSt9enable_ifIXsr3stdE12is_base_of_vINS_5SceneIS1_EET_EEPS8_E4typeEOSt10unique_ptrIS8_St14default_deleteIS8_EE
(include/AGL/ScenedGLFWApplication.h:116)
==10767== by 0x1496D3: test(char const*) (Test.cpp:75)
==10767== by 0x1498BA: main (Test.cpp:107)
==10767==
==10767== Invalid write of size 8
==10767== at 0x160941: kcrManagerYieldEx (kcr.c:563)
==10767== by 0x160A18: kcrYieldEx (kcr.c:589)
==10767== by 0x1352A5: kcr::yield()
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:227)
==10767== by 0x139744: tdr::cwait(unsigned long) (include/TDR/yield.h:15)
==10767== by 0x14561D: TDRTestStage0::initialise()::$_1::operator()() const
(stage0.cpp:41)
==10767== by 0x1454C1: void
kcr::proxyCallback<std::tuple<TDRTestStage0::initialise()::$_1,
kcr::ManagerObserver::Entry
kcr::ManagerObserver::spawn<TDRTestStage0::initialise()::$_1>(TDRTestStage0::initialise()::$_1&&)::{lambda()#1},
std::tuple<> > >(void*)
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:114)
==10767== by 0x160B34: ??? (switch.s:46)
==10767== by 0x160B34: ??? (switch.s:46)
==10767== Address 0xa62a018 is 8 bytes inside a block of size 48 alloc'd
==10767== at 0x483877F: malloc (vg_replace_malloc.c:299)
==10767== by 0x15F47D: kcrManagerCreate (kcr.c:136)
==10767== by 0x133658: kcr::Manager::Manager()
(3rdparty/agc/kozet_coroutine/include/kozet_coroutine/kcr.h:198)
==10767== by 0x12C37F: tdr::GameModel<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::GameModel(tdr::GameModelOptions<TDRTestModel, TDRTestView, TestSharedData,
std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&)
(include/TDR/Game.h:100)
==10767== by 0x1271CC:
TDRTestModel::TDRTestModel(tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&)
(TestGame.cpp:225)
==10767== by 0x1418F5: void std::_Optional_base_impl<TDRTestModel,
std::_Optional_base<TDRTestModel, false, false>
>::_M_construct<tdr::GameModelOptions<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite> >
>(tdr::GameModelOptions<TDRTestModel, TDRTestView, TestSharedData,
std::variant<Graze, Hit, ScorePopup, SetBossSprite> >&&) (optional:629)
==10767== by 0x13F721:
_ZNSt8optionalI12TDRTestModelE7emplaceIJN3tdr16GameModelOptionsIS0_11TDRTestView14TestSharedDataSt7variantIJ5Graze3Hit10ScorePopup13SetBossSpriteEEEEEEENSt9enable_ifIXsr16is_constructibleIS0_DpOT_EE5valueERS0_E4typeESH_
(optional:1140)
==10767== by 0x13F356: tdr::GameView<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::startStage(unsigned int) (include/TDR/Game.h:817)
==10767== by 0x12E168: tdr::GameView<TDRTestModel, TDRTestView,
TestSharedData, std::variant<Graze, Hit, ScorePopup, SetBossSprite>
>::initialise() (include/TDR/Game.h:698)
==10767== by 0x149FD4:
_ZN3agl21ScenedGLFWApplicationI14TestSharedDataE11insertSceneI11TDRTestViewEENSt9enable_ifIXsr3stdE12is_base_of_vINS_5SceneIS1_EET_EEPS8_E4typeEOSt10unique_ptrIS8_St14default_deleteIS8_EE
(include/AGL/ScenedGLFWApplication.h:116)
==10767== by 0x1496D3: test(char const*) (Test.cpp:75)
==10767== by 0x1498BA: main (Test.cpp:107)
==10767==
_______________________________________________
Valgrind-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/valgrind-users