Size: a a a

2020 July 08

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Спасибо
источник

m

magras in pro.cxx
Но я не могу придумать к каким последствиям может привести нарушение правил лайфтайма на практике.
источник

VS

Vlad Serebrennikov in pro.cxx
magras
Но я не могу придумать к каким последствиям может привести нарушение правил лайфтайма на практике.
работа с мусором или частью другого объекта по невалидному указателю не подходит?
источник

VS

Vlad Serebrennikov in pro.cxx
когда он указывал на объект на стеке, а потом время жизни того объекта закончилось
источник

VS

Vlad Serebrennikov in pro.cxx
или речь о данном конкретном случае с reinterpret_cast?
источник

m

magras in pro.cxx
Vlad Serebrennikov
работа с мусором или частью другого объекта по невалидному указателю не подходит?
Это немного о другом. Я о таком коде (до с++20):
void* p = malloc(sizeof(int), 1);
int* i = reinterpret_cast<int*>(p);
i = 42;
источник

VS

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

VS

Vlad Serebrennikov in pro.cxx
но если кастить к указателю на нетривиально конструируемый тип, то объект может быть в невалидном состоянии
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Vlad Serebrennikov
но если кастить к указателю на нетривиально конструируемый тип, то объект может быть в невалидном состоянии
Ну если из сети поток байт получается и к объекту кастится или по сети передается?
источник

VS

Vlad Serebrennikov in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
Ну если из сети поток байт получается и к объекту кастится или по сети передается?
объект, состоящий из потока байт, наверняка тривиально конструируем
источник

VS

Vlad Serebrennikov in pro.cxx
то есть не требует выполнения кода для конструирования
источник

m

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

P

Pepe 🐸 in pro.cxx
можно еще пояснить: есть память от малоока, сначала скастнутая к uint8_t*, это безопасно, потом инициализированная, завернутая в unique пойнтер. Дальше другая функция берет, кастуеь к int64_t*. Как тут плейсмент нью использовать?
источник

VS

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

P

Pepe 🐸 in pro.cxx
или имелось ввиду плейсмент нью только для инициализации?
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Pepe 🐸
или имелось ввиду плейсмент нью только для инициализации?
Да
источник

VS

Vlad Serebrennikov in pro.cxx
Pepe 🐸
можно еще пояснить: есть память от малоока, сначала скастнутая к uint8_t*, это безопасно, потом инициализированная, завернутая в unique пойнтер. Дальше другая функция берет, кастуеь к int64_t*. Как тут плейсмент нью использовать?
может, расскажи, как ты дошел до такой жизни

ты не контролируешь ни того, кто создает uint8_t*, ни того, кто требует int64_t*?
источник

P

Pepe 🐸 in pro.cxx
Vlad Serebrennikov
может, расскажи, как ты дошел до такой жизни

ты не контролируешь ни того, кто создает uint8_t*, ни того, кто требует int64_t*?
я пока еще разбираюсь, это уже чей то PR который я ревьюю. Я вижу что аллокатор делает один пойнтер, а кастуется к другому, пока не разобрался почему так и необходимо ли это
источник

VS

Vlad Serebrennikov in pro.cxx
в таком случае этот PR явно требует доработки
источник

m

magras in pro.cxx
Vlad Serebrennikov
само собой
я оставался в рамках malloc
Я просто не вижу, что компилятор может сделать с кодом такого плана. Понятно, что это UB по стандарту, но что может пойти не так? Я сейчас не говорю, что надо так писать, но цель же топик стартера убедить, что это опасно и так делать не надо.
источник