Здравствуйте, sergii.p, Вы писали:
SP>ну так и такой код
SP>SP>char buffer[2] = {0x01, 0x02};
SP>short value = *(reinterpret_cast<short*>(buffer));
SP>
SP>строго говоря UB. Но никто же не отправляет программу в нокаут из-за этого. Это просто сломает невообразимую массу кода.
SP>Так что нельзя говорить, что при UB компилятор волен делать что угодно. Нифига он не волен
Он может делать оптимизации — это да. А вот так просто класть программу — это беспредел.
Я уже давал в соседнем обсуждении примечательную ссылку:
https://godbolt.org/g/o4HxtU
Этому примеру уже лет 8 или 9. В свое время он настоящий фурор произвел. Как наглядный пример того, что могут делать компиляторы.
Просто компиляторостроители пока еще сдерживаются совместимостью и отсутствием в старых стандартах некоторых новых механизмов (std::launder, std::bit_cast, std::start_lifetime_as). Чем дальше, тем меньше они будут сдерживаться. Типа того, что вам дали в руки std::bit_cast, вот и переписывайте свой говнокод, иначе наткнетесь на то, что компилятор очередное UB стал эксплуатировать.
Далеко не всем такое развитие событий нравится, но и остановить компиляторщиков вряд ли возможно.