[OSy] zahada: Volani funkce promenneho poctu parametru pred navratem z jine funkci

David Matousek david at matousec.com
Tue Oct 30 11:27:39 CET 2007


Zdravim,

Ano, ale co kdyz je to chyba kompilatoru?
V jake situaci uz jsem opravnen neco takoveho tvrdit?

Prave jsem vzal Kalisto 0.7.2, pridal jsem printk, panic
do exc.c jsem nakonec exception() pridal pred return
   printk("exception done\n");

a konecne do example.c jsem do example() na zacatek dal nasledujici:

   int volatile i=0x12345678;
   while (i==0x12345678)
   {
     if (i!=0x12345678) panic("i = 0x%x\n",i);
   }
   panic("i = 0x%x\n",i);


Todle je svym zpusobem minimalni priklad.

takle nejak vypada printk:

unsigned int printk(const char *format,...)
{
   unsigned int res=0;

   va_list args;
   va_start(args,format);

   res=printk_internal(format,args);

   va_end(args);

   return res;
}


a printk_internal je uz jedno co je (panikari to jak s prazdnym telem funkce, tak s normalni implementaci).
kdyz je printk_internal implementovano, tak panic vypise "i = 0x12345678"
tzn. v takto upravenem Kalisto se stane uplne presne to, co jsem popisoval pro nas kernel.

Uz mi nejak dochazi napady, co bych mel jeste zjistovat.
Proste si myslim, ze va_* funkce nekorektne nakladaji se zasobnikem v pripade,
ze se ta funkce s promennym poctem parametru vola na konci jine funkce.

A zda se byt uplne jedno, ktera funkce to je,
kdyz jsem ted presunul ten

   printk("exception done\n");

z konce exception() do konce schedule()
tak je vysledek naprosto stejny, takze to neni tim, ze exception je svym zpusobem specialni
(je volana z rucne psaneho assemblerovskeho kodu). schedule() je normalni C funkce,
ktera je volana z jine normalni C funkce interrupt(). Tim jsem vyloucil chybu v implementaci
handle_general_exception a dal uz nevim, co bych mohl zjistovat.


DM




Martin Decky wrote:
>> -fno-optimize-sibling-calls funguje krasne. Kdyz se nebudete zlobit,
>> tak prozkoumani tohoto bugu odlozim na nejaky volny cas a prozatim
>> se spokojim s vypnutim teto optimalizace.
> 
> Pro pruchod testy zakladniho zadani lze toto docasne reseni akceptovat,
> ale urcite se na to zamerte pred odevzdanim pokrocileho zadani (jinak
> bychom to totiz museli klasifikovat jako exemplarni priklad
> "neprirozeneho omezeni").
> 
> Pokud je nejaka opravdu dulezita vec, kterou byste si meli z predmetu
> Operacni systemy odnest, tak je to ten fakt, ze chyby nevznikaji a
> neresi se jen tak samy od sebe. Vzdy existuje konkretni pricina a tu je
> potreba velmi precizne a nade vsi pochybnost vypatrat, aby bylo mozne
> chybu odstranit.
> 
> Chci tim rici, ze -fno-optimize-sibling-calls je velmi pravdepodobne jen
> symptomaticka lecba .. ale ta chyba tam je nejspis porad a muze se
> projevit nekdy jindy jeste hure ..
> 
> 
> M.D.
> 
> _______________________________________________
> OSy mailing list
> OSy at dsrg.mff.cuni.cz
> https://dsrg.mff.cuni.cz/mailman/listinfo/osy




More information about the NSWI004 mailing list