Qu'est-ce que L'analyse de Code dynamique?

Qu'est-ce que L'analyse de Code dynamique?

en quoi diffère-t-il de analyse de Code statique (c.-à-d., qu'est-ce qu'il peut attraper qui ne peut pas être attrapé en statique)?

j'ai entendu parler de la vérification des limites et de l'analyse de la mémoire - qu'est-ce que c'est?

quelles autres choses sont vérifiées en utilisant l'analyse dynamique?

- Adam

20
demandé sur Community 2008-09-08 19:23:46

4 réponses

en termes simples, l'analyse statique recueillent des informations basées sur code source et l'analyse dynamique est basée sur exécution du système , souvent en utilisant l'instrumentation.

avantages de l'analyse dynamique

  • est capable de détecter des dépendances qu'il n'est pas possible de détecter en analyse statique. Ex.: dépendances dynamiques par réflexion, injection de dépendances, polymorphisme.
  • Peut collecter des informations temporelles.
  • traite des données d'entrée réelles. Pendant l'analyse statique il est difficile à impossible de savoir quels fichiers seront passés en entrée, quelles requêtes WEB viendront, quel utilisateur cliquera, etc.

inconvénients de l'analyse dynamique

  • peut avoir une incidence négative sur le rendement de la demande.
  • ne peut garantir la couverture complète de le code source, tel qu'il est exécuté, est basé sur l'interaction de l'utilisateur ou sur des tests automatiques.

ressources

il y a de nombreux outils d'analyse dynamique sur le marché, étant les débogueurs les plus notoires. D'un autre côté, c'est toujours un domaine de recherche universitaire. De nombreux chercheurs étudient comment utiliser l'analyse dynamique pour mieux comprendre les systèmes logiciels. Il y a un atelier annuel consacré à l'analyse de la dépendance .

29
répondu Marcio Aguiar 2016-12-06 01:12:27

fondamentalement, vous instrumentez votre code pour analyser votre logiciel comme il est en cours d'exécution (dynamique) plutôt que de simplement analyser le logiciel sans exécuter (statique). Voir aussi cette présentation JavaOne comparant les deux . Valgrind est un exemple d'outil d'analyse dynamique pour C. Vous pouvez également utiliser des outils de couverture de code comme Cobertura ou EMMA pour L'analyse Java.

de Wikipedia définition de l'analyse dynamique de programme :

analyse dynamique de programme est le analyse du logiciel qui est exécuté avec l'exécution de programmes construit à partir de ce logiciel sur un vrai ou processeur virtuel (analyse effectuée sans exécuter de programmes est connu comme l'analyse statique de code). Programme dynamique les outils d'analyse peuvent nécessiter le chargement de bibliothèques spéciales ou même recompilation du code du programme.

4
répondu David Schlosnagle 2008-09-08 15:36:03

vous avez demandé une bonne explication des problèmes de "vérification des limites et analyse de la mémoire".

notre vérification de la sécurité de la mémoire l'outil Instrumente votre application pour surveiller à l'exécution les erreurs d'accès à la mémoire (dépassements de mémoire tampon, erreurs de subscript, mauvais pointeurs, erreurs alloc/free). Le lien contient une explication détaillée avec des exemples.

un exemple plus bref: c (et C++) infamously ne vérifient pas les accès aux tableaux, pour voir si l'accès est à l'intérieur des limites du tableau. L'avantage: un programme bien conçu ne paie pas le coût d'un tel contrôle en mode production. L'inconvénient: les programmes buggy peuvent toucher des choses en dehors du tableau, et cela peut causer un comportement qui est très difficile à comprendre; donc le programme buggy est difficile à déboguer.

ce qu'un outil d'instrumentation dynamique comme le vérificateur de sécurité de la mémoire fait, c'est d'associer certaines métadonnées à chaque pointeur (par exemple, le type de la chose à laquelle le pointeur "pointe", et si c'est un tableau, les bornes du tableau), et puis vérifiez à l'exécution, tout accès via des pointeurs vers des tableaux, si la limite du tableau est violée. L'outil modifie le programme original pour recueillir les métadonnées à l'endroit où elles sont générées (par exemple, lors de l'entrée dans les portées dans lesquelles les tableaux sont déclarés, ou à la suite d'une opération malloc, etc.) et modifie le programme à chaque référence du tableau (écrit à la fois comme x[y] où x ou y est un pointeur du tableau et la valeur est un certain type de type intégral, de même pour *(x+y)!) pour vérifier les accès. Maintenant, si le programme tourne, et effectue un accès hors-limites, la vérification saisit l'erreur et elle a signalé au premier endroit où elle pourrait être détectée. [Si vous y pensez, vous réaliserez que l'instrumentation pour la collecte et la vérification des métadonnées doit être assez intelligente, pour gérer toutes les variantes qu'un langage comme C peut avoir. Il est en fait difficile de faire ce travail complètement).

Le bon nouvelle est que cet accès est signalé au début où il est plus facile de détecter le problème et corriger le programme. Un tel outil n'est pas destiné à la production; on l'utilise pendant le développement et les essais pour aider à vérifier l'absence d'erreurs. S'il n'y a pas d'erreurs découvertes, alors on fait une compilation normale et on exécute les programmes sans les vérifications.

c'est un très bon exemple d'outil d'analyse dynamique: les tests se font à l'exécution.

2
répondu Ira Baxter 2014-01-25 21:03:44

vérification des limites

contrôle de l'exécution des accès au réseau. Contrairement à L'approche de laisser-faire de C pour les accès mémoire et l'arithmétique pointeur, D'autres langages comme Java ou C# vérifient si un tableau donné a l'élément auquel on essaie d'accéder.

1
répondu David Schmitt 2008-09-08 15:43:35