Dangling pointer

Da Wikipedia, l'enciclopedia libera.

Un dangling pointer, o puntatore pendente, nei linguaggi di programmazione, indica un puntatore che si riferisce ad un'area di memoria non più valida, perché già liberata o perché il puntatore viene utilizzato all'esterno del contesto di esistenza della variabile cui si riferisce. Poiché il sistema operativo può riassegnare e riutilizzare quella data locazione di memoria, l'utilizzo di un dangling pointer porta effetti impredicibili, che vanno dal segmentation fault (sistemi *NIX) o errore di protezione generale (sistemi Windows), con conseguente terminazione dell'applicazione che ha causato l'errore, alla corruzione di dati in memoria.

Alcune cause di dangling pointer[modifica | modifica sorgente]

Nei linguaggi di programmazione come il C, che prevedono che sia il programmatore ad occuparsi della liberazione della memoria dinamicamente allocata, i puntatori, come tutte le altre variabili, continuano a contenere l'ultimo valore che è stato loro assegnato, anche quando questo valore non è più valido. Quando ad esempio viene liberata la memoria a cui punta un certo puntatore, non è più possibile utilizzarlo senza riassegnarlo ad un'altra area di memoria.

Un esempio è riportato qui sotto:

int *i = (int *) malloc(sizeof(int));
 
/* ... */
 
free(i);
 
*i = 200;  /* a questo punto il valore contenuto in i non si riferisce più
            * ad un'area di memoria valida!
            */

Un'altra causa di dangling pointer, come detto in precedenza, può essere l'utilizzazione un puntatore che si riferisce ad una variabile fuori dal contesto di esistenza (o scope) di quest'ultima.

Ad esempio:

  int *i = NULL;
 
  {
    int cont = 3;
 
    i = &cont;
 
    /* ... */
 
    *i = 2;    /* equivale a scrivere cont = 2; */
  }
 
  *i = 200;  /* a questo punto cont non è più una variabile valida,
              * quindi i non si riferisce più ad un'area di memoria valida!
              */

Un ultimo esempio mostra un altro errore (in realtà molto simile al precedente) che frequentemente causa problemi di puntatori pendenti, ovvero il ritornare alla fine di una funzione, l'indirizzo di una variabile locale, non più valida al di fuori della funzione stessa:

  int *ritornaUnInt()
  {
    int cont = 3;
 
    return &cont;  /* il puntatore a cont non è valido al di fuori di questa funzione! */
  }