--- rpl/src/instructions_d5.c 2011/11/18 09:51:33 1.77 +++ rpl/src/instructions_d5.c 2011/11/18 21:34:34 1.82 @@ -838,6 +838,7 @@ instruction_detach(struct_processus *s_e struct_liste_chainee *l_element_precedent; struct_liste_chainee *l_element_suivant; + struct_objet *s_copie; struct_objet *s_objet; struct_objet *s_objet_systeme; struct_objet *s_objet_temporaire; @@ -856,8 +857,6 @@ instruction_detach(struct_processus *s_e volatile logical1 variable_partagee; - volatile struct_objet *s_copie; - (*s_etat_processus).erreur_execution = d_ex; attente.tv_sec = 0; @@ -1956,6 +1955,18 @@ instruction_detach(struct_processus *s_e if ((*s_etat_processus).erreur_systeme == d_es) { + // Évite le warning variable s_copie might be clobbered by + // longjmp or vfork + struct_objet **s; + + if ((s = malloc(sizeof(struct_objet *))) == NULL) + { + (*s_etat_processus).erreur_execution = d_es_allocation_memoire; + return; + } + + (*s) = s_copie; + if (setjmp(contexte_processus) == 0) { if (variable_partagee == d_faux) @@ -1989,7 +2000,7 @@ instruction_detach(struct_processus *s_e } else { - if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur) + if (evaluation(s_etat_processus, (*s), 'E') == d_erreur) { if (((*s_etat_processus).erreur_execution == d_ex) && ((*s_etat_processus).erreur_systeme == d_es)) @@ -2000,7 +2011,9 @@ instruction_detach(struct_processus *s_e } else { - if ((*s_etat_processus).at_exit != NULL) + if (((*s_etat_processus).var_volatile_alarme == 0) + && ((*s_etat_processus).arret_depuis_abort == 0) + && ((*s_etat_processus).at_exit != NULL)) { (*s_etat_processus).var_volatile_requete_arret = 0; @@ -2014,9 +2027,11 @@ instruction_detach(struct_processus *s_e } } - liberation(s_etat_processus, s_copie); + liberation(s_etat_processus, (*s)); } } + + free(s); } liberation(s_etat_processus, (*s_etat_processus).at_exit);