Pregunta

¿Qué es el análisis de código dinámico?

¿En qué se diferencia de Análisis de código estático (es decir, ¿qué puede captar que no pueda captarse en estática)?

He oído hablar de la verificación de límites y del análisis de la memoria. ¿Qué son?

¿Qué otras cosas se verifican mediante el análisis dinámico?

-Adán

¿Fue útil?

Solución

En pocas palabras, el análisis estático recopila información basada en código fuente y el análisis dinámico se basa en la ejecución del sistema, a menudo utilizando instrumentación.

Ventajas del análisis dinámico

  • Es capaz de detectar dependencias que no son posibles de detectar en el análisis estático.Ex.:Dependencias dinámicas mediante reflexión, inyección de dependencia, polimorfismo.
  • Puede recopilar información temporal.
  • Se ocupa de datos de entrada reales.Durante el análisis estático es difícil o imposible saber qué archivos se pasarán como entrada, qué solicitudes WEB llegarán, en qué usuario hará clic, etc.

Desventajas del análisis dinámico

  • Puede afectar negativamente el rendimiento de la aplicación.
  • No se puede garantizar la cobertura total del código fuente, ya que sus ejecuciones se basan en la interacción del usuario o en pruebas automáticas.

Recursos

Existen muchas herramientas de análisis dinámico en el mercado, siendo los depuradores la más notoria.Por otro lado, sigue siendo un campo de investigación académica.Hay muchos investigadores que estudian cómo utilizar el análisis dinámico para comprender mejor los sistemas de software.Hay un taller anual dedicado a análisis de dependencia.

Otros consejos

Básicamente, instrumenta su código para analizar su software mientras se ejecuta (dinámico) en lugar de simplemente analizar el software sin ejecutarlo (estático).También mira esto Presentación de JavaOne comparando los dos. Valgrind es un ejemplo de herramienta de análisis dinámico para C.También puedes usar herramientas de cobertura de código como cobertura o EMMA para análisis de Java.

De Wikipedia definición de análisis dinámico de programas:

El análisis del programa dinámico es el análisis del software de computadora que se realiza con la ejecución de programas creados a partir de ese software en un procesador real o virtual (el análisis realizado sin ejecutar programas se conoce como análisis de código estático).Las herramientas de análisis de programas dinámicos pueden requerir la carga de bibliotecas especiales o incluso la recompilación del código del programa.

Solicitó una buena explicación de los problemas de "verificación de límites y análisis de memoria".

Nuestro Comprobación de seguridad de la memoria La herramienta instrumenta su aplicación para observar en tiempo de ejecución errores de acceso a la memoria (desbordamientos del búfer, errores de subíndice de matriz, punteros incorrectos, errores de asignación/liberación).El enlace contiene una explicación detallada completa con ejemplos.Este Pues contesta muestra dos programas que tienen punteros al marco de pila muerta y cómo CheckPointer detecta e informa el punto de error en el código fuente.

Un ejemplo más breve:C (y C++) no verifican los accesos a las matrices para ver si el acceso está dentro de los límites de la matriz.El beneficio:Un programa bien diseñado no paga el coste de dicho cheque en modo de producción.La baja:los programas con errores pueden tocar cosas fuera del conjunto, y esto puede causar un comportamiento que es muy difícil de entender;por lo tanto, el programa con errores es difícil de depurar.

Lo que hace una herramienta de instrumentación dinámica como Memory Safety Checker es asociar algunos metadatos con cada puntero (por ejemplo, el tipo de objeto al que "apunta" el puntero, y si es una matriz, los límites de la matriz), y luego verificar en tiempo de ejecución, cualquier acceso a través de punteros a matrices, si se viola el límite de la matriz.La herramienta modifica el programa original para recopilar los metadatos donde se generan (por ejemplo, al ingresar a ámbitos en los que se declaran matrices, o como resultado de una operación malloc, etc.) y modifica el programa en cada referencia de matriz (escrita tanto como x[y] donde x o y es un puntero de matriz y el valor es algún tipo de tipo integral, de manera similar para *(x+y)!) para verificar el acceso.Ahora, si el programa se ejecuta y realiza un acceso fuera de los límites, la verificación detecta el error y lo informa en el primer lugar donde se pudo detectar.[Si lo piensas bien, te darás cuenta de que la instrumentación para la recopilación y verificación de metadatos tiene que ser bastante inteligente para manejar todos los casos variantes que pueda tener un lenguaje como C.En realidad, es difícil hacer que esto funcione por completo).

La buena noticia es que ahora dicho acceso se informa tempranamente, donde es más fácil detectar el problema y solucionar el programa.Esta herramienta no está destinada a un uso productivo;uno utiliza durante el desarrollo y las pruebas para ayudar a verificar la ausencia de errores.Si no se descubren errores, se realiza una compilación normal y se ejecutan los programas sin las comprobaciones.

Este es un muy buen ejemplo de una herramienta de análisis dinámico:las pruebas ocurren en tiempo de ejecución.

Comprobación de límites

Esto significa comprobaciones en tiempo de ejecución de los accesos a la matriz.Contrariamente al enfoque de laissez-faire de C para los accesos a la memoria y la aritmética de punteros, otros lenguajes como Java o C# en realidad verifican si una matriz determinada tiene o no el elemento al que se intenta acceder.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top