Un error de software, error o simplemente fallo (también conocido por el inglés, bug) es un problema en un programa de computadora o sistema de software que desencadena un resultado indeseado. Los programas que ayudan a la detección y eliminación de errores de software son denominados depuradores ().
Entre las numerosas incidencias notables causadas por este tipo de error están la máquina de radioterapia Therac-25 en la década de 1980, la destrucción de la sonda espacial Mariner 1 en 1962,<ref>(en inglés) [https://archive.today/20130902010756/www.wired.com/software/coolapps/news/2005/11/69355?currentPage=1 History's Worst Software Bugs' ' Pág. 1.] Wired. Consultado el 20 de marzo de 2014.</ref> del Ariane 5 501 en 1996,(en inglés) History's Worst Software Bugs. Pág. 2. Wired. Consultado el 20 de marzo de 2014. y el Airbus A400M en 2015.(en inglés) Airbus Cites Assembly Problem in A400M Crash. Consultado el 22 de junio de 2015. También fueron famosos los incidentes de la red de AT&T en 1990, o los accidentes del Boeing 737 MAX en 2018 y 2019 que llevaron a la suspensión de sus vuelos durante meses por fallos en el software MCAS.
En 2002 un estudio encargado por el Instituto Nacional de Estándares y Tecnología del Departamento de Comercio de Estados Unidos concluyó que los errores informáticos costaban a la economía estadounidense 59 500 millones de USD al año, un 0.6% del PIB.
Orígenes del término
thumb|Foto del origen de la leyenda acerca del primer bug informático conocido. El 9 de septiembre de 1947, la física y matemática Grace Murray Hopper y otros que trabajaban en la Universidad de Harvard en el Mark II informaron de que el ordenador sufrió un fallo en el relé electromagnético #70 del panel F. Cuando se investigó ese relé, el equipo encontró una polilla (bug) electrificada que provocó que el relé quedase abierto. Hopper pegó el insecto con cinta adhesiva en la bitácora con el comentario: (en inglés) «Rear Admiral Grace Murray Hopper, USNR, (1906-1992)»: imagen: Photo #: NH 96566-KN. Naval History and Heritage Command. Consultado el 20 de marzo de 2014.
Este incidente es erróneamente referido como el origen de la utilización del término inglés bug («bicho») para indicar un problema en un aparato o sistema.bugLa polilla que voló dentro de un ordenador y el origen de «bug informático» | Microsiervos (Leyendas Urbanas) En realidad, el término bug ya formaba parte del idioma inglés, al menos desde que Thomas Alva Edison lo utilizó en sus notas en 1872, en una carta en 1878 para referirse a defectos mecánicos o eléctricos, y en 1889 refiriéndose a interferencias y mal funcionamiento en un fonógrafo. Es posible que Hopper lo haya asociado por primera vez a la informática, en este caso, relacionado con un insecto real. Por otra parte, aunque durante los años 50 del , Hopper también empleó en inglés el término debug al hablar de la depuración de errores en los códigos de programación. El primer uso registrado del término se encuentra en la Journal of the Royal Aeronautical Society de 1947
Errores de programación comunes
División por cero Ciclo infinito Problemas aritméticos como desbordamientos (overflow) o subdesbordamientos (underflow). Exceder el tamaño del array definido Utilizar una variable no inicializada Errores tipográficos varios, por ejemplo confundir el dígito "0" con la vocal "O", confundir el dígito "1" con la letras "I" o "l", o escribir "," en lugar de "." como parte de nombres de variables en lenguajes donde no es necesario declarar las variables antes de usarlas. Por ejemplo, en Fortran IV los espacios no cuentan, por lo que cambiar una coma por un punto en un bucle DO 100 I=1. 10 equivale a la asignación DO100I = 1.10 que por ser una instrucción válida no la reporta el compilador. Usar constantes mágicas, es decir que en lugar de definir una variable o macro para definir un parámetro que puede cambiar, poner el valor en el código. Por ejemplo, declarar un arreglo float X y usarla en bucles for i=0 to 10 en varias partes del programa en lugar de definir una constante XSize=10; float X[XSize]; y usar for i=0 to XSize, con lo que se evitan omisiones cuando se cambie la dimensión de X, ya que basta con con cambiar XSize=20 en lugar de buscar en todo el código las constantes mágicas 10 para cambiarlas por 20. Acceder a memoria no permitida (Violación de acceso) Pérdida de memoria (memory leak) Desbordamiento o subdesbordamiento de la pila (estructura de datos) (Stack overflow) Desbordamiento de búfer (buffer overflow) Bloqueo mutuo (deadlock) Indizado inadecuado de tablas en bases de datos. Corrupción de las bases de datos relacionales por no estar normalizadas. Desbordamiento de la pila de recursión, cuando se dejan demasiadas llamadas en espera. Programar por ensayo y error, en lugar de desarrollar los programas sistemáticamente. No atender los mensajes de advertencia al momento de compilar un programa. Errores que resultan del uso indiscriminado de variables de alcance global. Errores por no declarar el tipo de las variables. Errores que emergen porque el programador no toma en cuenta la semántica del lenguaje de programación. Por ejemplo, desconocer si el alcance es léxico o dinámico. Errores de sintaxis, por ejemplo, no terminar una instrucción con un punto y coma ( ; ) en un lenguaje de programación que lo requiere. No documentar correctamente el programa, provoca el no entender qué hace, lo que acarrea errores por no tener claro lo que hace. Condición de carrera (race condition) Uso incorrecto de API. Incompatibilidad de sistemas.
Defectos de instalación o programación
thumb|Pantalla de ordenador con error de software en la Puerta 11 del Aeropuerto de Santiago-Pudahel Eliminación o sustitución de bibliotecas comunes a más de un programa o del sistema (DLL Hell). Reiniciar arbitrariamente la sesión de un usuario para que la instalación tenga efecto. Suponer que el usuario tiene una conexión permanente a internet. Utilizar como fuente enlaces simbólicos a ficheros que pueden cambiar de ubicación.
Códigos de errores de lenguajes de programación La mayor parte de los lenguajes de programación presentan al menos dos tipos de errores que permiten a los programadores manejar las fallas de los programas de una manera eficiente y que no resulte agresiva con el usuario final. Dichos errores son de compilación y errores en tiempo de ejecución.
Los errores de compilación normalmente inhiben que el código fuente derive en un programa ejecutable, mientras que los errores en tiempo de ejecución son situaciones específicas en las que un evento externo al programa impide su ejecución. Regularmente un programador eficiente debe intentar imaginar como debe responder ante esos eventos de manera que sea el programa y no el usuario o el sistema operativo los que resuelvan el problema. Por ejemplo, un bloque de error no manejado podría hacer lo siguiente:
Abre el archivo "miarchivo" para escritura comienza a escribir datos en mi archivo cierra el archivo
Si "miarchivo" no existe (o el programa o el usuario no tienen privilegios suficientes para abrirlo), el sistema operativo regresará un error que el programa no atrapará y tendremos un mensaje como "El archivo "miarchivo" no puede ser abierto para escritura" y botones para reintentar, cancelar y abortar (en el sistema operativo Windows), que no tendrán otra acción que repetirse indefinidamente sin posibilidad de salir de ese ciclo como no sea dando por terminado violentamente el programa. Un código que permitiese atrapar el error en tiempo de ejecución sería:
Abre el archivo "miarchivo" para escritura Si el sistema operativo lo permite comienza a escribir datos en "miarchivo" si no lo permitió informa al usuario de lo que sucede regresa al usuario a un punto donde no haya conflicto (el menú principal, por ejemplo) Continúa operando normalmente
Los diferentes lenguajes de programación permiten diferentes construcciones lógicas a los programadores para atrapar y resolver errores en tiempo de ejecución, como pueden ser las sentencias assert, try y on error en diferentes lenguajes de programación.
Defectos de diseño de programas
Diseños con colores inapropiados para las personas que padecen daltonismo Diseños que usan textos con tipografías de difícil lectura por su tamaño o diseño Diseños que fuerzan el uso del ratón sin dejar alternativas de teclado para personas con disfunciones motrices Estimar que el equipo donde se instalará tiene determinadas características (como la resolución de la pantalla, la velocidad del procesador, la cantidad de memoria o conectividad a Internet) propias de un equipo de gama alta, en vez de diseñar el software para su ejecución en equipos normales
Implicaciones
El tipo y cantidad de daño producido por un error de software puede afectar los procesos de toma de decisión y la política sobre la calidad del software. En aplicaciones para el viaje espacial tripulado y para el automóvil los controles de calidad del software deben ser superiores.
Casos notables
Y2K
miniaturadeimagen|123x123px|Y2K
El problema del año 2000 (Y2K) pudo llegar a ser un colapso económico porque muchos programas interpretarían el año 2000 como si fuera el año 1900. Los trabajos de adaptación y corrección de programas evitaron problemas graves.
Knight Capital
Disrupción de la bolsa de Nueva York en 2012. El 1 de agosto de 2012 Knight Capital provocó una disrupción del mercado de bolsa que le llevó a perder en dos días el 75% de su capitalización bursátil. Knight Capital disponía del software SMARS que gestionaba de forma automatizada, a alta velocidad y de forma algorítmica las órdenes para ejecutar en el mercado. Dentro del código tenía la funcionalidad «Power Peg», que ya no usaba desde 2003. No se había borrado y estaba disponible si se la llamaba. El contador de las acciones vendidas en cada orden pasó a realizarla otra parte del código fuera de «Power Peg» desde 2005. Comenzando el 27 de julio de 2012 se inició la instalación del nuevo software SMARS por fases en los servidores durante varios días. El nuevo software contenía una etiqueta que en el antiguo activaba «Power Peg». Un técnico olvidó realizar una copia del nuevo código RLP a uno de los ocho servidores SMARS que gestionaban las órdenes de compra y venta de acciones automatizadas. El 1 de agosto de 2012 el servidor no actualizado al ejecutar el antiguo código «Power Peg» mandó millones de órdenes porque el contador de acciones ejecutadas en cada orden no se comunicaba a SMARS y entonces el proceso de compra no se paraba nunca. En un intento de solucionar el problema desinstalaron el nuevo código RLP de los siete servidores que funcionaban correctamente, lo que agravó el problema. En 45 minutos ejecutó 4 millones de operaciones en 154 valores moviendo 397 millones de acciones, cuando en su lugar debería haber ejecutado 212 órdenes de pequeña entidad. Knight Capital perdió 460 millones de USD y la SEC le impuso una multa de 12 millones de USD por violar regulaciones de bolsa.
Boeing 737 MAX
thumb|right|Boeing 737 MAX 8
Dos accidentes del avión Boeing 737 MAX en 2018 y 2019 llevaron a que el 13 de marzo de 2019 la FAA iniciara la Suspensión de vuelo del Boeing 737 MAX durante meses por fallos en el software MCAS (Sistema de Aumento de Características de Maniobra, en inglés, Manoeuvring Characteristics Augmentation System). Fallecieron 346 personas en los accidentes. La FAA permitía a fabricantes como Boeing emitir certificados de vuelo para sus aviones. En noviembre de 2019 la FAA suspendió la capacidad de Boeing para emitir certificados para los aviones MAX.