Size: a a a

2020 March 07

TS

Till Schneider in pro.cxx
Artöm Bakri Al-Sarmini
union {
   struct {
       int a, b;
   } s1;
   struct {
       int c;
       long d;
       float e;
   } s2;
};
Независимо от того, активно s1 или s2, из a и c можно читать всегда
Это откуда?
источник

AB

Artöm Bakri Al-Sarmini in pro.cxx
Till Schneider
Это откуда?
Пример я придумал, вывод на основе https://t.me/ProCxx/370430
источник

FS

Flower Surgeon in pro.cxx
Artöm Bakri Al-Sarmini
common initial sequence
понял, спасибо
источник

FS

Flower Surgeon in pro.cxx
Till Schneider
Как только ты записал во что-то другое, то лайфтайм того объекта заканчивается и начинается лайфтайм этого
хм, возможно я слишком по-сишному мыслю здесь, конечно, но юнион (простой и именно такой, как я показал: три инта в структуре, три инта в массиве) мне всегда виделся эдаким набором отображений различных структур данных на одну память
источник

FS

Flower Surgeon in pro.cxx
другие случаи мы не рассматриваем, я согласен, что там всё иначе совсем
источник

AB

Artöm Bakri Al-Sarmini in pro.cxx
Flower Surgeon
хм, возможно я слишком по-сишному мыслю здесь, конечно, но юнион (простой и именно такой, как я показал: три инта в структуре, три инта в массиве) мне всегда виделся эдаким набором отображений различных структур данных на одну память
В си его так используют, за уб никто особо не парится
источник

TS

Till Schneider in pro.cxx
Flower Surgeon
хм, возможно я слишком по-сишному мыслю здесь, конечно, но юнион (простой и именно такой, как я показал: три инта в структуре, три инта в массиве) мне всегда виделся эдаким набором отображений различных структур данных на одну память
В сишке там не UB, а вот в плюсах UB
источник

P

Pepe 🐸 in pro.cxx
Artöm Bakri Al-Sarmini
В си его так используют, за уб никто особо не парится
в си есть compatible types:
▪ they are both structure/union/enumeration types, and
▪ (C99)if one is declared with a tag, the other must also be declared with the same tag.
▪ if both are completed types, their members must correspond exactly in number, be declared with compatible types, and have matching names.
источник

SE

Stanislav Ershov in pro.cxx
Till Schneider
В сишке там не UB, а вот в плюсах UB
В сях unspecified
источник

TS

Till Schneider in pro.cxx
Stanislav Ershov
В сях unspecified
Да, оно, я про то, что там не undefined =)
источник

DS

Dmitry Sokolov in pro.cxx
Ну вот в GCC между COW и SSO строками использовался подобный type punning, когда size/capacity хранили внутре allocated буфера, char sequence за пределами базового типа начинался.
источник

TS

Till Schneider in pro.cxx
Dmitry Sokolov
Ну вот в GCC между COW и SSO строками использовался подобный type punning, когда size/capacity хранили внутре allocated буфера, char sequence за пределами базового типа начинался.
Как мне однажды сказали, gcc может использовать ub в своём коде, а мы нет =)
источник

FS

Flower Surgeon in pro.cxx
Ну хорошо, я пока придерживаюсь такого мнения: в структуре подразумевается паддинг, в массиве — нет (как и сказал Анатолий). Потому и UB.
источник

P

Pepe 🐸 in pro.cxx
Dmitry Sokolov
Ну вот в GCC между COW и SSO строками использовался подобный type punning, когда size/capacity хранили внутре allocated буфера, char sequence за пределами базового типа начинался.
и в libjpeg
источник

P

Pepe 🐸 in pro.cxx
Flower Surgeon
Ну хорошо, я пока придерживаюсь такого мнения: в структуре подразумевается паддинг, в массиве — нет (как и сказал Анатолий). Потому и UB.
ну если там 3 инт'а то и паддинга скорее всего не будет) тогда не УБ
источник

TS

Till Schneider in pro.cxx
Dmitry Sokolov
Ну вот в GCC между COW и SSO строками использовался подобный type punning, когда size/capacity хранили внутре allocated буфера, char sequence за пределами базового типа начинался.
Я к тому, что вот в gcc вроде как в реализации offsetof разыменовывают нулевой указатель =) то есть это не особый показатель, что раз они так делают, то так делать можно
источник

FS

Flower Surgeon in pro.cxx
Pepe 🐸
ну если там 3 инт'а то и паддинга скорее всего не будет) тогда не УБ
Дык, про такой юзкейс речь и шла. Именно такая структура данных. Однородная.
источник

P

Pepe 🐸 in pro.cxx
Flower Surgeon
Дык, про такой юзкейс речь и шла. Именно такая структура данных. Однородная.
Ладно уже это обсуждали, так что подытожу: формально УБ но скорее всего работать будет

главное не попасть в ситуацию когда ты расчитываешь что считываемое значение обновится через другой пойнтер. Компайлер может просто проигнорить
источник

DS

Dmitry Sokolov in pro.cxx
Till Schneider
Я к тому, что вот в gcc вроде как в реализации offsetof разыменовывают нулевой указатель =) то есть это не особый показатель, что раз они так делают, то так делать можно
Ну там конечно не Char, Char к массиву кастовали, но типа Derived:Base{Char term=0;} в качестве default initialized использовался.
источник

FS

Flower Surgeon in pro.cxx
Pepe 🐸
Ладно уже это обсуждали, так что подытожу: формально УБ но скорее всего работать будет

главное не попасть в ситуацию когда ты расчитываешь что считываемое значение обновится через другой пойнтер. Компайлер может просто проигнорить
Да, меня такое вполне устраивает. Спасибо за понимание. :)
источник