Code:
void takarit(void){
int memoria[1000]; // ez ugyebar helyi valtozo, a veremben tarolva
for(int i=0; i<1000; i++)
memoria[i] = 0;
i = 0; // i helyet is
}
Elmeletileg ha ezt meghivjuk egy „problemas” fuggveny elott (mielott a valtozokat deklaraljuk), akkor minden helyi valtozo erteke 0 lesz. Gyakorlatilag ez mukodhet?
Nem biztos, a statikus paraméterek mindig a veremben tárlódnak (pl. „void func (char buf[200])”), de rémlik valami olyasmi, az újabb gcc esetén a lokális változók is egy ELF szekcióban tárolódnak (talán .tss), ami a program indulásakor a memóriába másolódik. Ez attól szálbiztos, hogy alapból használja a kernel TLS (thread-local storage) képességét. Ez okozhat olyan jelenséget, hogy a véletlenszerű érték nem véletlen, mert fordításkor kap egy értéket ami később nem változik meg. Ha ez így van, akkor egy -ftls-model=”local-dynamic” gcc paraméter után a progi vígan dobálja a sok NaN-t. Nektek melyik gcc van fent (nekem a 4.3.0)?
legutóbbi hsz