El análisis de programas dinámicos es el acto de analizar software que implica la ejecución de un programa , a diferencia del análisis de programas estáticos , que no lo ejecuta.
El análisis puede centrarse en diferentes aspectos del software, incluidos, entre otros: comportamiento , cobertura de pruebas , rendimiento y seguridad .
Para que sea eficaz, el programa de destino debe ejecutarse con suficientes entradas de prueba [1] para abordar los rangos de posibles entradas y salidas. Se utilizan medidas de prueba de software , como la cobertura de código , y herramientas como la prueba de mutación , para identificar dónde las pruebas son inadecuadas.
Las pruebas funcionales incluyen técnicas de programación relativamente comunes , como pruebas unitarias , pruebas de integración y pruebas de sistema . [2]
El cálculo de la cobertura de código de una prueba identifica el código que no se prueba, es decir, que no está cubierto por una prueba.
Aunque este análisis identifica el código que no se ha probado, no determina si el código probado se ha probado adecuadamente . El código se puede ejecutar incluso si las pruebas no verifican realmente el comportamiento correcto.
Las pruebas dinámicas implican la ejecución de un programa en un conjunto de casos de prueba.
El fuzzing es una técnica de prueba que implica ejecutar un programa en una amplia variedad de entradas; a menudo, estas entradas se generan aleatoriamente (al menos en parte). Los fuzzers de caja gris utilizan la cobertura de código para guiar la generación de entradas.
La ejecución simbólica dinámica (también conocida como DSE o ejecución concólica) implica ejecutar un programa de prueba en una entrada concreta, recolectar las restricciones de ruta asociadas con la ejecución y usar un solucionador de restricciones (generalmente, un solucionador SMT ) para generar nuevas entradas que harían que el programa tome una ruta de flujo de control diferente, aumentando así la cobertura del código del conjunto de pruebas. [3] La DSE puede considerarse un tipo de fuzzing (fuzzing de "caja blanca").
El análisis dinámico del flujo de datos rastrea el flujo de información desde las fuentes hasta los receptores . Las formas de análisis dinámico del flujo de datos incluyen el análisis dinámico de contaminación e incluso la ejecución simbólica dinámica. [4] [5]
Daikon es una implementación de detección invariante dinámica. Daikon ejecuta un programa, observa los valores que calcula el programa y luego informa las propiedades que fueron verdaderas en las ejecuciones observadas y, por lo tanto, probablemente verdaderas en todas las ejecuciones.
El análisis dinámico se puede utilizar para detectar problemas de seguridad.
Para un subconjunto dado del comportamiento de un programa, la segmentación del programa consiste en reducir el programa a la forma mínima que aún produce el comportamiento seleccionado. El programa reducido se denomina "segmento" y es una representación fiel del programa original dentro del dominio del subconjunto del comportamiento especificado. Generalmente, encontrar un segmento es un problema irresoluble, pero al especificar el subconjunto del comportamiento objetivo mediante los valores de un conjunto de variables, es posible obtener segmentos aproximados utilizando un algoritmo de flujo de datos. Estos segmentos suelen ser utilizados por los desarrolladores durante la depuración para localizar la fuente de los errores.
La mayoría de las herramientas de análisis de rendimiento utilizan técnicas de análisis de programas dinámicos. [ cita requerida ]
La mayoría del análisis dinámico implica instrumentación o transformación.
Dado que la instrumentación puede afectar el rendimiento en tiempo de ejecución, la interpretación de los resultados de las pruebas debe tener esto en cuenta para evitar la identificación errónea de un problema de rendimiento.
DynInst es una biblioteca de parches de código en tiempo de ejecución que resulta útil para desarrollar sondas de análisis de programas dinámicos y aplicarlas a ejecutables compilados. DynInst no requiere código fuente ni recompilación en general; sin embargo, los ejecutables no descomprimidos y los ejecutables con símbolos de depuración son más fáciles de instrumentar.
Iroh.js es una biblioteca de análisis de código en tiempo de ejecución para JavaScript . Realiza un seguimiento de la ruta de ejecución del código, proporciona detectores en tiempo de ejecución para detectar patrones específicos del código ejecutado y permite interceptar y manipular el comportamiento de ejecución del programa.