Article de reference

Analyse du programme

En informatique , l'analyse de programme est le processus d'analyse automatique du comportement des programmes informatiques concernant une propriété telle que l'exactitude, la ...

En informatique , l'analyse de programme est le processus d'analyse automatique du comportement des programmes informatiques concernant une propriété telle que l'exactitude, la robustesse, la sécurité et la vivacité. L'analyse de programme se concentre sur deux domaines principaux : l'optimisation du programme et l'exactitude du programme . Le premier se concentre sur l'amélioration des performances du programme tout en réduisant l'utilisation des ressources tandis que le second se concentre sur la garantie que le programme fait ce qu'il est censé faire.

L'analyse du programme peut être effectuée sans exécuter le programme ( analyse statique du programme ), pendant l'exécution ( analyse dynamique du programme ) ou dans une combinaison des deux.

Analyse statique du programme

Dans le contexte de l'exactitude du programme, l'analyse statique peut découvrir des vulnérabilités pendant la phase de développement du programme. Ces vulnérabilités sont plus faciles à corriger que celles trouvées pendant la phase de test puisque l'analyse statique conduit à la racine de la vulnérabilité.

Étant donné que de nombreuses formes d'analyse statique sont indécidables sur le plan informatique , les mécanismes permettant de les exécuter ne se terminent pas toujours avec la bonne réponse. Cela peut entraîner soit des faux négatifs (« aucun problème détecté » alors que le code présente effectivement des problèmes) ou des faux positifs , soit parce qu'ils ne renvoient jamais de réponse incorrecte, mais peuvent également ne jamais se terminer. Malgré ces limitations, l'analyse statique peut toujours être utile : le premier type de mécanisme peut réduire le nombre de vulnérabilités, tandis que le second peut parfois fournir une forte assurance de l'absence de certaines classes de vulnérabilités.

Les optimisations incorrectes sont hautement indésirables. Ainsi, dans le contexte de l'optimisation des programmes, il existe deux stratégies principales pour gérer les analyses indécidables sur le plan informatique :

  1. Un optimiseur qui devrait s'exécuter dans un laps de temps relativement court, comme l'optimiseur d'un compilateur d'optimisation , peut utiliser une version tronquée d'une analyse qui est garantie de s'exécuter dans un laps de temps fini et de ne trouver que des optimisations correctes.
  2. Un outil d'optimisation tiers peut être implémenté de manière à ne jamais produire d'optimisation incorrecte, mais aussi à pouvoir, dans certaines situations, continuer à fonctionner indéfiniment jusqu'à ce qu'il en trouve une (ce qui peut ne jamais se produire). Dans ce cas, le développeur utilisant l'outil devrait arrêter l'outil et éviter de l'exécuter à nouveau sur ce morceau de code (ou éventuellement modifier le code pour éviter de faire trébucher l'outil).

Il existe cependant une troisième stratégie qui est parfois applicable aux langages qui ne sont pas complètement spécifiés, comme le C. Un compilateur optimisant est libre de générer du code qui fait n'importe quoi au moment de l'exécution (même des plantages) s'il rencontre du code source dont la sémantique n'est pas spécifiée par la norme de langage utilisée.

Contrôle de flux

L'objectif de l'analyse de flux de contrôle est d'obtenir des informations sur les fonctions qui peuvent être appelées à différents moments de l'exécution d'un programme. Les informations collectées sont représentées par un graphe de flux de contrôle (CFG) où les nœuds sont des instructions du programme et les arêtes représentent le flux de contrôle. En identifiant les blocs de code et les boucles, un CFG devient un point de départ pour les optimisations réalisées par le compilateur.

Analyse des flux de données

L'analyse des flux de données est une technique conçue pour recueillir des informations sur les valeurs à chaque point du programme et sur la façon dont elles évoluent au fil du temps. Cette technique est souvent utilisée par les compilateurs pour optimiser le code. L'un des exemples les plus connus d'analyse des flux de données est la vérification des souillures , qui consiste à prendre en compte toutes les variables contenant des données fournies par l'utilisateur – qui sont considérées comme « contaminées », c'est-à-dire non sécurisées – et à empêcher l'utilisation de ces variables jusqu'à ce qu'elles aient été nettoyées. Cette technique est souvent utilisée pour empêcher les attaques par injection SQL . La vérification des souillures peut être effectuée de manière statique ou dynamique.

Interprétation abstraite

L'interprétation abstraite permet d'extraire des informations sur une éventuelle exécution d'un programme sans réellement exécuter le programme. Ces informations peuvent être utilisées par les compilateurs pour rechercher d'éventuelles optimisations ou pour certifier un programme contre certaines classes de bugs.

Systèmes de types

Les systèmes de types associent des types à des programmes qui répondent à certaines exigences. Leur objectif est de sélectionner un sous-ensemble de programmes d'un langage qui sont considérés comme corrects selon une propriété.

La vérification de type est utilisée en programmation pour limiter la manière dont les objets de programmation sont utilisés et ce qu'ils peuvent faire. Cette opération est effectuée par le compilateur ou l'interpréteur . La vérification de type peut également aider à prévenir les vulnérabilités en garantissant qu'une valeur signée n'est pas attribuée à une variable non signée. La vérification de type peut être effectuée de manière statique (au moment de la compilation), dynamique (au moment de l'exécution) ou une combinaison des deux.

Les informations de type statiques (soit déduites , soit fournies explicitement par des annotations de type dans le code source) peuvent également être utilisées pour effectuer des optimisations, telles que le remplacement de tableaux encadrés par des tableaux non encadrés.

Systèmes d'effets

Les systèmes d'effets sont des systèmes formels conçus pour représenter les effets que l'exécution d'une fonction ou d'une méthode peut avoir. Un effet codifie ce qui est fait et avec quoi cela est fait – généralement appelés respectivement type d'effet et région d'effet .

Vérification du modèle

La vérification de modèle fait référence à des méthodes strictes, formelles et automatisées permettant de vérifier si un modèle (qui dans ce contexte signifie un modèle formel d'un morceau de code, bien que dans d'autres contextes, il puisse s'agir d'un modèle d'un élément matériel) est conforme à une spécification donnée. En raison de la nature intrinsèquement finie du code, et de la spécification et du code pouvant être convertis en formules logiques , il est possible de vérifier si le système viole la spécification à l'aide de méthodes algorithmiques efficaces.

Analyse dynamique de programme

L'analyse dynamique peut utiliser les connaissances d'exécution du programme pour augmenter la précision de l'analyse, tout en offrant une protection d'exécution, mais elle ne peut analyser qu'une seule exécution du problème et peut dégrader les performances du programme en raison des contrôles d'exécution.

Essai

Les logiciels doivent être testés pour garantir leur qualité et leur fiabilité, et pour s'assurer qu'ils ne créent pas de conflits avec d'autres logiciels qui pourraient fonctionner à ses côtés. Les tests sont effectués en exécutant le programme avec une entrée et en évaluant son comportement et la sortie produite. Même si aucune exigence de sécurité n'est spécifiée, des tests de sécurité supplémentaires doivent être effectués pour s'assurer qu'un attaquant ne peut pas altérer le logiciel et voler des informations, perturber le fonctionnement normal du logiciel ou l'utiliser comme pivot pour attaquer ses utilisateurs.

Surveillance

La surveillance des programmes enregistre et consigne différents types d'informations sur le programme, telles que l'utilisation des ressources, les événements et les interactions, afin de pouvoir les examiner pour trouver ou identifier les causes d'un comportement anormal. En outre, elle peut être utilisée pour effectuer des audits de sécurité. La surveillance automatisée des programmes est parfois appelée vérification d'exécution .

Découpage de programme

Pour un sous-ensemble donné du comportement d'un programme, le découpage du programme consiste à réduire le programme à la forme minimale qui produit toujours le comportement sélectionné. Le programme réduit est appelé « tranche » et est une représentation fidèle du programme d'origine dans le domaine du sous-ensemble de comportement spécifié. En général, trouver une tranche est un problème insoluble, mais en spécifiant le sous-ensemble de comportement cible par les valeurs d'un ensemble de variables, il est possible d'obtenir des tranches approximatives à l'aide d'un algorithme de flux de données. Ces tranches sont généralement utilisées par les développeurs lors du débogage pour localiser la source des erreurs.