tsp-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE : [Tsp-devel] Malloc et free problèmes


From: Arquer Stephane
Subject: RE : [Tsp-devel] Malloc et free problèmes
Date: Tue, 13 Nov 2007 08:41:22 +0100


> -----Message d'origine-----
> De : address@hidden 
> [mailto:address@hidden
> rg] De la part de Frederik Deweerdt
> Envoyé : lundi 12 novembre 2007 18:53
> À : Transport Sample Protocol development list
> Objet : Re: [Tsp-devel] Malloc et free problèmes
> 
> 
> Salut Stéphane,
> 
> On Mon, Nov 12, 2007 at 05:56:36PM +0100, Arquer Stephane wrote:
> > Salut,
> > 
> > J'ai rencontré le problème suivant:
> > la fonction  bb_utils_build_sem_name(bb->name) ds posix_bb_sem_get, 
> > retourne une adresse = 0x8 qui n'est pas valide, le free 
> (de rtems) se 
> > plante donc car il ne retrouve pas le bon segment.
> > 
> > // code de bb_core_posix.c (posix rtems !)
> > static int posix_bb_sem_get(S_BB_T *bb, int create)
> > {
> >     int32_t retcode;
> >     char* name_sem = NULL;
> >     int oflag = 0;
> >     if (create)
> >             oflag = O_CREAT | O_EXCL;       
> >     name_sem = bb_utils_build_sem_name(bb->name);
> >     bb->priv.posix.sem_id = (sem_t *)sem_open(name_sem, 
> oflag | BB_SEM_ACCESS_RIGHT); 
> >     if ( bb->priv.posix.sem_id < 0) {
> >             LOG(BB_LOG_SEVERE, "BlackBoard::bb_create",
> >                 "Cannot create semaphore < %s >", name_sem);
> >             goto err;
> >     }
> >     free(name_sem); 
> >     return BB_OK;
> >       err:
> >     free(name_sem);
> >     return BB_NOK;
> > }
> Petie remarque de style: le goto sert à éviter d'avoir à 
> dupliquer le code de sortie dans les cas normaux ou d'erreur. 
> Du coup, une utilisation plus "conforme" serait la suivate: {
>       int32_t retcode = BB_OK;
>       [...]
>       if (sem_id < 0) {
>               retcode = BB_NOK;
>               goto err;
>       }
>       [...]
> err:
>       free(name_sem);
>       return retcode;
> }
> Comme ça tu n'as qu'un seul appel à free. Sinon, autant 
> éviter le goto et gérer l'erreur dans le if.
> > 
> > Pour éviter cela, j'ai modifié l'appel de sem_open :
> > bb->priv.posix.sem_id = (sem_t 
> > bb->*)sem_open(bb_utils_build_sem_name(bb->name),
> >                                             oflag | 
> BB_SEM_ACCESS_RIGHT);
> > 
> > Auriez-vous une idée de la provenance de ce type de problème ? 
> > (contexte de fonction ??)
> > 
> Que vaut bb->name dans ce cas? Le cas d'erreur qui vient à 
> l'esprit dans bb_utils_build_sem_name, c'est un bb->name qui 
> ne soit pas terminé par '\0'.

Le problème vient de l'adresse retournée par bb_utils_build_sem_name(bb->name): 
0x8 dans mon cas alors que la même opération dans le "main" de mon exécutif 
retourne une adresse valide du style 0x1e159d1f.
C'est comme il y avait un contexte local.


> > Merci d'avance.
> > 
> > sa
> > 
> > 
> > _______________________________________________
> > Tsp-devel mailing list
> > address@hidden 
> > http://lists.nongnu.org/mailman/listinfo/tsp-devel
> > 
> 
> 
> _______________________________________________
> Tsp-devel mailing list
> address@hidden 
> http://lists.nongnu.org/mailman/listinfo/tsp-devel
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]