Bug

Un ***bug*** ou **erro de software** é un erro, problema, falta ou fallo nun programa informático que lle impide funcionar correctamente ou produce un resultado incorrecto.

Os bugs suceden por erros producidos ben cando se escribe o programa informático, ou ben cando se interconectan varios deles dun xeito incorrecto, posiblemente debido a un fallo no deseño software, por exemplo na arquitectura software. Asúmese que todo programa informático contén erros, mais canto mellor escritos (técnicas de programacion) estean os programas (normalmente despois dunha serie de correccións e probas), menos bugs terán por liña de código, o que fará que tales programas que sexan suficientemente estables e se poidan utilizar nas tarefas para as que foron deseñados.
Os informes (“reports”) de erros chámanse “informes de erros” e ás veces emprégase a terminoloxía inglesa de PRs (problem reports), TTR (test trouble reports). O resultado da análise de tales informes convértese nunha petición de cambio CRs (change requests).

## Descrición 
Os bugs poden ter unha ampla variedade de efectos, a nivel cualitativo e cuantitativo.
Algúns poden tardar moito tempo en provocar un fallo (por exemplo se o programa tarda moito en executar a parte do código na que se localiza ese bug). 
Os bugs máis serios poden provocar que caia o programa ou que quede bloqueado (“frozen” = conxelado), ou inclusive que “caia” o computador enteiro (i.e., todos os seus programas).

Os resultados dos bugs poden ser cualitativamente moi serios, por exemplo bugs que ocorreron en computadores Therac-25 que controlan unha terapia radioactiva, causando a morte de pacientes, ou os bugs que causaron que se destruíse o foguete Ariane 5 en 1996, en menos dun minuto despois do lanzamento.

## Dous aspectos de seguridade informática (safety vs security) 
En informática en inglés, distínguese entre Safety e mais security: Safety refírese ao estudo da seguridade dos programas informáticos no sentido de evitar que danen aos seres humanos, mentres que se lle chama security cando trata de evitar que se acceda (hackers etc) a un sistema informático con fins non lexítimos, causando danos económicos ou doutras índoles.

## Etimoloxía 
miniatura|Imaxe do caderno de bitácora do ordenador co *bug* que producía o seu malfuncionamento.
Aínda que en inglés "bug" significa comunmente “bicho”, xa se lle chamaba “bugs” na época da Segunda guerra mundial aos erros no hardware dos rádares electrónicos.

A invención atribúeselle a Grace Hopper, cando fixo pública a causa dun malfuncionamento nun computador electromecánico por culpa dun bicho.

## Prevención de bugs 
Non é doado psicoloxicamente para algúns enxeñeiros aceptar que o seu código ten bugs. Ironicamente chámaselle ás veces aos erros "características non consideradas". Tense chegado, eufemisticamente a chamarlle "mellora da fiabilidade" á corrección dun bug.

Os bugs son intrínsecos á natureza humana da tarefa de programación, polo tanto non se pode evitar que se produzan, mais si se pode diminuír o seu número medio e a súa importancia, ben a priori con técnicas e metodoloxías de programación apropiadas, ben durante a actividade de produción de código coa análise de calidade do código en produción, ben a posteriori coas probas (ou testes) do código que se produciu.

Hai que ter en conta a case obvia consideración de que, canto máis tarde no ciclo de produción/probas se detecta un bug, máis custosa resulta a súa corrección.

## *Debugging* 
A atopar e reparar os bugs chamaselle "depurar" (*debugging*), unha das partes máis importantes da programación. Acotío, os programadores gastan tanto tempo e esforzo en atopar e corrixir os bugs que en escribir novo código.

Normalmente, é moito máis difícil atopar o problema no código fonte que corrixilo. Úsanse programas coñecidos como depuradores ( debuggers) para axudar na localización do bug.

Tipicamente, o primeiro paso é intentar reproducir o problema/fallo e así atopar o bug. Unha vez reproducido o fallo, o programador usará o debugger ou outra ferramenta para monitorizar a execución do programa na rexión infrutuosa e, finalmente, atopar o problema.

Non sempre é doado reproducir o problema. Dáse incluso o caso de haber erros que non se reproducen ao monitorizar o programa co debugger, a isto chámaselle humoristicamente heisenbugs (con relación ao principio de incerteza de Heisenberg).

## Bugs famosos 
### Na exploración espacial 
* NASA Mariner 1 saíu fóra de rumbo no lanzamento, debido a un carácter "barra" que faltaba no seu software FORTRAN (1962).http://www.faqs.org/faqs/space/probe/
* NASA Apollo 11 problema no lanzamento (1969).
* NASA Voyager 2 ( 1986).
* Phobos 1 perdido (10de setembro, 1988).
* ESA Ariane 5 voo 501 autodestrución 40 segundos despois do lanzamento (4 de xuño, 1996).
* NASA Mars Climate Orbiter destruíuse debido a unha introdución da órbita incorrecta ( 1999).
* Mars Polar Lander perdida o (3 de decembro do 1999).
* NASA Mars Rover conxelado debido a un excesivo número de ficheiros abertos (21 de xaneiro de 2004).

### Médicos 
* Os accidentes no Therac-25 (1985-1987), posiblemente o fallo máis serio (perda de vidas humanas) relacionado cun computador.

### En computadores 
* bug no Pentium FDIV, resultando en imprecisión na división en coma flotante
* bug no Pentium F0, causando que se "conxelase" o procesador baixo certas instrucións.
* O popular problema do ano 2000

### En telecomunicacións 
* Caída da rede de larga distancia de AT&T (15 de xaneiro do 1990).

### No exército 
* O bug no MIM-104 Patriot, causou 28 mortes en Dharan, Arabia Saudita (25 de febreiro do 1991).

## Tipos comúns de erros causados por bugs 
* División por cero
* Bucles infinitos
* Desbordamento aritmético, ben overflow aritmético ou underflow aritmético
* Saída dos límites dun array 
* Usar variables non inicializadas
* Acceso a zonas de memoria non accesibeis (Access violation)
* Escorremento de memoria (Memory leak)
* Desbordamento de pila (overflow ou underflow)
* Desbordamento dun buffer
* Punto morto (Deadlock)
* Condición de carreira (“race condition”)
* Perda de precisión na conversión de tipos

## Notas
## Véxase tamén
### Ligazóns externas
* Collection of Software Bugs (Thomas Huckle, TU München)
* Computer-Related Incidents with Commercial Aircraft (Peter B. Ladkin et al., Universität Bielefeld)
* An Investigation of the Therac-25 Accidents (Nancy Leveson, Universidade de Washington e Clark S. Turner, Universidade de California en Irvine)
* Fatal Dose: Radiation Deaths linked to AECL Computer Errors (Barbara Wade Rose, Canadian Coalition for Nuclear Responsibility)
* Relatos de horror software (Nachum Dershowitz)
* Foto do "primeiro bug informático"  
* Como informar de bugs dun xeito efectivo (Simon G. Tatham)
* Bug Tracking Basics: A beginner’s guide to reporting and tracking defects  (Mitch Allen)