Size: a a a

2020 July 08

m

magras in pro.cxx
magras
Или каком-нибудь:
static_assert(sizeof(int) == sizeof(float));
float f = 42;
int* i = reinterpret_cast<int*>(&f);
// use i
Хотя здесь нарушается алиасинг, поэтому тут я могу придумать как его сломать.
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
magras
Я просто не вижу, что компилятор может сделать с кодом такого плана. Понятно, что это UB по стандарту, но что может пойти не так? Я сейчас не говорю, что надо так писать, но цель же топик стартера убедить, что это опасно и так делать не надо.
Если кастуется из void*/char* вроде ничего и не может
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Борроучекеров в плюсы не завезли, чтобы за лайфтаймом следить
источник

VS

Vlad Serebrennikov in pro.cxx
magras
Или каком-нибудь:
static_assert(sizeof(int) == sizeof(float));
float f = 42;
int* i = reinterpret_cast<int*>(&f);
// use i
если говорить про этот код, то я не вижу, что тут может пойти не так
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
magras
Хотя здесь нарушается алиасинг, поэтому тут я могу придумать как его сломать.
Если передавать их в одну функцию?
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Так они одинакового размера как ты написал
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
И он вроде про алиасинг написал
источник

m

magras in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
Если передавать их в одну функцию?
Я подумал о другом:

static_assert(sizeof(int) == sizeof(float));
float f = 42;
int* i = reinterpret_cast<int*>(&f);
*i = 0;
assert(f == 42);

Этот assert может пройти успешно, так как копмилятор не обязан перечитывать значение f из памяти.
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
magras
Я подумал о другом:

static_assert(sizeof(int) == sizeof(float));
float f = 42;
int* i = reinterpret_cast<int*>(&f);
*i = 0;
assert(f == 42);

Этот assert может пройти успешно, так как копмилятор не обязан перечитывать значение f из памяти.
Прикольно
источник

d

disba1ancer in pro.cxx
magras
Я подумал о другом:

static_assert(sizeof(int) == sizeof(float));
float f = 42;
int* i = reinterpret_cast<int*>(&f);
*i = 0;
assert(f == 42);

Этот assert может пройти успешно, так как копмилятор не обязан перечитывать значение f из памяти.
может произойти всё что угодно, вплоть до открытия чёрной дыры, это же UB, но на практике, очень вероятно, сработает assert
источник

VS

Vlad Serebrennikov in pro.cxx
disba1ancer
может произойти всё что угодно, вплоть до открытия чёрной дыры, это же UB, но на практике, очень вероятно, сработает assert
это обсуждение о том, что находится по ту сторону горизонта событий
источник

m

magras in pro.cxx
disba1ancer
может произойти всё что угодно, вплоть до открытия чёрной дыры, это же UB, но на практике, очень вероятно, сработает assert
Теологическими доводами не всех можно переубедить.
источник

d

disba1ancer in pro.cxx
magras
Теологическими доводами не всех можно переубедить.
теологическими?
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
disba1ancer
может произойти всё что угодно, вплоть до открытия чёрной дыры, это же UB, но на практике, очень вероятно, сработает assert
А почему если float на double поменять ассерт не срабатывает?
источник

d

disba1ancer in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А почему если float на double поменять ассерт не срабатывает?
а вот UB... А вообще вполне объяснимо, была занулена и без того нулевая часть дабла, при условии, что дабл реализован по стандарту (какой не помню, но к плюсам отношения он не имеет)
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
disba1ancer
а вот UB... А вообще вполне объяснимо, была занулена и без того нулевая часть дабла, при условии, что дабл реализован по стандарту (какой не помню, но к плюсам отношения он не имеет)
Так в ассемблере там заново к памяти не обращаются. А вот если типы одинаковой длины, т.е. еще инт на инт64 поменять, то опять ассерт не проходит
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Если бы IEEE нарушался, то я думаю процесс в рантайме упал
источник

d

disba1ancer in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
Так в ассемблере там заново к памяти не обращаются. А вот если типы одинаковой длины, т.е. еще инт на инт64 поменять, то опять ассерт не проходит
что значит не проходит? смысле срабатывает?
источник

d

disba1ancer in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
Если бы IEEE нарушался, то я думаю процесс в рантайме упал
что значит нарушался/не нарушался?
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
disba1ancer
что значит не проходит? смысле срабатывает?
источник