Bug
Il bug (pronuncia inglese /bʌg/; in italiano /ˈbaɡ/[1]), in italiano anche baco[2], nell'ambito della programmazione informatica, è un problema che porta al malfunzionamento del software, per esempio producendo un risultato inatteso o errato, tipicamente dovuto a un errore nella scrittura del codice sorgente di un programma.
Un programma contenente un gran numero di bachi che interferiscono con la sua funzionalità è detto in gergo buggato (in inglese buggy), mentre l'atto di correzione dagli errori è detto bugfixing.
Storia[modifica | modifica wikitesto]
La diffusione dell'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 la tenente Grace 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), la 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.[3]
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.
(EN)
«It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise — this thing gives out and [it is] then that “Bugs” — as such little faults and difficulties are called — show themselves and months of intense watching, study and labor are requisite before commercial success or failure is certainly reached.» |
(IT)
«È stato così per tutte le mie invenzioni. Il primo passo è un'intuizione, e viene come una fiammata, poi le difficoltà crescono... le cose non vanno più ed è allora che i "bachi" – così sono chiamati questi piccoli guasti e difficoltà – si manifestano, e servono mesi di intensa osservazione, studio e lavoro prima che il successo commerciale oppure il fallimento sia sicuramente raggiunto.» |
(Lettera di Edison a Puskas[4]) |
Tipi di errori[modifica | modifica wikitesto]
Durante lo sviluppo e l'esecuzione di un codice sorgente possono verificarsi i cosiddetti "errori di programmazione" che si possono distinguere essenzialmente in tre principali categorie: errori di sintassi, errori di logica ed errori di runtime.
- Gli errori di sintassi sono gli errori che si commettono nella fase di scrittura del programma nel linguaggio scelto, fase successiva alla progettazione dell'algoritmo. Sono In genere errori di ortografia nella scrittura del codice o nella sintassi delle istruzioni. Gli errori di sintassi impediscono la compilazione del programma da parte del compilatore che quindi tipicamente segnalerà la presenza dell'errore. Questo tipo di errore è spesso segnalato al programmatore direttamente dall'editor dell'ambiente integrato di sviluppo (IDE) utilizzato, risultando dunque di facile individuazione e soluzione.
- Gli errori di logica (o semantica) sono gli errori che si commettono nella fase di progettazione dell'algoritmo: possono essere causati da una mancata comprensione del problema da calcolare o dei vincoli che i dati in input devono rispettare, o ancora nella valutazione del test dell'algoritmo. Questi errori conducono tipicamente alla progettazione di un algoritmo che non fornisce l'output richiesto nell'ambito di una o più istanze del problema da risolvere. Sono difficili da individuare e spesso si deve ricorrere al debugging tramite il debugger dell'IDE.
- Gli errori di runtime sono errori che possono verificarsi nella fase di esecuzione del programma, anche se l'algoritmo è corretto e il codice viene compilato correttamente. Spesso sono relativi all'utilizzo della memoria da parte del programma stesso, che tenta ad esempio di scrivere a una locazione di memoria alla quale non ha accesso. Questi errori si verificano principalmente nell'utilizzo dei puntatori e in programmazione dinamica. Altro esempio: un insieme di dati danno luogo ad operazioni non lecite (ad esempio, in alcuni linguaggi, una divisione per zero). La gestione delle eccezioni in Java fa riferimento proprio alle eventuali eccezioni o bug in fase di run-time del programma.
Può anche accadere che un errore venga prodotto dal compilatore.
Esempi[modifica | modifica wikitesto]
- Errore concettuale - pseudobug: il codice è scritto correttamente, ma il programma era destinato a fare qualcosa di diverso.
- Loop infinito e ricorsione
- Uso di una variabile non inizializzata
- Uso di una variabile di tipo non appropriato o dimensionata in modo non corretto
- 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
Bug dell'hardware[modifica | modifica wikitesto]
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. Ad esempio un noto bug in un componente hardware è quello che nel 1994 afflisse l'allora neonato microprocessore Pentium, che in determinate situazioni 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), a causa della quale restituivano come uscita valori errati in alcune operazioni decimali. In un primo tempo venne pubblicato un programma che escludeva questa unità; in seguito tutti i microprocessori vennero sostituiti.
Effetti[modifica | modifica wikitesto]
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 baco è abbastanza grave, può causare il crash o un blocco del programma che porta ad una negazione del servizio richiesto. Altri, qualificati come bachi della sicurezza, potrebbero consentire a un utente malintenzionato di aggirare i controlli di accesso, al fine di ottenere privilegi non autorizzati.
Gli effetti di un baco possono giungere ad essere estremamente gravi: negli anni ottanta un baco presente nel codice di controllo in un apparecchio per radioterapia, il Therac-25, portò l'apparecchio ad erogare una quantità eccessiva di radiazioni e fu direttamente responsabile del decesso di alcuni pazienti.[5]
Nel 2002 il National Institute of Standards and Technology ha calcolato che i bug e gli errori software hanno causato una perdita di 59 miliardi di dollari negli USA, l'equivalente dello 0,6% del PIL.[6]
Prevenzione[modifica | modifica wikitesto]
Durante la progettazione del software, l'immissione dei dati o la traduzione (compilazione, interpretazione od assemblazione) del codice sorgente, possono pervenire degli errori (per lo più derivanti da fattori umani come sviste o inaccortezze) nell'eseguibile ottenuto, i quali vanno a costituire i bug.
L'errore che causa un bug è difficilmente un errore di sintassi, perché il compilatore avvertirebbe immediatamente il programmatore arrestando il processo di compilazione; per questo sono molto più "insidiosi" gli errori logici nella stesura dell'algoritmo.
L'industria del software è continuamente impegnata nella ricerca sul prevenire l'introduzione di bachi durante la scrittura del programma, per facilitare la scrittura e diminuire i tempi di sviluppo. Gli approcci e i metodi più comuni sono:
- Stile di programmazione
Se si incontra un'incoerenza dei dati in un programma durante la sua l'esecuzione, esso è in grado di fermarsi immediatamente, in modo che il baco 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 bachi 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 del software.
- 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.
Debugging[modifica | modifica wikitesto]
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 baco non riguarda una singola istruzione, ma rappresenta un errore concettuale da parte del programmatore. Una volta individuato l'errore si procede appunto alla correzione o eliminazione.
Gestione del bug[modifica | modifica wikitesto]
È comune pubblicare un programma con bachi conosciuti che non sono considerati gravi; successivamente il baco potrebbe essere corretto con una nuova versione o attraverso una patch.
Note[modifica | modifica wikitesto]
- ^ Luciano Canepari, bug, in Il DiPI – Dizionario di pronuncia italiana, Zanichelli, 2009, ISBN 978-88-08-10511-0.
- ^ Baco, in Treccani.it – Vocabolario Treccani on line, Istituto dell'Enciclopedia Italiana. URL consultato il 24 marzo 2017.
- ^ (EN) Bug presso lo Smithsonian Institution
- ^ Thomas P. Huges, American Genesis: A History of the American Genius for Invention, Penguin Books, 1989, p. 75.
- ^ (EN) History's Worst Software Bugs
- ^ (EN) Software Bugs Cost U.S. Economy $59.6 Billion Annually Archiviato il 5 giugno 2012 in Internet Archive.
Bibliografia[modifica | modifica wikitesto]
- G. Michael Schneider, Judith L. Gersting, Informatica
Voci correlate[modifica | modifica wikitesto]
Altri progetti[modifica | modifica wikitesto]
- Wikimedia Commons contiene immagini o altri file sui bug
Collegamenti esterni[modifica | modifica wikitesto]
- (EN) Collection of Software Bugs (Thomas Huckle, TU München)
- (EN) Computer-Related Incidents with Commercial Aircraft (Peter B. Ladkin et al., Universität Bielefeld)
- (EN) An Investigation of the Therac-25 Accidents (Nancy Leveson, University of Washington and Clark S. Turner, University of California a Irvine)
- (EN) Fatal Dose: Radiation Deaths linked to AECL Computer Errors (Barbara Wade Rose, coalizione canadese responsabilità nucleare)
- (EN) Software Horror Stories (Nachum Dershowitz)
- (EN) Software Does Not Fail (Paul Niquette)
- (EN) Picture of the "first computer bug" Archiviato il 12 gennaio 2015 in Internet Archive. (Naval Historical Center)
- (EN) Page from 1947 log book with "first actual case of bug being found" (moth) (National Museum of American History)
- (EN) The First Computer Bug! Archiviato il 30 aprile 1997 in Internet Archive. Una email del 1981 su Adm. Il bug di Hopper.
- (EN) How to Report Bugs Effectively (Simon G. Tatham)
- (EN) Rates of Design Failure, su rustyspigot.com. URL consultato il 21 gennaio 2010 (archiviato dall'url originale il 24 aprile 2010).
- (EN) Bug Tracking Basics: A beginner's guide to reporting and tracking defects (Mitch Allen)
- (EN) History's Worst Software Bugs, su wired.com.
- (EN) Open source bug search engine, su bugspy.net. URL consultato il 30 ottobre 2019 (archiviato dall'url originale il 27 marzo 2010).
- (EN) Bug Isolation Project - Progetto che traccia i bug di popolari software open source
Controllo di autorità | LCCN (EN) sh97005329 |
---|