# Controllo dei limiti

Nella programmazione, il controllo dei limiti (in inglese bounds checking) è un qualsiasi metodo per scoprire se una variabile è all'interno dei suoi limiti prima di essere utilizzata.
È particolarmente importante per una variabile usata come indice per una matrice/vettore assicurarsi che il suo valore non sia al di fuori dei suoi limiti.
Per esempio, se in un vettore di dieci elementi, numerati da 1 a 10, il programma cerca di leggere o scrivere l'elemento numero 11 e nulla gli impedisce di farlo, verranno lette/scritte le locazioni di memoria immediatamente successive a quella del decimo elemento, senza riguardo a ciò che esse possano contenere, questo porta inevitabilmente il programma a produrre risultati errati o a bloccarsi per avere generato indirizzi non validi (protezione di memoria).
Un secondo esempio è quello di una variabile scalare numerica intera con segno rappresentata su 16 bits, essa può assumere valori compresi fra −32768 e +32767: un suo valore che eccedesse questi limiti, provocherebbe malfunzionamenti, risultati errati ed eventuale blocco del programma.
Nel primo caso si parla di "index checking", nel secondo di "range checking".
Se il programma è dotato del "controllo dei limiti" cioè contiene istruzioni apposite di controllo che vengono eseguite ogni qualvolta vengono toccate le variabili, viene generata una qualche "segnalazione di eccezione" (exception signal)
Poiché il controllo dei limiti a run-time è ritenuto pesante, non viene quasi mai effettuato.
Alcuni compilatori includono switch di compilazione per attivare o disattivare il controllo limiti (e anche altri controlli come overflow e underflow)
Nella sua lezione del 1980 al "Turing Award" C. Antony R. Hoare descrisse la sua esperienza nella progettazione dell'ALGOL 60, un linguaggio che includeva il controllo dei limiti, dicendo:
   Una conseguenza di questo principio è che ogni occorrenza di ogni indice in ogni variabile indicizzata viene controllato ad ogni modifica rispetto ai limiti dichiarati, superiore ed inferiore. Molti anni dopo chiedemmo ai nostri clienti se volevano l'opzione di disattivare questi controlli nell'interesse dell'efficienza in esecuzione. Unanimemente essi ci chiesero di non farlo, conoscevano la frequenza di questi errori di indicizzazione e sapevano che il non identificarli avrebbe portato a risultati disastrosi. Noto con paura ed orrore che ancora nel 1980, progettisti ed utilizzatori di linguaggi di programmazione non hanno imparato questa lezione. In un qualsiasi ramo rispettabile dell'ingegneria la mancanza di tali elementari precauzioni sarebbe da tempo contro la legge.
Tra i linguaggi che includono obbligatoriamente il controllo a run-time vi sono Ada, Visual Basic, Java, JavaScript, PHP, Python, Ruby, Haskell, Lisp e C#. I linguaggi D e OCaml possono attivare o disattivare i controlli tramite switch di compilazione.
Il C# supporta anche le "unsafe regions": sezioni di codice che, fra l'altro, sospendono temporaneamente i controlli nell'interesse dell'efficienza. Questo è utile per accelerare l'esecuzione in porzioni di programma critiche, senza sacrificare la affidabilità dell'intero programma.

## Validazione dati

Nel contesto della raccolta dati e della loro qualità, il controllo si riferisce al verificare che i dati inseriti o usati non siano trivialmente errati, ad esempio una percentuale deve essere compresa fra zero e 100, un'età (anagrafica) fra zero e 120 l'altezza di una persona adulta fra 0 e tre metri.