Certains vieux code que je viens de découvrir:Pourquoi ce code fonctionne-t-il toujours?
MLIST * new_mlist_link()
{
MLIST *new_link = (MLIST *) malloc(sizeof(MLIST));
new_link->next = NULL;
new_link->mapi = NULL;
new_link->result = 0;
}
Cela a été appelé à construire une liste chaînée, mais je remarqué qu'il n'y a pas de déclaration:
return new_link;
Même sans la déclaration de retour là-bas, la liste a encore été construite correctement. Pourquoi est-ce arrivé?
Edit: Plate-forme: Mandriva Linux 2009 64bit 2.6.24.7 serveur GCC 4.2.3-6mnb1
Edit: drôle ... ce code a également couru sur environ 5 succčs différentes installations de Linux, tout différentes versions/saveurs, ainsi qu'un Mac.
Il n'y a pas de réponse possible en dehors de la chance stupide, à moins que (ou peut-être même si) vous nous faites savoir quelle plate-forme. – Potatoswatter
Cela fait un bon cas pour l'utilisation d'un vérificateur de code statique. – semaj
Intéressant qu'il a couru sur tant de plates-formes. Il n'a qu'une seule variable locale, donc il doit être assez standard pour GCC sur Intel de stocker une seule variable locale dans l'EAX (ou son équivalent 64 bits), et aussi d'utiliser ce registre pour les valeurs de retour. –