lundi 18 janvier 2010

dangling pointers(pointeurs ballants)

dangling pointers en programmation sont des pointeurs qui ne pointent pas vers un objet valide du type approprié.ils sont survenus lorsque un objet est supprimé ou désalloué sans modifier la valeur des pointeurs qui pointent cet objet. alors que le pointeur pointe toujours vers l'emplacement mémoire désalloué. et le Système peut réaffecter l'espace mémoire précedement liberer un a autre processus.
dans ce cas si le programme d'origine déreference le pointeur un comportement imprévisible peut se produire.
c'est le meme cas ou le programme ecrit les données dans la zone mémoire pointée par le dangling pointer,une corruption silencieuse des données non-liés peut se produire conduisant a des bogues subtiles extrêmement difficile à les détecter , des erruers de segmentation ou des defauts de protection générals(sous Windows).
Si les Données écrasées sont des données de compatibilité utilisé par allocataire mémoire du Système la corruption peut causer des instabilités de ce dernier.

Les Causes des dangling pointers:
dans beaucoup de languages de programmation(language C par exemple) la suppression d'un objet a partir de la mémoire de maniere explicite ou implicite ne modifie pas les pas les pointeurs associés.le pointeur point toujours vers le meme emplacement mémoire meme si la reference a été supprimé et peut etre maintenant utilisés par d'autres processus.
Exemple:

char *dp=NULL;

/*...*/
{
char c; /* c maintenant est hors porté */

dp=&c; /* dp est un dangling pointer */
}


Resoudre le Probleme de Dangling pointer

une Solution pour resoudre ce qui précède est d'attribuer la valeur NULL a dp immédiatement avant que le bloc interne est quitté .
une autre solution serait de garantir que dp ne serait pas utilisé a nouveau sans initialisation supplementaire.

-une autre source fréquente de ce probleme (dangling pointers)est une combinaison confuse des appels malloc( ) et free( ) , un pointeur devient ballant lorseque le bloc mémoire pointé est libéré. une façon d'éviter cela est de s'assurer de réinitialiser le pointeur a NULL apres la liberation de sa reference.
Exemple:


{

char *dp=malloc(A_const);

/*........*/

free(dp); /* il devient un pointeur ballant */

dp=NULL ; /*maintenant il n'est plus ballant*/

/*........*/

}

1 commentaire:

Anonyme a dit…

Lire le blog en entier, pretty good