Bug
Da Wikipedia, l'enciclopedia libera.
Nell'informatica il termine bug o baco identifica un errore nella scrittura di un programma software. Meno comunemente, il termine bug può indicare un difetto di progettazione in un componente hardware che ne causa un comportamento imprevisto o comunque diverso da quello specificato dal produttore.
I bug in un programma possono essere in certi casi particolarmente gravi, fino al punto di rendere vulnerabile ad attacchi informatici anche il computer che ospita il software.
- Un noto bug in un componente hardware è quello che nel 1994 afflisse l'allora neonato microprocessore Pentium, che in certi casi restituiva risultati errati anche in semplici calcoli aritmetici. I primi Pentium infatti avevano problemi nella FPU (Floating Point Unit, Unità a Virgola Mobile o coprocessore matematico come si diceva in precedenza), a causa del quale sbagliavano alcune operazioni decimali. In un primo tempo venne rilasciato un programma che escludeva questa unità; in seguito tutti i microprocessori vennero sostituiti.
Un bug di un programma è un errore o guasto che porta al malfunzionamento di esso (per esempio producendo un risultato inatteso o errato). La causa dei maggior numero di bug è spesso il codice sorgente scritto da un programmatore, ma può anche accadere che venga prodotto dal compilatore. Un programma che contiene un gran numero di bug che interferiscono con la sua funzionalità è detto bacato (in inglese "To Be Buggy")
Indice |
[modifica] Etimologia
L'uso del termine bug, che in inglese indica genericamente un piccolo insetto, è legato ad un curioso aneddoto risalente ai tempi pionieristici dell'informatica: il 9 settembre 1947 il tenente Hopper ed il suo gruppo stavano cercando la causa del malfunzionamento di un computer Mark II quando, con stupore, si accorsero che una falena si era incastrata tra i circuiti. Dopo aver rimosso l'insetto (alle ore 15.45), il tenente incollò la falena rimossa sul registro del computer e annotò: «1545. Relay #70 Panel F (moth) in relay. First actual case of bug being found». Questo registro è conservato presso lo Smithsonian National Museum of American History.
In realtà il termine bug nel senso di problema tecnico è stato usato almeno dal 1870: è citato in questo senso in una lettera di Edison del 1878, probabilmente questo uso del termine è di origine scozzese.
[modifica] Effetti
Un bug può avere una grande varietà di effetti, alcuni incidono poco sulla funzionalità del programma e quindi possono rimanere sconosciuti per lungo tempo. Al contrario, se il bug è abbastanza grave può causare il crash o un blocco del programma che porta ad una negazione del servizio richiesto. Altri, qualificati come bug di sicurezza, potrebbero consentire ad un utente malintenzionato di aggirare i controlli di accesso, al fine di ottenere privilegi non autorizzati.
Gli effetti di un bug possono giungere ad essere estremamente gravi: negli anni ottanta un bug presente nel codice di controllo in un apparecchio per radioterapia, il Therac-25, fu direttamente responsabile del decesso di alcuni pazienti.
[modifica] Prevenzione
I bug sono una conseguenza della natura dei fattori umani nella programmazione. Essi derivano da sviste dei programmatori durante la progettazione, la codifica e l’immissione dei dati. L’ industria del software è continuamente impegnata nella ricerca di metodi per prevenire l’introduzione di bug durante la scrittura del programma. I più comuni sono:
- Stile di programmazione
Se si incontra una incoerenza dei dati in un programma durante la sua l'esecuzione, esso è in grado di fermarsi immediatamente, in modo che il bug sia localizzato. In alternativa il programma può semplicemente informare l’utente, attendere la correzione e continuare l’esecuzione.
- Metodologie di sviluppo
Esistono diversi sistemi per la gestione delle attività di programmazione per far sì che il numero di bug prodotti sia minor possibile. Quest'attività rientra nella disciplina di ingegneria del software e il suo scopo è eliminare il bug già in fase di progettazione.
- Ausilio del linguaggio di programmazione
I linguaggi di programmazione spesso includono funzionalità che aiutano i programmatori ad evitare errori. Ad esempio se un programmatore utilizza una variabile di un tipo errato, il codice non riesce a compilare anche se è sintatticamente corretto.
- Analisi del codice
Esistono strumenti per l’analisi del codice per aiutare gli sviluppatori a controllare il testo del programma, come ad esempio il compilatore che è in grado di individuare potenziali problemi.
[modifica] Trovare gli errori
Tipicamente il primo passo nell’individuazione di un bug è trovare un modo per riprodurlo facilmente. Una volta che l’errore viene riprodotto, il programmatore può usare un debugger per seguire l’esecuzione nella regione difettosa e trovare il punto in cui il programma dà problemi. A volte un bug non riguarda una singola istruzione, ma rappresenta un errore concettuale da parte del programmatore.
Tipi di errori:
- Errori di Runtime: un insieme di dati danno luogo ad operazioni non lecite (ad esempio una divisione per zero);
- Errori di sintassi: sono accompagnati da messaggi emessi dal compilatore;
- Errori logici: causati da scelte fatte nell’algoritmo, non emettono messaggi di errore ma si controllano i risultati prodotti e a volte devono essere riparati o riscritti.
[modifica] Gestione del bug
È comune rilasciare un programma con bug conosciuti che non sono considerati gravi e successivamente il bug potrebbe essere corretto con una nuova versione o attraverso una patch.
[modifica] Altri esempi di Bug
- Errore concettuale (il codice è scritto correttamente, ma il programma era destinato a fare qualcosa di diverso)
- Loop infinito e ricorsione
- Uso di una variabile non inizializzata
- Perdita di risorse, in un sistema in cui la memoria è esaurita per l'assegnazione ripetuta di nuove unità mai liberate.
- Buffer overflow, in cui un programma continua a memorizzare i dati anche dopo aver riempito l’area di memoria inizialmente prevista.
- Perdita a causa degli arrotondamenti, per esempio, nel tipo di conversione di un numero
[modifica] Voci correlate
[modifica] Bibliografia
Informatica: G. Michael Schneider, Judith L. Gersting

