Bug: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m robot Aggiunta: th
 
(308 versioni intermedie di oltre 100 utenti non mostrate)
Riga 1:
{{nota disambigua}}
La parola '''bug''' identifica un errore in 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.
[[File:First Computer Bug, 1945.jpg|thumb|Il ''bug'' più famoso nella storia dell'informatica, 9 settembre 1947]]
 
Il '''''bug''''' (pronuncia [[lingua inglese|inglese]] {{IPA|/bʌɡ/|en}}; in [[lingua italiana|italiano]] {{IPA|/ˈbaɡ/|it}}<ref>{{Dipi|bug}}</ref>), in italiano anche '''baco'''<ref>{{Treccani|baco2|Baco|v=sì|accesso=24 marzo 2017}}</ref>, nell'ambito della [[programmazione (informatica)|programmazione]] [[informatica]], è un'anomalia che porta al malfunzionamento di un [[software]], per esempio producendo un risultato inatteso o errato, tipicamente dovuto a un errore nella scrittura del [[codice sorgente]] di un [[programma (informatica)|programma]]. Un bug, in sostanza, è un difetto software di tipo funzionale, nonostante a volte il termine venga usato per indicare anche falle di sicurezza (vulnerabilità) nonché per gravi carenze di prestazione. Esempi di bug sono quelli che portano ai [[Schermata blu di errore|''Blue Screen of Death'']] su [[Windows]], cioè schermate blu con messaggi di errore che hanno interessato soprattutto le prime versioni del [[sistema operativo]]. Altri tipi di errori, seppur differenti, che si avvicinano ai bug sono i [[glitch]] e gli [[exploit]], diffusi spesso nei [[videogiochi]].<ref>{{Cita web|url=https://www.ionos.it/digitalguide/online-marketing/social-media/glitch/|titolo=Che cos’è un glitch?|accesso=24 maggio 2022}}</ref>
I ''bug'' in un programma possono essere in certi casi particolarmente gravi a tal punto da rendere vulnerabile ad attacchi informatici anche il computer che ospita il software.
 
Un programma contenente bachi che interferiscono con la sua funzionalità è detto in gergo '''buggato''' ({{Inglese|buggy}}), mentre l'atto di correzione dagli errori è detto [[debug]] o ''bugfixing''.
* ''Bug'' famosi nel mondo informatico sono i cosiddetti [[buffer overflow]].
* 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|Virgola Mobile]] o coprocessore matematico come si diceva in precedenza) per cui erravano appunto alcune operazioni decimali. In un primo tempo venne rilasciato un software che escludeva questa unità ed in seguito tutti i microprocessori vennero sostituiti.
 
==Etimologia Storia ==
LLa diffusione dell'uso del termine ''bug'', che in [[lingua inglese|inglese]] indica genericamente un piccolo [[insetto]], è legato ada un curioso aneddoto risalente ai tempi pionieristici dell'[[informatica]]: nell'agostoil del9 1945settembre il[[1947]] la tenente [[Grace Murray Hopper|Grace Hopper]] ede il suo gruppo stavano cercando la causa del mafunzionamentemalfunzionamento 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), operazione che avrebbe ripristinato il tenenteregolare funzionamento dell'elaboratore, la Hopper incollò la falena rimossa sul registro del computer e annotò: «1545. Relay #70 Panel F (moth) nelin relay. First actual case of bug being found». Questo registro è conservato presso lo [[Smithsonian National Museum of American History]].<ref>{{Cita web|url=https://americanhistory.si.edu/collections|titolo=Collections|sito=americanhistory.si.edu|data=2012-02-07|lingua=en|accesso=2023-12-22}}</ref>
 
In realtà il termine ''bug'' nel senso di problema tecnico è stato usato almeno dal [[1870]],: è citato in questo senso in una lettera di [[Thomas Edison|Edison]] del [[1878]], probabilmente questo uso del termine è di origine scozzese.
 
{{citazione|È 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<ref>{{cita libro|titolo = American Genesis: A History of the American Genius for Invention | autore = Thomas P. Huges | editore = Penguin Books | anno = 1989 | p = 75 }}</ref>|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.|en}}
[[Categoria:sicurezza informatica]]
 
== Tipi di errori ==
[[de:Programmfehler]]
L''''errore''' (''error'') è la manifestazione di un certo bug (ad esempio: la mancata copia di un file è l'errore, il bug è un'anomalia specifica del [[file system]]). Va da sé che un determinato errore può originarsi da diverse tipologie di bug.
[[en:Computer bug]]
 
[[es:Error de software]]
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 in esecuzione o di ''[[run-time|runtime]]'', ed errori nella logica del programma.
[[fi:Ohjelmointivirhe]]
 
[[fr:Bogue]]
* Gli ''[[Errore di sintassi|errori di sintassi]]'' sono gli errori che si commettono nella fase di scrittura del [[programma (informatica)|programma]] nel [[linguaggio di programmazione|linguaggio]] scelto, fase successiva alla progettazione dell'algoritmo. Sono in genere errori di [[ortografia]] nella scrittura del codice o nell'uso delle istruzioni. Gli errori di sintassi impediscono la compilazione del programma da parte del [[compilatore]], che quindi tipicamente segnala 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.
[[he:באג]]
* Gli ''[[Runtime|errori di runtime]]'' sono errori che possono verificarsi nella fase in cui il programma viene [[esecuzione (informatica)|eseguito]] (in inglese ''run''), 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 o leggere dati in una locazione di memoria alla quale non ha accesso. Questi errori si verificano principalmente nell'indicizzazione di [[array]] e nell'utilizzo dei [[puntatore (programmazione)|puntatori]]. Un altro esempio si ha quando il programma tenta di eseguire operazioni non lecite (ad esempio, in alcuni linguaggi, una [[divisione per zero]]). Le [[eccezione (informatica)|eccezioni]] e i costrutti per la loro gestione sono uno dei principali strumenti che i linguaggi di programmazione mettono a disposizione per trattare gli errori di run-time.
[[hu:Kernel panic]]
* Gli ''[[Errore di semantica|errori di logica]]'' (o semantica) sono gli errori che si commettono nella fase di progettazione o più spesso di implementazione dell'[[algoritmo]]: possono essere causati da una mancata comprensione del [[problema]] da calcolare o dei vincoli che i dati in input devono rispettare, da errori nella valutazione del [[test]] dell'algoritmo o ancora, semplicemente, da un errato uso del linguaggio che però non dà luogo a errori di sintassi. 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, oppure a un programma che non esegue le operazioni volute. Sono difficili da individuare e spesso si deve ricorrere al [[debugging]] tramite un [[debugger]], un programma che normalmente si trova anche integrato nell'IDE.
[[ja:バグ]]
 
[[nl:Bug]]
Quanto indicato riferendosi al compilatore vale naturalmente anche per programmi [[Interprete (informatica)|interpretati]], come per esempio [[Python]], [[PHP]], [[JavaScript]], [[Matlab]], per citare alcuni tra i più popolari. In questi casi, data la possibilità di eseguire i comandi in modo [[Interattività|interattivo]], può essere più semplice rilevare gli errori anche senza l'uso di un debugger, che è comunque ugualmente disponibile in molti casi.
[[pl:Bug (programowanie)]]
 
[[pt:Bug]]
Molto raramente può accadere che un [[compilatore]] difettoso produca un errore anche se il codice sorgente è corretto.
[[sv:Bugg (dator)]]
 
[[th:จุดบกพร่อง (คอมพิวเตอร์)]]
=== Esempi ===
[[zh:程序错误]]
* ''Errore concettuale - pseudobug'': il codice è scritto correttamente ma il programma era destinato a fare qualcosa di diverso, per esempio: in C e C++ un punto e virgola isolato indica l'istruzione vuota, per cui un ciclo scritto come <syntaxhighlight lang=c inline>for (i = 0; i<10; i++); faiqualcosa();</syntaxhighlight> eseguirà dieci volte l'istruzione nulla e chiamerà una sola volta la funzione "<code>faiqualcosa()</code>".
* ''Loop e ricorsione infiniti'' in cui la condizione necessaria all'arresto non si verifica mai, per esempio: in C o C++ <syntaxhighlight lang="c" inline>x = 0; while(x>=0) { faiqualcosa(); x++; }</syntaxhighlight> non si può arrestare perché l'espressione logica risulta vera per qualunque valore di x.
* ''Uso di una [[variabile non inizializzata]]''.
* ''Uso di una variabile di tipo non appropriato'' o dimensionata in modo non corretto, per esempio: usare una variabile di tipo intero a 8 bit con segno (spesso chiamato int8) per memorizzare valori positivi tra 0 e 255.
* ''Perdita di risorse'', in un sistema in cui la memoria è esaurita per l'assegnazione ripetuta di nuove unità e la non liberazione di altre unità.
* ''[[Buffer overflow]]'', in cui un programma continua a scrivere dati anche dopo aver riempito l'area di memoria prevista.
* ''Perdita a causa degli arrotondamenti'', per esempio, nel tipo di conversione di un [[numero]]. Un caso tipico si verifica nelle espressioni che coinvolgono operandi di tipo diverso, per esempio: con l'usuale ordine di valutazione e secondo comuni regole di conversione implicita dei tipi, se i è una variabile intera minore di N calcolare la percentuale con l'espressione i/N*100 darà zero, a differenza di i*100/N.
 
=== Bug dell'hardware ===
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 [[aritmetica|aritmetici]]. I primi Pentium infatti avevano problemi nella [[unità di calcolo in virgola mobile|FPU]] (''Floating Point Unit'', Unità a [[virgola mobile]] o coprocessore matematico), a causa della quale restituivano 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 ==
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 (informatica)|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 dei bachi possono giungere ad essere estremamente gravi: negli [[Anni 1980|anni ottanta]], in [[Canada]] e negli [[Stati Uniti d'America]], alcuni bachi presenti nel software di controllo di un macchinario per la [[radioterapia]], il [[Therac-25]], portarono gli apparecchi prima ad erogare una quantità eccessiva di radiazioni senza sistemi di protezione attivi e poi ad attivarsi quando non richiesto, rendendosi direttamente responsabili del decesso di alcuni pazienti. Da allora tali eventi vengono spesso utilizzati come esempi per mostrare e far comprendere quali pericoli possa causare una cattiva programmazione, soprattutto nei software con finalità pratiche.<ref>{{Cita news|lingua=en|nome=Simson|cognome=Garfinkel|url=https://www.wired.com/2005/11/historys-worst-software-bugs/|titolo=History's Worst Software Bugs|pubblicazione=Wired|accesso=2023-12-22}}</ref>
 
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 [[Stati Uniti d'America|USA]], l'equivalente dello 0,6% del [[PIL]].<ref>{{en}} [http://www.rti.org/news.cfm?nav=507&objectid=DA7FBFE6-4A4F-4BFD-B77E0FA3C04D9E22 Software Bugs Cost U.S. Economy $59.6 Billion Annually] {{webarchive|url=https://web.archive.org/web/20120605091954/http://www.rti.org/news.cfm?nav=507&objectid=DA7FBFE6-4A4F-4BFD-B77E0FA3C04D9E22 |data=5 giugno 2012 }}</ref>
 
== Prevenzione ==
Durante la progettazione del ''software'', l'immissione dei dati o la traduzione ([[compilazione]], [[interprete (informatica)|interpretazione]] od assemblazione) del codice sorgente, possono pervenire degli errori (per lo più derivanti da fattori umani come sviste o inaccortezze) nell'[[file eseguibile|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 (informatica)|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 (informatica)|programmazione]] per far sì che il numero di bachi prodotti sia minor possibile. Quest'attività rientra nella disciplina di [[ingegneria del software|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 (informatica)|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 ==
{{vedi anche|Debugging}}
 
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.
 
== Fix ==
In inglese informatico, ormai diffuso anche in altre lingue, il ''fix'' è il '''correttivo''' cioè la riparazione di un bug. Fix è un termine generico che corrisponde a soluzioni definitive diverse, a seconda dei casi. Una soluzione temporanea che non corregge il bug ma ne contiene l'effetto è il [[workaround]].
 
=== Gestione del ''bug'' ===
È comune pubblicare un [[programma (informatica)|programma]] con bachi conosciuti che non sono considerati gravi; successivamente il baco potrebbe essere corretto con una nuova [[release (informatica)|versione]] o attraverso una ''[[patch (informatica)|patch]]''.
 
=== Altra terminologia ===
Diversi produttori (ad esempio Microsoft), sui loro bollettini, usano l'espressione inglese ''addesses an issue'' (lett. "affrontata una questione", tradotta nella versione italiana con '''risolto un problema''') per indicare un concetto un po' più ampio di un bug o per non ricorrere ad un termine specialistico nei confronti dell'utente-consumatore. Google usa un'espressione ibrida (''fix for issue''), altri produttori quella ''resolved an issue'', con il consueto significato.
 
== Differenza fra bug e glitch ==
Mentre il bug è un errore di scrittura del codice del programma un glitch è un errore prevalentemente di tipo visivo o di maggior entità.
 
== Note ==
<references />
 
== Bibliografia ==
* G. Michael Schneider, Judith L. Gersting, ''Informatica'', Apogeo, 2007.
 
== Voci correlate ==
* [[Anti-pattern]]
* [[Bug tracking system]]
* [[Debugger]]
* [[Debugging]]
* [[Hexedit]]
* [[Grace Murray Hopper]]
* [[Heisenbug]]
* [[Difetto]]
* [[Programmazione (informatica)]]
* [[Eccezione (informatica)]]
 
== Altri progetti ==
{{interprogetto|preposizione=sul|wikt=bug}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC||bug}}
* {{cita web|lingua=en|http://www5.in.tum.de/~huckle/bugse.html|Collection of Software Bugs|autore=Thomas Huckle (TU München)}}
* {{cita web|lingua=en|https://web.archive.org/web/20161227012432/https://courses.cs.vt.edu/~cs3604/lib/Therac_25/Therac_1.html|An Investigation of the Therac-25 Accidents|autore=Nancy Leveson (University of Washington) e Clark S. Turner (University of California a Irvine)}}
* {{cita web|lingua=en|https://www.cs.tau.ac.il/~nachumd/verify/horror.html|Software Horror Stories|autore=Nachum Dershowitz}}
* {{cita web|https://www.chiark.greenend.org.uk/~sgtatham/bugs-it.html|Come segnalare bug efficacemente|autore=[[Simon Tatham|Simon G. Tatham]]|data=1999}}
* {{cita web|1=http://www.rustyspigot.com/Software_Engineering/Rates_of_Design_Failures.htm|2=Rates of Design Failure|lingua=en|accesso=21 gennaio 2010|urlarchivio=https://web.archive.org/web/20100424010336/http://www.rustyspigot.com/Software_Engineering/Rates_of_Design_Failures.htm|dataarchivio=24 aprile 2010|urlmorto=sì}}
* {{cita web|lingua=en|http://www.stickyminds.com/r.asp?F{{=}}DART_5898|Bug Tracking Basics: A beginner's guide to reporting and tracking defects|autore=Mitch Allen}}
* {{cita web|https://wired.com/news/technology/bugs/0,2924,69355,00.html|History's Worst Software Bugs|lingua=en|data=2005}}
* {{cita web|1=http://bugspy.net|2=BugSpy - Open source bug search engine|lingua=en|accesso=30 ottobre 2019|urlarchivio=https://web.archive.org/web/20100327082455/http://bugspy.net/|dataarchivio=27 marzo 2010|urlmorto=sì}}
* {{cita web|lingua=en|http://www.cs.wisc.edu/cbi/|The Cooperative Bug Isolation Project|tipo=progetto che traccia i bug di popolari software open source}}
 
{{Collaudo del software}}
{{Controllo di autorità}}
{{Portale|informatica}}
 
[[Categoria:Terminologia informatica]]
[[Categoria:Sicurezza informatica]]