From: Simone Piccardi Date: Thu, 12 Mar 2009 13:50:57 +0000 (+0000) Subject: Materiale su funzionalita` avanzate di malloc &C X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=faaa33346f9580cf7e5362cf4fc940d8d6817257 Materiale su funzionalita` avanzate di malloc &C --- diff --git a/process.tex b/process.tex index 4286f3f..15dea09 100644 --- a/process.tex +++ b/process.tex @@ -645,7 +645,7 @@ causando a lungo andare un esaurimento della memoria disponibile (e la probabile impossibilità di proseguire l'esecuzione del programma). Il problema è che l'esaurimento della memoria può avvenire in qualunque -momento, in corrispondenza ad una qualunque chiamata di \func{malloc}, che può +momento, in corrispondenza ad una qualunque chiamata di \func{malloc} che può essere in una sezione del codice che non ha alcuna relazione con la subroutine che contiene l'errore. Per questo motivo è sempre molto difficile trovare un \itindex{memory~leak} \textit{memory leak}. @@ -688,7 +688,9 @@ sostituti opportuni delle funzioni di allocazione in grado, senza neanche ricompilare il programma,\footnote{esempi sono \textit{Dmalloc} \href{http://dmalloc.com/}{\textsf{http://dmalloc.com/}} di Gray Watson ed \textit{Electric Fence} di Bruce Perens.} di eseguire diagnostiche anche -molto complesse riguardo l'allocazione della memoria. +molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle +funzionalità di ausilio presenti nelle \acr{glibc} in +sez.~\ref{sec:proc_memory_adv_management}. Una possibile alternativa all'uso di \func{malloc}, che non soffre dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in @@ -1065,6 +1067,39 @@ allocata con \func{posix\_memalign} pu \func{free}.\footnote{che in caso questo caso è quanto richiesto dallo standard.} +Un secondo caso in cui risulta estremamente utile poter avere un maggior +controllo delle modalità di allocazione della memoria è quello in cui cercano +errori di programmazione. Esempi di questi errori sono chiamate doppie alla +funzione \func{free} con lo stesso puntatore, o i cosiddetti +\itindex{buffer~overrun} \textit{buffer overrun}, cioè le scritture su un buffer +oltre le dimensioni della sua allocazione,\footnote{entrambe queste operazioni + causano in genere la corruzione dei dati di controllo delle funzioni di + allocazione, che vengono anch'essi mantenuti nello \itindex{heap} + \textit{heap} per tenere traccia delle zone di memoria allocata.} o i +classici \itindex{memory~leak} \textit{memory leak}. + +Una prima funzionalità di ausilio nella ricerca di questi errori viene fornita +dalla \acr{glibc} tramite l'uso della variabile di ambiente (vedi +sez.~\ref{sec:proc_environ}) \var{MALLOC\_CHECK\_}. Quando questa viene +definita al posto della versione ordinaria delle funzioni di allocazione +(\func{malloc}, \func{calloc}, \func{realloc}, e \func{free}) viene usata una +versione meno efficiente ma in grado di rilevare (e tollerare) alcuni degli +errori più semplici, come le doppie chiamate a \func{free} o i +\itindex{buffer~overrun} \textit{buffer overrun} di un byte.\footnote{uno + degli errori più comuni, causato ad esempio dalla scrittura di una stringa + di dimensione pari a quella del buffer, in cui ci si dimentica dello zero di + terminazione finale.} + +In questo caso a seconda del valore assegnato a \var{MALLOC\_CHECK\_} si +avranno diversi comportamenti: con 0 l'errore sarà ignorato, con 1 verrà +stampato un messaggio sullo \textit{standard error} (vedi +sez.~\ref{sec:file_std_stream}), con 2 verrà invocata la funzione \func{abort} +(vedi sez.~\ref{sec:sig_alarm_abort}) che termina il programma, con 3 viene +sia stampato il messaggio d'errore che abortito il programma. In genere è +opportuno definire la variabile ad un valore diverso da zero che consente di +rilevare un errore nel momento in cui avviene. + + % TODO: trattare le funzionalità avanzate di \func{malloc}