← Últimos artículos
💻 computer science

What Makes Software Bugs Escape Testing? Evidence from a Large-Scale Empirical Study

Este estudio empírico a gran escala de más de 14.000 defectos en sistemas C/C++ y Java revela que los errores posteriores al lanzamiento son impulsados principalmente por dinámicas evolutivas y de proceso en componentes antiguos y frecuentemente modificados, en lugar de por la estructura del código únicamente, lo que sugiere que los esfuerzos de fiabilidad deben priorizar pruebas dirigidas en estas regiones maduras y de alto cambio.

Autores originales: Domenico Cotroneo, Giuseppe De Rosa, Cristina Improta, Benedetta Gaia Varriale

Publicado 2026-04-30
📖 5 min de lectura🧠 Análisis profundo

Autores originales: Domenico Cotroneo, Giuseppe De Rosa, Cristina Improta, Benedetta Gaia Varriale

Artículo original bajo licencia CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Esta es una explicación generada por IA del artículo a continuación. No ha sido escrita ni avalada por los autores. Para mayor precisión técnica, consulte el artículo original. Leer descargo de responsabilidad completo

Imagina que eres un detective intentando resolver un misterio: ¿Por qué algunos errores de software se deslizan pasando de largo a los guardias de seguridad (los probadores) y solo aparecen después de que el software es lanzado al público?

La mayoría de las investigaciones anteriores se han centrado en los errores que los guardias atraparon antes de que se abrieran las puertas. Este artículo sostiene que esto es como estudiar solo a los criminales que fueron capturados en el aeropuerto, ignorando a los que lograron colarse con éxito. Para entender a los "artistas de la fuga", los investigadores construyeron una base de datos masiva de más de 14.000 errores de software real escrito en C/C++ y Java. Compararon los errores "atrapados" (pre-lanzamiento) con los errores "escapados" (post-lanzamiento) para ver qué los hace diferentes.

Aquí está lo que encontraron, explicado mediante analogías simples:

1. No se trata de la "apariencia" del código, sino de su "historia"

Imagina dos casas.

  • Casa A es un cobertizo nuevo y sencillo.
  • Casa B es una antigua mansión que ha sido renovada 50 veces por 20 contratistas diferentes, con algunos muros derribados y otros añadidos.

Los investigadores descubrieron que los errores que escapan a las pruebas no suelen esconderse en los "cobertizos sencillos" (código complejo y desordenado). En cambio, casi siempre se esconden en las "antiguas mansiones" (código antiguo que ha sido modificado con frecuencia).

  • La analogía: Piensa en el código como una autopista concurrida. Los errores que escapan no suelen estar en los carriles nuevos y vacíos. Están en los carriles antiguos y muy transitados donde los equipos de construcción han estado trabajando durante años, cambiando las señales y el pavimento. Cuanto más se ha tocado un fragmento de código, cuanto más antiguo es y cuántas personas diferentes han trabajado en él, más probable es que un "error fantasma" se esté escondiendo allí, esperando un patrón de tráfico específico para activarse.

2. Los "artistas de la fuga" son más difíciles de atrapar (y de arreglar)

Cuando se encuentra un error antes del lanzamiento (en la fase de pruebas), suele ser como encontrar un error tipográfico en un borrador. Lo arreglas rápidamente y desaparece.

Pero cuando un error escapa y aparece después del lanzamiento, es como encontrar una grieta estructural en un puente que solo aparece cuando un camión pesado específico lo cruza a una hora determinada del día.

  • El hallazgo: En C/C++ (el lenguaje utilizado para sistemas como sistemas operativos y motores de juegos), arreglar estos errores escapados toma mucho más tiempo y requiere cambios más complejos que arreglar los errores pre-lanzamiento.
  • La analogía: Arreglar un error pre-lanzamiento es como reemplazar una baldosa rota en una cocina. Arreglar un error post-lanzamiento en C/C++ es como intentar reemplazar una viga de carga en un edificio mientras la gente aún vive dentro. Toma más tiempo, más habilidad y una planificación más cuidadosa.
  • La diferencia de Java: Curiosamente, en Java (a menudo utilizado para aplicaciones empresariales), la diferencia en el tiempo de reparación no fue tan enorme. Es como si el "edificio" en Java fuera más fácil de reparar, quizás porque las herramientas y las redes de seguridad (como la gestión automática de memoria) hacen que el trabajo sea menos peligroso y caótico que en C/C++.

3. El "tamaño del equipo" no cambia, pero sí el "poder mental"

Podrías pensar que arreglar un error aterrador y escapado requeriría un ejército completo de personas para resolverlo. Los investigadores descubrieron que esto no es cierto.

  • El hallazgo: El número de personas involucradas en arreglar un error es aproximadamente el mismo, ya sea que haya sido detectado temprano o tarde.
  • La analogía: Ya sea que estés arreglando un grifo que gotea (pre-lanzamiento) o una tubería rota en el sótano (post-lanzamiento), aún solo necesitas uno o dos fontaneros. La diferencia no es que necesites más personas; es que el trabajo en sí mismo es más difícil y toma más tiempo para que esas mismas personas lo descifren. Los errores "escapados" son simplemente más confusos y difíciles de diagnosticar.

4. El "ambiente" del código cambia

Los investigadores utilizaron matemáticas para examinar la "personalidad" del código.

  • El hallazgo: Antes del lanzamiento, la "personalidad" del código (su tamaño, complejidad y estructura) es bastante predecible. Pero para los errores escapados, el código tiene una personalidad caótica y desordenada.
  • La analogía: Imagina una biblioteca.
    • Los errores pre-lanzamiento se encuentran en secciones donde los libros están ordenados meticulosamente por tamaño y color.
    • Los errores post-lanzamiento se encuentran en secciones donde los libros han sido revueltos, apilados unos sobre otros y movidos por muchas personas diferentes a lo largo de muchos años. El "caos" de la historia es lo que esconde el error, no el hecho de que los libros sean grandes o pequeños.

La conclusión

El artículo concluye que no deberíamos mirar solo lo "complicado" que parece un fragmento de código en este momento para encontrar errores. En cambio, necesitamos mirar su historia.

Si un fragmento de código es viejo, ha sido cambiado mucho y ha sido tocado por muchas personas diferentes, es un escondite principal para errores que escaparán a las pruebas. Para atrapar a estos "artistas de la fuga", los probadores deben centrar su energía en estos "barrios antiguos y concurridos" del código, en lugar de simplemente verificar las partes más nuevas y que parecen más complejas.

En resumen: Los errores que escapan a las pruebas no suelen esconderse porque el código sea demasiado difícil de leer; se esconden porque el código tiene una historia larga y desordenada que los probadores no simularon completamente.

¿Ahogado en artículos de tu campo?

Recibe resúmenes diarios de los artículos más novedosos que coincidan con tus palabras clave de investigación — con resúmenes técnicos, en tu idioma.

Probar Digest →