Question

Qu’est-ce que l’analyse dynamique du code ?

En quoi est-ce différent de Analyse du code statique (c'est-à-dire, que peut-il attraper qui ne peut pas être capturé 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 à l’aide de l’analyse dynamique ?

-Adam

Était-ce utile?

La solution

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

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.Lors de l'analyse statique, il est difficile, voire impossible, de savoir quels fichiers seront transmis en entrée, quelles requêtes WEB arriveront, sur quel utilisateur cliquera, etc.

Inconvénients de l'analyse dynamique

  • Peut avoir un impact négatif sur les performances de l'application.
  • Nous ne pouvons pas garantir la couverture complète du code source, car ses exécutions sont basées sur l'interaction de l'utilisateur ou sur des tests automatiques.

Ressources

Il existe de nombreux outils d'analyse dynamique sur le marché, les débogueurs étant les plus connus.D’un autre côté, il s’agit toujours d’un domaine de recherche académique.De nombreux chercheurs étudient comment utiliser l'analyse dynamique pour une meilleure compréhension des systèmes logiciels.Il y a un atelier annuel dédié à analyse de dépendance.

Autres conseils

Fondamentalement, vous instrumentez votre code pour analyser votre logiciel pendant son exécution (dynamique) plutôt que de simplement analyser le logiciel sans s'exécuter (statique).Regarde aussi ceci 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 Wikipédia définition de l'analyse dynamique du programme:

L'analyse de programmes dynamiques est l'analyse des logiciels informatiques qui est effectué avec des programmes d'exécution construits à partir de ce logiciel sur un processeur réel ou virtuel (l'analyse effectuée sans exécution de programmes est connue sous le nom d'analyse de code statique).Les outils d'analyse de programme dynamique peuvent nécessiter le chargement de bibliothèques spéciales ou même la recompilation du code du programme.

Vous avez demandé une bonne explication des problèmes de « vérification des limites et d'analyse de la mémoire ».

Notre Vérification de la sécurité de la mémoire L'outil instrumente votre application pour surveiller au moment de l'exécution les erreurs d'accès à la mémoire (dépassements de tampon, erreurs d'indice de tableau, mauvais pointeurs, erreurs d'allocation/libre).Le lien contient une explication détaillée complète avec des exemples.Ce Alors réponse montre deux programmes qui ont des pointeurs vers un cadre de pile mort et comment CheckPointer détecte et signale le point d'erreur dans le code source

Un exemple plus bref :C (et C++) ne vérifient pas les accès aux tableaux, pour voir si l'accès se trouve à l'intérieur des limites du tableau.Le bénéfice:un programme bien conçu ne paie pas le coût d'un tel contrôle en mode production.Le mauvais côté:les programmes bogués peuvent toucher des éléments en dehors du tableau, ce qui peut provoquer un comportement très difficile à comprendre ;le programme buggy est donc difficile à déboguer.

Ce que fait un outil d'instrumentation dynamique comme Memory Safety Checker, c'est associer des métadonnées à chaque pointeur (par exemple, le type de la chose vers laquelle le pointeur "pointe", et s'il s'agit d'un tableau, les limites du tableau), puis vérifier au moment de l'exécution, tous les accès via des pointeurs vers des tableaux, que la limite du tableau soit violée.L'outil modifie le programme d'origine pour collecter les métadonnées là où elles sont générées (par exemple, lors de l'entrée dans les étendues 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 de tableau (écrite à la fois comme x[y] où x ou y est un pointeur de tableau et la valeur est un type de type intégral, de même pour *(x+y)!) pour vérifier l'accès.Désormais, si le programme s'exécute et effectue un accès hors limites, la vérification détecte l'erreur et la signale au premier endroit où elle a pu être détectée.[Si vous y réfléchissez, 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 de cas qu'un langage comme C peut avoir.C'est en fait difficile de faire en sorte que cela fonctionne complètement).

La bonne nouvelle est que désormais, un tel accès est signalé plus tôt, ce qui permet de détecter plus facilement le problème et de réparer le programme.Un tel outil n'est pas destiné à une utilisation en production ;on l'utilise pendant le développement et les tests pour aider à vérifier l'absence d'erreurs.Si aucune erreur n’est découverte, alors on effectue une compilation normale et on exécute les programmes sans vérifications.

Il s'agit d'un très bon exemple d'outil d'analyse dynamique :les tests ont lieu au moment de l'exécution.

Vérification des limites

Cela signifie des vérifications d'exécution des accès aux tableaux.Contrairement à l'approche de laissez-faire du C en matière d'accès à la mémoire et d'arithmétique des pointeurs, d'autres langages comme Java ou C# vérifient en fait si un tableau donné contient ou non l'élément auquel on tente d'accéder.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top