Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria...

13
Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08

Transcript of Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria...

Page 1: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

Laboratorio di Linguaggi

lezione VIII B:

Puntatori e Pasticci

Marco Tarini

Università dell’Insubria

Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese

Corso di Laurea in Informatica

Anno Accademico 2007/08

Page 2: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• memory leak (“falla di memoria”)

int una_funzione (){ int *un_puntatore; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* fine della funzione */ return 0;}

Manca la deallocazione! ( free(un_puntatore); )

All'uscita della funzione il puntatore "un_puntatore" è perso per sempre, e con lui la possibilità di liberare ("sprenotare", per così dire) la memoria.Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria

Page 3: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• un altro caso di memory leak

... int *un_puntatore; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* rialloco un altro vettore */ un_puntatore = (int*)calloc( 100, sizeof(int));

Manca la deallocazione! ( free(un_puntatore); )

Anche qui, il puntatore "un_puntatore" è perso per sempre, econ lui la possibilità di liberare ("sprenotare", per così dire) la memoria.Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria

Page 4: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• un altro caso di memory leak

... int *un_puntatore, i; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* rialloco un altro vettore */ un_puntatore = &i;

Manca la deallocazione! ( free(un_puntatore); )

Anche qui, il puntatore "un_puntatore" è perso per sempre, econ lui la possibilità di liberare ("sprenotare", per così dire) la memoria.Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria

Page 5: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• stale pointer (“puntatore andato a male”)

/* funzione che restituisce un puntatore ad un intero */int* una_funzione (){ int *punt; int x=10; ... return &x; /* restituisci il puntatore che punta alla variabile x */}

la variabile x non sopravvive al termine della funzione!

l'indirizzo di memoria &x non è più valido allora!

Page 6: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• dereferenced NULL

int *punt = NULL; * punt = 10;

Errore, ma nessun disastro, il sistema se ne accorge in run time (hopefully)...

L’esecuzione terimina (con un segmentation fault)

Page 7: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• dangling pointers (puntatori penzolanti)

int *punt ; * punt = 10;

chissà in che locazione verrà scritto quel dieci...

Page 8: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• overrun screw (indicizzare oltre i boundaries)

int *punt = (int*) calloc(5,sizeof(int)); punt[5] = 10;

chissà in che locazione verrà scritto quel dieci...

Page 9: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• overrun screw (indicizzare oltre i boundaries)

int punt[ 5 ]; punt[5] = 10;

chissà in che locazione verrà scritto quel dieci...

Page 10: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• "fandango on core" (andare con un puntatore oltre i boundaries)

int *punt = (int*) malloc(sizeof(int)); * punt[5] = 10;

chissà in che locazione verrà scritto quel dieci...

* punt ++; * punt = 10;

Page 11: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• uso dopo deallocazione

chissà in che locazione verrà scritto quel dieci...

int *punt = (int*) calloc(10,sizeof(int)); ... free(punt); * punt = 10;

Page 12: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• altro errore ...

/* funzione che restituisce un puntatore ad un intero */int* una_funzione (){ int x; x=10; ... free( &x ); /* libera la memoria usata da x (?) */}

le variabili allocate staticamente (in maniera automatica)vengono anche disallocate automaticamente alla fine del blocco!

regola d’oro:free va usato solo con i puntatori restituiti da malloc / calloc

Page 13: Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di.

M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a

Puntatori: pasticci

• altro errore comune : aliasing bug

... int *x, *y; /* alloco px */ x= (int*) malloc(sizeof(int)); /* assegno y = x. Ora x e y puntano allo stesso blocco di memoria */ y = x; /* uso x */ ... /* libero x */ free( x ); /* uso y */ *y = 10;

medicina: meglio usare un solo puntatore per ogni blocco di memoria allocato