X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=a096d6a866c6d87f152ad5888b92fb17e9e8f294;hp=d3fa51d41ca3f9f6e280dd3d4056a61af62507eb;hb=9750c196d5ff86f50d77499b271ee2a29eda3407;hpb=39fd68b4edd01be7664153992dea276a4b9a3396 diff --git a/process.tex b/process.tex index d3fa51d..a096d6a 100644 --- a/process.tex +++ b/process.tex @@ -961,20 +961,51 @@ Il passaggio di una variabile \textit{by value} significa che in realt che viene passato alla subroutine è una copia del valore attuale di quella variabile, copia che la subroutine potrà modificare a piacere, senza che il valore originale nella routine chiamante venga toccato. In questo modo non -occorre preoccuparsi di eventuali effetti delle operazioni della subroutine. - -La maggior parte delle funzioni di libreria e delle system call funziona -esattamente in questo modo restituendo eventuali risultati alla routine -chiamante attraverso il valore di ritorno. Talvolta però è necessario che la -funzione possa restituire indietro alla funzione chiamate un valore relativo -ad uno dei sui parametri. - - +occorre preoccuparsi di eventuali effetti delle operazioni della subroutine +sulla variabile passata come parametro. + +Questo però va inteso nella maniera corretta. Il passaggio \textit{by value} +vale per qualunque variabile, puntatori compresi; quando però in una +subroutine si usano dei puntatori (ad esempio per scrivere in un buffer) in +realtà si va a modificare la zona di memoria a cui essi puntano, per cui anche +se i puntatori sono copie, i dati a cui essi puntano sono sempre gli stessi, e +le eventuali modifiche avranno effetto e saranno visibili anche nella routine +chiamante. + +Nella maggior parte delle funzioni di libreria e delle system call i puntatori +vengono usati per scambiare dati (attraverso buffer o strutture) e le +variabili semplici vengono usate per specificare parametri; in genere le +informazioni a riguardo dei risultati vengono passate alla routine chiamante +attraverso il valore di ritorno. È buona norma seguire questa pratica anche +nella programmazione normale. + + +Talvolta però è necessario che la funzione possa restituire indietro alla +funzione chiamante un valore relativo ad uno dei suoi parametri. Per far +questo si usa il cosiddetto \textit{value result argument}, si passa cioè, +invece di una normale variabile un puntatore; vedremo alcuni esempi di questa +modalità nelle funzioni che gestiscono i socket (in +\secref{sec:TCPel_functions}) in cui, per permettere al kernel di restituire +informazioni sulle dimensioni delle strutture degli indirizzi utilizzate, +viene usato questo meccanismo. \subsection{Potenziali problemi con le variabili automatiche} \label{sec:proc_auto_var} +Uno dei possibili problemi che si possono avere con le subroutine è quello di +restituire alla funzione chiamante dei dati che sono contenuti in una +variabile automatica. Ovviamente quando la subroutine ritorna la sezione +dello stack che conteneva la variabile automatica potrà essere riutilizzata da +una nuova funzione, con le conseguenze immaginabili di sovrapposizione. + +Per questo una delle regole fondamentali della programmazione in C è che +all'uscita di una funzione non deve restare nessun riferimento a variabili +locali di quella funzione; qualora necessiti di utilizzare variabili che +possano essere viste anche dalla funzione chiamante queste devono essere +allocate esplicitamente, o in maniera statica (usando variabili di tipo +\type{static} o \type{extern}), o dinamicamente con una delle funzioni della +famiglia \func{malloc}. \subsection{Il controllo di flusso non locale} \label{sec:proc_longjmp}