LINUX.ORG.RU

История изменений

Исправление kvpfs_2, (текущая версия) :

Насколько я в курсе кастовать объект к std::byte* можно (как минимум POD). И кастовать std::byte* (с правильным выравниванием) в POD тоже можно. И это не UB. А вот кастовать напрямую нельзя. И union, который делает ровно тоже самое нельзя.

В рамках C++, ответ — «нельзя». Во всех трёх случаях.

С чего это вдруг?

  1. Кастовать к char*/byte* можно абсолютно всё, для чтения и записи
  2. Кастовать массив байтов/чаров в типы с тривиальным ctr/destr - также можно в следующем случае - при создании массива чаров или возврат из malloc и смежных данный буффер находится как бы в состоянии суперпозиции и в нем можно создать любой implicit lifetime тип простым кастом без всякого ЮБ.
  3. Насколько понимаю, если в буфере кастом уже был создан объект в соответствии с пунктом 2, то в нем можно создать другой через std::start_lifetime_as()

Ну и очевидно, что т.к. implicit lifetime объект не имеет конструктор/деструктор, то нижележащий буфер не модифицируется. Всё это даёт возможность на законных основаниях, например, получить данные из сети и кастонуть их в структуру, у нее начнется лайфтайм, законно читаем структуру. До недавнего времени всё это было ЮБ, но вряд ли есть компилятор, который за это бил по рукам, фактически это всё давно работало

Исходная версия kvpfs_2, :

Насколько я в курсе кастовать объект к std::byte* можно (как минимум POD). И кастовать std::byte* (с правильным выравниванием) в POD тоже можно. И это не UB. А вот кастовать напрямую нельзя. И union, который делает ровно тоже самое нельзя.

В рамках C++, ответ — «нельзя». Во всех трёх случаях.

С чего это вдруг?

  1. Кастовать к char*/byte* можно абсолютно всё, для чтения и записи
  2. Кастовать массив байтов/чаров в типы с тривиальным ctr/destr - также можно в следующем случае - при создании массива чаров или возврат из malloc и смежных данный буффер находится как бы в состоянии суперпозиции и в нем можно создать любой implicit lifetime тип простым кастом без всякого ЮБ.
  3. Насколько понимаю, если в буфере кастом уже был создан объект в соответствии с пунктом 2, то в нем можно создать другой через std::start_lifetime_as()