Alcuni vecchio codice che ho appena incontrato:Perché questo codice funziona ancora?
MLIST * new_mlist_link()
{
MLIST *new_link = (MLIST *) malloc(sizeof(MLIST));
new_link->next = NULL;
new_link->mapi = NULL;
new_link->result = 0;
}
Questo è stato chiamato a costruire una lista collegata, tuttavia ho notato non v'è alcuna dichiarazione:
return new_link;
Anche senza l'istruzione return lì, la lista è ancora stata costruita correttamente. Perché è successo?
Edit: Piattaforma: Mandriva 2009 a 64 bit Linux 2.6.24.7-server di GCC 4.2.3-6mnb1
Edit: divertente ... questo codice anche eseguito con successo su circa 5 diverse installazioni di Linux, tutta versioni/sapori differenti, così come un Mac.
Non c'è risposta possibile a parte la fortuna muto, a meno che (o forse anche se) si facci sapere quale piattaforma. – Potatoswatter
Questo rende un buon caso per l'utilizzo di un correttore di codice statico. – semaj
Interessante che funzionasse su così tante piattaforme. Ha solo una variabile locale, quindi deve essere abbastanza standard per GCC su Intel per memorizzare una singola variabile locale nell'EAX (o il suo equivalente a 64 bit), e anche per usare quel registro per i valori di ritorno. –