Aggiornamento data copyright
[gapil.git] / intro.tex
index 4e77602afd08fa29150b4422b746098e09c4b75a..16679890d85e90ee63f411cc5894c37226c1d7ac 100644 (file)
--- a/intro.tex
+++ b/intro.tex
@@ -1,6 +1,6 @@
 %% intro.tex
 %%
-%% Copyright (C) 2000-2007 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -217,17 +217,17 @@ fig.~\ref{fig:intro_sys_struct}.
   \label{fig:intro_sys_struct}
 \end{figure}
 
-Normalmente ciascuna di queste chiamate al sistema viene rimappata in
-opportune funzioni con lo stesso nome definite dentro la Libreria Standard del
-C, che, oltre alle interfacce alle system call, contiene anche tutta la serie
-delle ulteriori funzioni definite dai vari standard, che sono comunemente
-usate nella programmazione.
+Normalmente ciascuna di queste chiamate al sistema fornite dal kernel viene
+rimappata in opportune funzioni con lo stesso nome definite dentro la Libreria
+Standard del C, che, oltre alle interfacce alle \textit{system call}, contiene
+anche tutta la serie delle ulteriori funzioni definite dai vari standard, che
+sono comunemente usate nella programmazione.
 
 Questo è importante da capire perché programmare in Linux significa anzitutto
 essere in grado di usare le varie interfacce contenute nella Libreria Standard
 del C, in quanto né il kernel, né il linguaggio C implementano direttamente
 operazioni comuni come l'allocazione dinamica della memoria, l'input/output
-bufferizzato o la manipolazione delle stringhe, presenti in qualunque
+bufferizzato sui file o la manipolazione delle stringhe, presenti in qualunque
 programma.
 
 Quanto appena illustrato mette in evidenza il fatto che nella stragrande
@@ -241,10 +241,11 @@ maggioranza dei casi,\footnote{esistono implementazioni diverse delle librerie
   rimpiazzo delle \acr{glibc} in tutti quei sistemi specializzati che
   richiedono una minima occupazione di memoria.} si dovrebbe usare il nome
 GNU/Linux (piuttosto che soltanto Linux) in quanto una parte essenziale del
-sistema (senza la quale niente funzionerebbe) è la GNU Standard C Library (in
-breve \acr{glibc}), ovvero la libreria realizzata dalla Free Software
-Foundation nella quale sono state implementate tutte le funzioni essenziali
-definite negli standard POSIX e ANSI C, utilizzabili da qualunque programma.
+sistema (senza la quale niente funzionerebbe) è la \textit{GNU Standard C
+  Library} (in breve \acr{glibc}), ovvero la libreria realizzata dalla Free
+Software Foundation nella quale sono state implementate tutte le funzioni
+essenziali definite negli standard POSIX e ANSI C, utilizzate da qualunque
+programma.
 
 Le funzioni di questa libreria sono quelle riportate dalla terza sezione del
 \textsl{Manuale di Programmazione di Unix} (cioè accessibili con il comando
@@ -254,6 +255,36 @@ di vista dell'implementazione, anche se poi, nella realizzazione di normali
 programmi, non si hanno differenze pratiche fra l'uso di una funzione di
 libreria e quello di una chiamata al sistema.
 
+Le librerie standard del C consentono comunque, nel caso non sia presente una
+specifica funzione di libreria corrispondente, di eseguire una \textit{system
+  call} generica tramite la funzione \funcd{syscall}, il cui prototipo,
+accessible se si è definita la macro \macro{\_GNU\_SOURCE}, (vedi
+sez.~\ref{sec:intro_gcc_glibc_std}) è:
+\begin{functions}
+  \headdecl{unistd.h}
+  \headdecl{sys/syscall.h}
+  \funcdecl{int syscall(int number, ...)}
+
+  Esegue la \textit{system call} indicata da \param{number}.
+\end{functions}
+
+La funzione richiede come primo argomento il numero della \textit{system call}
+da invocare, seguita dagli argomenti da passare alla stessa (che ovviamente
+dipendono da quest'ultima), e restituisce il codice di ritorno della
+\textit{system call} invocata. In generale un valore nullo indica il successo
+ed un valore negativo è un codice di errore che poi viene memorizzato nella
+variabile \var{errno} (sulla gestione degli errori torneremo in dettaglio in
+sez.~\ref{sec:sys_errors}).
+
+Il valore di \param{number} dipende sia dalla versione di kernel che
+dall'architettura,\footnote{in genere le vecchie \textit{system call} non
+  vengono eliminate e se ne aggiungono di nuove con nuovi numeri.}  ma
+ciascuna \textit{system call} viene in genere identificata da una costante
+nella forma \texttt{SYS\_*} dove al prefisso viene aggiunto il nome che spesso
+corrisponde anche alla omonima funzione di libreria; queste costanti sono
+definite nel file \texttt{sys/syscall.h}, ma si possono anche usare
+direttamente valori numerici.
+
 
 \subsection{Un sistema multiutente}
 \label{sec:intro_multiuser}
@@ -261,13 +292,15 @@ libreria e quello di una chiamata al sistema.
 Linux, come gli altri kernel Unix, nasce fin dall'inizio come sistema
 multiutente, cioè in grado di fare lavorare più persone in contemporanea. Per
 questo esistono una serie di meccanismi di sicurezza, che non sono previsti in
-sistemi operativi monoutente, e che occorre tenere presente.
+sistemi operativi monoutente, e che occorre tenere presenti.
 
 Il concetto base è quello di utente (\textit{user}) del sistema, le cui
 capacità rispetto a quello che può fare sono sottoposte a ben precisi limiti.
 Sono così previsti una serie di meccanismi per identificare i singoli utenti
 ed una serie di permessi e protezioni per impedire che utenti diversi possano
-danneggiarsi a vicenda o danneggiare il sistema.
+danneggiarsi a vicenda o danneggiare il sistema. Questi meccanismi sono
+realizzati dal kernel stesso ed attengono alle operazioni più varie, e
+torneremo su di essi in dettaglio più avanti.
 
 Ogni utente è identificato da un nome (l'\textit{username}), che è quello che
 viene richiesto all'ingresso nel sistema dalla procedura di \textit{login}
@@ -277,18 +310,17 @@ richiesta di una parola d'ordine (la \textit{password}), anche se sono
 possibili meccanismi diversi.\footnote{ad esempio usando la libreria PAM
   (\textit{Pluggable Autentication Methods}) è possibile astrarre
   completamente dai meccanismi di autenticazione e sostituire ad esempio l'uso
-  delle password con meccanismi di identificazione biometrica.}
-
-Eseguita la procedura di riconoscimento in genere il sistema manda in
-esecuzione un programma di interfaccia (che può essere la \textit{shell} su
-terminale o un'interfaccia grafica) che mette a disposizione dell'utente un
-meccanismo con cui questo può impartire comandi o eseguire altri programmi.
+  delle password con meccanismi di identificazione biometrica.} Eseguita la
+procedura di riconoscimento in genere il sistema manda in esecuzione un
+programma di interfaccia (che può essere la \textit{shell} su terminale o
+un'interfaccia grafica) che mette a disposizione dell'utente un meccanismo con
+cui questo può impartire comandi o eseguire altri programmi.
 
 Ogni utente appartiene anche ad almeno un gruppo (il cosiddetto
 \textit{default group}), ma può essere associato ad altri gruppi (i
 \textit{supplementary group}), questo permette di gestire i permessi di
 accesso ai file e quindi anche alle periferiche, in maniera più flessibile,
-definendo gruppi di lavoro, di accesso a determinate risorse, ecc.
+definendo gruppi di lavoro, di accesso a determinate risorse, ecc. 
 
 L'utente e il gruppo sono identificati da due numeri, la cui corrispondenza ad
 un nome espresso in caratteri è inserita nei due file \conffile{/etc/passwd} e
@@ -300,7 +332,8 @@ un nome espresso in caratteri 
 \textsl{user-ID}, ed indicato dall'acronimo \acr{uid}, e il \textit{group
   identifier}, detto in breve \textsl{group-ID}, ed identificato dall'acronimo
 \acr{gid}, e sono quelli che vengono usati dal kernel per identificare
-l'utente.
+l'utente; torneremo in dettaglio su questo argomento in
+sez.~\ref{sec:proc_perms}. 
  
 In questo modo il sistema è in grado di tenere traccia dell'utente a cui
 appartiene ciascun processo ed impedire ad altri utenti di interferire con
@@ -445,7 +478,7 @@ una infinita serie di problemi di portabilit
     \hline
     \type{caddr\_t} & Core address.\\
     \type{clock\_t} & Contatore del tempo di sistema.\\
-    \type{dev\_t}   & Numero di dispositivo.\\
+    \type{dev\_t}   & Numero di dispositivo (vedi sez.~\ref{sec:file_mknod}).\\
     \type{gid\_t}   & Identificatore di un gruppo.\\
     \type{ino\_t}   & Numero di \index{inode} \textit{inode}.\\
     \type{key\_t}   & Chiave per il System V IPC.\\
@@ -459,7 +492,9 @@ una infinita serie di problemi di portabilit
     \type{size\_t}  & Dimensione di un oggetto.\\
     \type{ssize\_t} & Dimensione in numero di byte ritornata dalle funzioni.\\
     \type{ptrdiff\_t}& Differenza fra due puntatori.\\
-    \type{time\_t}  & Numero di secondi (in tempo di calendario).\\
+    \type{time\_t}  & Numero di secondi (in \itindex{calendar~time}
+                      \textsl{tempo di calendario}, vedi 
+                      sez.~\ref{sec:sys_time}).\\
     \type{uid\_t}   & Identificatore di un utente.\\
     \hline
   \end{tabular}
@@ -578,12 +613,12 @@ mirante a standardizzare l'interfaccia con il sistema operativo.
 Ma gli standard POSIX non si limitano alla standardizzazione delle funzioni di
 libreria, e in seguito sono stati prodotti anche altri standard per la shell e
 i comandi di sistema (1003.2), per le estensioni \textit{real-time} e per i
-thread (rispettivamente 1003.1d e 1003.1c) per i socket (1003.1g) e vari
-altri.  In tab.~\ref{tab:intro_posix_std} è riportata una classificazione
-sommaria dei principali documenti prodotti, e di come sono identificati fra
-IEEE ed ISO; si tenga conto inoltre che molto spesso si usa l'estensione IEEE
-anche come aggiunta al nome POSIX; ad esempio è più comune parlare di POSIX.4
-come di POSIX.1b.
+\itindex{thread} \textit{thread} (rispettivamente 1003.1d e 1003.1c) per i
+socket (1003.1g) e vari altri.  In tab.~\ref{tab:intro_posix_std} è riportata
+una classificazione sommaria dei principali documenti prodotti, e di come sono
+identificati fra IEEE ed ISO; si tenga conto inoltre che molto spesso si usa
+l'estensione IEEE anche come aggiunta al nome POSIX; ad esempio è più comune
+parlare di POSIX.4 come di POSIX.1b.
 
 Si tenga presente inoltre che nuove specifiche e proposte di standardizzazione
 si aggiungono continuamente, mentre le versioni precedenti vengono riviste;
@@ -606,7 +641,7 @@ possono recuperare varie (e di norma piuttosto intricate) informazioni 
     POSIX.2 & 1003.2 & 9945-2& Comandi                                      \\
     POSIX.3 & 2003   &TR13210& Metodi di test                               \\
     POSIX.4 & 1003.1b &  --- & Estensioni real-time                         \\
-    POSIX.4a& 1003.1c &  --- & Thread                                       \\
+    POSIX.4a& 1003.1c &  --- & \itindex{thread} Thread                      \\
     POSIX.4b& 1003.1d &9945-1& Ulteriori estensioni real-time               \\
     POSIX.5 & 1003.5  & 14519& Interfaccia per il linguaggio ADA            \\
     POSIX.6 & 1003.2c,1e& 9945-2& Sicurezza                                 \\
@@ -632,11 +667,12 @@ sistema e che sono definite nello standard POSIX.2.
 
 Nelle versioni più recenti del kernel e delle librerie sono inoltre supportate
 ulteriori funzionalità aggiunte dallo standard POSIX.1c per quanto riguarda i
-\textit{thread} (vedi cap.~\ref{cha:threads}), e dallo standard POSIX.1b per
-quanto riguarda i segnali e lo \itindex{scheduler} scheduling real-time
-(sez.~\ref{sec:sig_real_time} e sez.~\ref{sec:proc_real_time}), la misura del
-tempo, i meccanismi di intercomunicazione (sez.~\ref{sec:ipc_posix}) e l'I/O
-asincrono (sez.~\ref{sec:file_asyncronous_io}).
+\itindex{thread} \textit{thread} (vedi cap.~\ref{cha:threads}), e dallo
+standard POSIX.1b per quanto riguarda i segnali e lo \itindex{scheduler}
+scheduling real-time (sez.~\ref{sec:sig_real_time} e
+sez.~\ref{sec:proc_real_time}), la misura del tempo, i meccanismi di
+intercomunicazione (sez.~\ref{sec:ipc_posix}) e l'I/O asincrono
+(sez.~\ref{sec:file_asyncronous_io}).
 
 Lo standard principale resta comunque POSIX.1, che continua ad evolversi; la
 versione più nota, cui gran parte delle implementazioni fanno riferimento, e
@@ -736,7 +772,7 @@ versione delle \textit{Single UNIX Specification} che verranno chiamate SUSv4.
 
 In Linux, grazie alle \acr{glibc}, la conformità agli standard appena
 descritti può essere richiesta sia attraverso l'uso di opportune opzioni del
-compilatore, il \texttt{gcc}, che definendo delle specifiche costanti prima
+compilatore (il \texttt{gcc}) che definendo delle specifiche costanti prima
 dell'inclusione dei file di dichiarazione (gli \textit{header file}) che
 definiscono le funzioni di libreria.
 
@@ -797,7 +833,7 @@ in esse definite, sono illustrate nel seguente elenco:
   \item un valore maggiore o uguale a ``\texttt{199506L}'' rende disponibili
     le funzionalità previste dallo standard POSIX.1 specificate nell'edizione
     del 1996 (\textit{ISO/IEC 9945-1:1996}), ed in particolare le definizioni
-    dello standard POSIX.1c per i \textit{thread};
+    dello standard POSIX.1c per i \itindex{thread} \textit{thread};
   \item a partire dalla versione 2.3.3 delle \acr{glibc} un valore maggiore o
     uguale a ``\texttt{200112L}'' rende disponibili le funzionalità di base
     previste dallo standard POSIX.1-2001, escludendo le estensioni XSI;
@@ -820,11 +856,13 @@ in esse definite, sono illustrate nel seguente elenco:
 
   Si tenga inoltre presente che la preferenza verso le versioni delle funzioni
   usate da BSD viene mantenuta soltanto se nessuna delle ulteriori macro di
-  specificazione di standard successivi (\macro{\_SVID\_SOURCE},
-  \macro{\_POSIX\_SOURCE}, \macro{\_POSIX\_C\_SOURCE},
+  specificazione di standard successivi (vale a dire una fra
+  \macro{\_POSIX\_C\_SOURCE}, \macro{\_POSIX\_SOURCE}, \macro{\_SVID\_SOURCE},
   \macro{\_XOPEN\_SOURCE}, \macro{\_XOPEN\_SOURCE\_EXTENDED} o
   \macro{\_GNU\_SOURCE}) è stata a sua volta attivata, nel qual caso queste
-  hanno la precedenza.
+  hanno la precedenza. Se però si definisce \macro{\_BSD\_SOURCE} dopo aver
+  definito una di queste macro, l'effetto sarà quello di dare la precedenza
+  alle funzioni in forma BSD.
 
 \item[\macro{\_SVID\_SOURCE}] definendo questa macro si rendono disponibili le
   funzionalità derivate da SVID. Esse comprendono anche quelle definite negli
@@ -833,10 +871,11 @@ in esse definite, sono illustrate nel seguente elenco:
 
 \item[\macro{\_XOPEN\_SOURCE}] definendo questa macro si rendono disponibili
   le funzionalità descritte nella \textit{X/Open Portability Guide}. Anche
-  queste sono un sovrainsieme di quelle definite in POSIX.1 e POSIX.2 ed in
-  effetti sia \macro{\_POSIX\_SOURCE} che \macro{\_POSIX\_C\_SOURCE} vengono
-  automaticamente definite. Sono incluse anche ulteriori funzionalità
-  disponibili in BSD e SVID:
+  queste sono un sovrainsieme di quelle definite negli standard POSIX.1 e
+  POSIX.2 ed in effetti sia \macro{\_POSIX\_SOURCE} che
+  \macro{\_POSIX\_C\_SOURCE} vengono automaticamente definite. Sono incluse
+  anche ulteriori funzionalità disponibili in BSD e SVID, più una serie di
+  estensioni a secondo dei seguenti valori:
   \begin{itemize}
   \item la definizione della macro ad un valore qualunque attiva le
     funzionalità specificate negli standard POSIX.1, POSIX.2 e XPG4;
@@ -868,9 +907,9 @@ in esse definite, sono illustrate nel seguente elenco:
   compatibilità. 
 
 \item[\macro{\_GNU\_SOURCE}] definendo questa macro si rendono disponibili
-  tutte le funzionalità disponibili nei vari standard oltre a varie
-  estensioni. Gli standard coperti sono: ISO C89, ISO C99, POSIX.1, POSIX.2,
-  BSD, SVID, X/Open, SUS. 
+  tutte le funzionalità disponibili nei vari standard oltre a varie estensioni
+  specifiche presenti solo nelle \acr{glibc} ed in Linux. Gli standard coperti
+  sono: ISO C89, ISO C99, POSIX.1, POSIX.2, BSD, SVID, X/Open, SUS.
 
   L'uso di \macro{\_GNU\_SOURCE} è equivalente alla definizione contemporanea
   delle macro: \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
@@ -879,22 +918,26 @@ in esse definite, sono illustrate nel seguente elenco:
   ``\texttt{199506L}'' per le versioni delle \acr{glibc} precedenti la 2.5),
   \macro{\_XOPEN\_SOURCE\_EXTENDED} e \macro{\_XOPEN\_SOURCE} con valore 600
   (o 500 per le versioni delle \acr{glibc} precedenti la 2.2); oltre a queste
-  vengono pure attivate le ulteriori \macro{\_ATFILE\_SOURCE} e
+  vengono pure attivate le ulteriori due macro \macro{\_ATFILE\_SOURCE} e
   \macro{\_LARGEFILE64\_SOURCE} che definiscono funzioni previste
   esclusivamente dalle \acr{glibc}.
  
 \end{basedescript}
 
 Benché Linux supporti in maniera estensiva gli standard più diffusi, esistono
-comunque delle estensioni specifiche e delle funzionalità specifiche, non
-presenti in altri standard e lo stesso vale per le \acr{glibc} stesse, che
-definiscono anche delle ulteriori funzioni di libreria. Ovviamente l'uso di
-queste funzionalità deve essere evitato se si ha a cuore la portabilità, ma
-qualora questo non sia un requisito esse possono rivelarsi molto utili.
+comunque delle estensioni e funzionalità specifiche, non presenti in altri
+standard e lo stesso vale per le \acr{glibc} stesse, che definiscono anche
+delle ulteriori funzioni di libreria. Ovviamente l'uso di queste funzionalità
+deve essere evitato se si ha a cuore la portabilità, ma qualora questo non sia
+un requisito esse possono rivelarsi molto utili.
 
 Come per l'aderenza ai vari standard, le funzionalità aggiuntive possono
 essere rese esplicitamente disponibili tramite la definizione di opportune
-macro di preprocessore, che si sono illustrate nel seguente elenco:
+macro di preprocessore, alcune di queste vengono attivate con la definizione
+di \macro{\_GNU\_SOURCE}, mentre altre devono essere attivate esplicitamente,
+inoltre alcune estensioni possono essere attivate indipendentemente tramite
+una opportuna macro; queste estensioni sono illustrate nel seguente elenco:
+
 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
 
 \item[\macro{\_LARGEFILE\_SOURCE}] definendo questa macro si rendono
@@ -937,33 +980,53 @@ macro di preprocessore, che si sono illustrate nel seguente elenco:
   macro non ha nessun effetto.
 
 \item[\macro{\_ATFILE\_SOURCE}] definendo questa macro si rendono disponibili
-  le funzioni 
-
-\item[\macro{\_FORTIFY\_SOURCE}] definendo questa macro si rendono
-  disponibili le estensioni delle funzioni di creazione di file e directory
-  che consentono una specificazione coerente dei pathname relativi illustrate
-  in sez.~\ref{sec:file_openat}.
-
-\item[\macro{\_REENTRANT}] definendo questa macro si rendono disponibili
+  le estensioni delle funzioni di creazione, accesso e modifica di file e
+  directory che risolvono i problemi di sicurezza insiti nell'uso di pathname
+  relativi con programmi \itindex{thread} \textit{multi-thread} illustrate in
+  sez.~\ref{sec:file_openat}.
+
+\item[\macro{\_REENTRANT}] definendo questa macro, o la equivalente
+  \macro{\_THREAD\_SAFE} (fornita per compatibilità) si rendono disponibili le
+  versioni \index{funzioni!rientranti} rientranti (vedi
+  sez.~\ref{sec:proc_reentrant}) di alcune funzioni, necessarie quando si
+  usano i \itindex{thread} \textit{thread}.  Alcune di queste funzioni sono
+  anche previste nello standard POSIX.1c, ma ve ne sono altre che sono
+  disponibili soltanto su alcuni sistemi, o specifiche del \acr{glibc}, e
+  possono essere utilizzate una volta definita la macro.
+
+\item[\macro{\_FORTIFY\_SOURCE}] definendo questa macro viene abilitata
+  l'inserimento di alcuni controlli per alcune funzioni di allocazione e
+  manipolazione di memoria e stringhe che consentono di rilevare
+  automaticamente alcuni errori di \textit{buffer overflow} nell'uso delle
+  stesse. La funzionalità è stata introdotta a partire dalla versione 2.3.4
+  delle \acr{glibc} e richiede anche il supporto da parte del compilatore, che
+  è disponibile solo a partire dalla versione 4.0 del \texttt{gcc}.
+
+  Le funzioni di libreria che vengono messe sotto controllo quando questa
+  funzionalità viene attivata sono, al momento della stesura di queste note,
+  le seguenti: \func{memcpy}, \func{mempcpy}, \func{memmove}, \func{memset},
+  \func{stpcpy}, \func{strcpy}, \func{strncpy}, \func{strcat}, \func{strncat},
+  \func{sprintf}, \func{snprintf}, \func{vsprintf}, \func{vsnprintf}, e
+  \func{gets}.
+
+  La macro prevede due valori, con \texttt{1} vengono eseguiti dei controlli
+  di base che non cambiano il comportamento dei programmi se si richiede una
+  ottimizzazione di livello uno o superiore,\footnote{vale a dire se si usa
+    l'opzione \texttt{-O1} o superiore del \texttt{gcc}.}  mentre con il
+  valore \texttt{2} vengono aggiunti maggiori controlli.
 
 \end{basedescript}
 
-In particolare è da sottolineare che le \acr{glibc} supportano alcune
-estensioni specifiche GNU, che non sono comprese in nessuno degli standard
-citati. Per poterle utilizzare esse devono essere attivate esplicitamente
-definendo la macro \macro{\_GNU\_SOURCE} prima di includere i vari header
-file.
+Se non è stata specificata esplicitamente nessuna di queste macro il default
+assunto è che siano definite \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE},
+\macro{\_POSIX\_SOURCE}, e \macro{\_POSIX\_C\_SOURCE} con valore
+``\texttt{200112L}'' (o ``\texttt{199506L}'' per le versioni delle \acr{glibc}
+precedenti la 2.4). Si ricordi infine che perché queste macro abbiano effetto
+devono essere sempre definite prima dell'inclusione dei file di dichiarazione.
 
 
 % vedi anche man feature_test_macros
 
-%% \subsection{Gli standard di GNU/Linux}
-%% \label{sec:intro_linux_std}
-
-% TODO Da fare (o cassare, a seconda del tempo e della voglia).
-
-
-
 % LocalWords:  like kernel multitasking scheduler preemptive sez swap is cap VM
 % LocalWords:  everything bootstrap init shell Windows Foundation system call
 % LocalWords:  fig libc uClib glibc embedded Library POSIX username PAM Methods
@@ -983,7 +1046,9 @@ file.
 % LocalWords:  LARGEFILE Support LFS dell' black rectangle node fill cpu draw
 % LocalWords:  ellipse mem anchor west proc SysV SV Definition SCO Austin XSI
 % LocalWords:  Technical TC SUS Opengroup features STRICT std ATFILE fseeko
-% LocalWords:  ftello fseek ftell lseek FORTIFY REENTRANT
+% LocalWords:  ftello fseek ftell lseek FORTIFY REENTRANT SAFE overflow memcpy
+% LocalWords:  mempcpy memmove memset stpcpy strcpy strncpy strcat strncat gets
+% LocalWords:  sprintf snprintf vsprintf vsnprintf
 
 %%% Local Variables: 
 %%% mode: latex