-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
-\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.
-
-Una modalità alternativa per effettuare dei controlli di consistenza sullo
-stato delle allocazioni di memoria eseguite con \func{malloc}, anche questa
-fornita come estensione specifica (e non standard) delle \acr{glibc}, è quella
-di utilizzare la funzione \funcd{mcheck}, che deve essere chiamata prima di
-eseguire qualunque allocazione con \func{malloc}; il suo prototipo è:
-\begin{prototype}{mcheck.h}{mcheck(void (*abortfn) (enum mcheck\_status
- status))}
- Attiva i controlli di consistenza delle allocazioni eseguite da \func{malloc}.
-
- \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
- fallimento; \var{errno} non viene impostata.}
-\end{prototype}
-
-La funzione consente di registrare una funzione di emergenza, da passare come
-argomento, che verrà eseguita tutte le volte che, in una successiva esecuzione
-di \func{malloc}, venissero trovate delle inconsistenze, come delle operazioni
-di scrittura oltre i limiti dei buffer allocati. Per questo motivo la funzione
-deve essere chiamata prima di qualunque allocazione di memoria, altrimenti
-fallirà con un valore di ritorno pari a $-1$.
-
-Se come argomento di \func{mcheck} si passa \val{NULL} verrà utilizzata una
-funzione predefinita che stampa un messaggio di errore ed invoca la funzione
-\func{abort} (vedi sez.~\ref{sec:sig_alarm_abort}), altrimenti si dovrà create
-una funzione personalizzata che verrà eseguita ricevendo un unico argomento di
-tipo \type{mcheck\_status},\footnote{trattasi in sostanza di un codice di
- errore che la funzione di emergenza potrà utilizzare per prendere le
- opportune azioni.} un tipo enumerato che può assumere soltanto i valori di
-tab.~\ref{tab:mcheck_status_value}.
+errori di programmazione. Esempi di questi errori sono i \itindex{double~free}
+\textit{double free}, 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}.
+
+Abbiamo visto in sez.~\ref{sec:proc_mem_lock} come una prima funzionalità di
+ausilio nella ricerca di questi errori sia l'uso della variabile di ambiente
+\envvar{MALLOC\_CHECK\_}. Una modalità alternativa per effettuare dei
+controlli di consistenza sullo stato delle allocazioni di memoria eseguite con
+\func{malloc}, anche questa fornita come estensione specifica (e non standard)
+della \acr{glibc}, è quella di utilizzare la funzione \funcd{mcheck}, che deve
+essere chiamata prima di eseguire qualunque allocazione con \func{malloc}; il
+suo prototipo è:
+
+\begin{funcproto}{
+\fhead{mcheck.h}
+\fdecl{int mcheck(void (*abortfn) (enum mcheck\_status status))}
+\fdesc{Attiva i controlli di consistenza delle allocazioni di memoria.}
+}
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errorre;
+ \var{errno} non viene impostata.}
+\end{funcproto}
+
+La funzione consente di registrare una funzione di emergenza che verrà
+eseguita tutte le volte che, in una successiva esecuzione di \func{malloc},
+venissero trovate delle inconsistenze, come delle operazioni di scrittura
+oltre i limiti dei buffer allocati. Per questo motivo la funzione deve essere
+chiamata prima di qualunque allocazione di memoria, altrimenti fallirà.
+
+Se come primo argomento di \func{mcheck} si passa \val{NULL} verrà utilizzata
+una funzione predefinita che stampa un messaggio di errore ed invoca la
+funzione \func{abort} (vedi sez.~\ref{sec:sig_alarm_abort}), altrimenti si
+dovrà creare una funzione personalizzata in grado di ricevere il tipo di
+errore ed agire di conseguenza.
+
+Nonostante la scarsa leggibilità del prototipo si tratta semplicemente di
+definire una funzione di tipo \code{void abortfn(enum mcheck\_status status)},
+che non deve restituire nulla e che deve avere un unico argomento di tipo
+\code{mcheck\_status}. In caso di errore la funzione verrà eseguita ricevendo
+un opportuno valore di \param{status} che è un tipo enumerato che può assumere
+soltanto i valori di tab.~\ref{tab:mcheck_status_value} che indicano la
+tipologia di errore riscontrata.