История изменений
Исправление zurg, (текущая версия) :
Ну вот: https://godbolt.org/z/EY1bWPP6d, заодно видно что не важно стэк или не стэк. Благодаря УБ компилятор считает что указатель который вернул do_cast это какой-то другой указатель никак не связанный с &fl (и даже частично не пересекаются в памяти), поэтому пишет по постороннему указателю 1 и сразу вызывает ff(). Единственное чего добьёшся этим do_cast() - это заставишь компилятор гарантированно хранить где-то в памяти fl, что-бы утекший в do_cast() указатель был валидным. Константа вообще не обязана храниться где-то в рантайме, поэтому не важно чё там и как в железе происходит, совершенно абстрактное свойство типа( вместе с УБ)
Исходная версия zurg, :
Ну вот: https://godbolt.org/z/EY1bWPP6d, заодно видно что не важно стэк или не стэк. Благодаря УБ компилятор считает что указатель который вернул do_cast это какой-то другой указатель никак не связанный с &fl (и даже частично не пересекаются в памяти), поэтому пишет по постороннему указателю 1 и сразу вызывает ff(). Единственное чего добьёшся этим do_cast() - это заставишь компилятор гарантированно хранить где-то fl, что-бы утекший в do_cast() указатель был валидным. Константа вообще не обязана храниться где-то в рантайме, поэтому не важно чё там и как в железе происходит, совершенно абстрактное свойство типа( вместе с УБ)