Corrección automática de errores


La corrección automática de errores es la reparación automática de errores de software sin la intervención de un programador humano. [1] [2] También se conoce comúnmente como generación automática de parches , reparación automática de errores o reparación automática de programas . [3] [4] El objetivo típico de tales técnicas es generar automáticamente los parches correctos para eliminar errores en los programas de software sin causar una regresión del software . [5]

La corrección automática de errores se realiza de acuerdo con una especificación del comportamiento esperado que puede ser, por ejemplo, una especificación formal o un conjunto de pruebas . [6]

Un conjunto de pruebas: los pares de entrada/salida especifican la funcionalidad del programa, posiblemente capturados en aserciones , se pueden usar como un oráculo de prueba para impulsar la búsqueda. De hecho, este oráculo se puede dividir entre el oráculo de errores que expone el comportamiento defectuoso y el oráculo de regresión , que encapsula la funcionalidad que cualquier método de reparación de programas debe preservar. Tenga en cuenta que un conjunto de pruebas suele estar incompleto y no cubre todos los casos posibles. Por lo tanto, a menudo es posible que un parche validado produzca resultados esperados para todas las entradas en el conjunto de pruebas, pero resultados incorrectos para otras entradas. [7] La ​​existencia de dichos parches validados pero incorrectos es un gran desafío para las técnicas de generación y validación.[7] Las recientes y exitosas técnicas automáticas de corrección de errores a menudo se basan en información adicional además del conjunto de pruebas, como la información aprendida de parches humanos anteriores, para identificar aún más los parches correctos entre los parches validados. [8]

Otra forma de especificar el comportamiento esperado es usar especificaciones formales [9] [10] La verificación contra especificaciones completas que especifican el comportamiento completo del programa, incluidas las funcionalidades, es menos común porque tales especificaciones generalmente no están disponibles en la práctica y el costo de cálculo de dicha verificación es prohibitivo. Sin embargo, para clases específicas de errores, a menudo se dispone de especificaciones parciales implícitas. Por ejemplo, existen técnicas específicas de corrección de errores que validan que el programa parcheado ya no puede desencadenar errores de desbordamiento en la misma ruta de ejecución. [11]

Los enfoques de generación y validación compilan y prueban cada parche candidato para recopilar todos los parches validados que producen los resultados esperados para todas las entradas en el conjunto de pruebas. [6] [7] Dicha técnica generalmente comienza con un conjunto de pruebas del programa, es decir, un conjunto de casos de prueba , al menos uno de los cuales expone el error. [6] [8] [12] [13] Uno de los primeros sistemas de corrección de errores de generación y validación es GenProg. [6] La eficacia de las técnicas de generación y validación sigue siendo controvertida, ya que, por lo general, no brindan garantías de corrección de parches . [7] [14]Sin embargo, los resultados informados de técnicas recientes de vanguardia son generalmente prometedores. Por ejemplo, en 69 errores del mundo real recopilados sistemáticamente en ocho grandes programas de software C, el sistema de corrección de errores de vanguardia Prophet genera parches correctos para 18 de los 69 errores. [8]

Una forma de generar parches candidatos es aplicar operadores de mutación en el programa original. Los operadores de mutación manipulan el programa original, potencialmente a través de su representación de árbol de sintaxis abstracta , o una representación más detallada, como operar a nivel de instrucción o de bloque . Los enfoques de mejoramiento genético anteriores operan a nivel de declaración y llevan a cabo operaciones simples de eliminación/reemplazo, como eliminar una declaración existente o reemplazar una declaración existente con otra declaración en el mismo archivo fuente. [6] [15] Los enfoques recientes utilizan operadores más detallados en el árbol de sintaxis abstractanivel para generar un conjunto más diverso de parches candidatos. [13] En particular, el operador de mutación de eliminación de declaraciones, y más generalmente la eliminación de código, es una estrategia de reparación razonable, o al menos una buena estrategia de localización de fallas. [16] [17]