VIGYÁZAT! Törnek a korábbi kódok, ha explicit verziódefinícó nélkül fordítjátok, méghozzá nagyon nehezen debuggolható módon!
Ha van egy union, pl. "typedef union { char c; int i; } u;", és ezt globális változónál inicializálja az ember nullára, "u test = { 0 };", akkor minden szép és jó. NA DE! Ha lokális változóban van ugyanez, akkor csak 1 bájtot fog nullázni, a maradék 3 bájt random szemetet fog tartalmazni! Nem tudom, ki volt az a balfasz gcc fejlesztő, aki úgy gondolta, hogy ez a módosítás majd jó lesz bárkinek is... Nettó faszság, lássuk be.
typedef union { char c; int i; } u; u test1 = { 0 }; // ez jó, 4 bájtnyi nulla (globális, tehát .bss-be kerül) void balfasz_gcc_fejlesztes(void) { u test2 = { 0 }; // ez viszont nem, ez csak 1 bájtnyi nulla, a maradék továbbra is random szemét!!! (lokális, tehát a verembe kerül) }
Megoldás: "gcc -ansi" vagy "gcc -std=c17", és minden nyűg tovaszáll. Vagy explicit "memset(0)" minden union-t tartalmazó összetett lokális változóra, esetleg "gcc -fzero-init-padding-bits=unions", ha valamiért nagyon kell a C23...