( bzt | 2025. 04. 27., v – 21:59 )

Szerkesztve: 2025. 04. 27., v – 22:19

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...