code-review code-analysis dynamic-analysis

code review - ¿Qué es el Análisis de código dinámico?



code-review code-analysis (4)

Comprobación de límites

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

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

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

He oído hablar de comprobación de límites y análisis de memoria: ¿qué son estos?

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

-Adán


Básicamente, usted 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 vea esta presentación de JavaOne comparando los dos . Valgrind es una herramienta de análisis dinámico de ejemplo para C. También podría usar herramientas de cobertura de códigos como Cobertura o EMMA para análisis de Java.

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

El análisis de programa dinámico es el análisis del software de computadora que se ejecuta 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 dinámicas de análisis de programas pueden requerir la carga de bibliotecas especiales o incluso la recompilación del código del programa.


Usted solicitó una buena explicación de los problemas de "comprobación de límites y análisis de memoria".

Nuestra herramienta de verificación de seguridad de la memoria instrumenta a su aplicación para observar en tiempo de ejecución los errores de acceso a la memoria (sobrepasamientos de búfer, errores de subíndices de matriz, punteros incorrectos, errores de asignación / libre). El enlace contiene una explicación detallada completa con ejemplos.

Un ejemplo más breve: C (y C ++) infamemente 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 costo de dicho control en el modo de producción. Lo malo: los programas con errores pueden tocar cosas que están fuera del arreglo, 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 cosa a la 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, independientemente de si se viola la matriz encuadernada. La herramienta modifica el programa original para recopilar los metadatos donde se genera (por ejemplo, en la entrada 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 límites, el control detecta el error e informa en el primer lugar donde podría detectarse. [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 un lenguaje como C pueda tener. Es realmente difícil hacer que esto funcione por completo).

La buena noticia es que ahora ese acceso se informa temprano, donde es más fácil detectar el problema y arreglar el programa. Dicha herramienta no es uso de producción previsto; uno se usa durante el desarrollo y las pruebas para ayudar a verificar la ausencia de errores. Si no se descubren errores, uno hace una compilación normal y ejecuta los programas sin los controles.

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


En pocas palabras, el análisis estático recopila información basada en el 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. Ej .: dependencias dinámicas usando reflexión, inyección de dependencia, polimorfismo.
  • Puede recopilar información temporal.
  • Trata con 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 vendrán, 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 completa del código fuente, ya que sus ejecuciones se basan en la interacción del usuario o las pruebas automáticas.

Recursos

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