Article de reference

Analyse statique de programmes

En informatique , l'analyse statique de programmes (également appelée analyse statique ou simulation statique ) est l' analyse de programmes informatiques effectuée sans les exé...

informatique , l'analyse statique de programmes (également appelée analyse statique ou simulation statique ) est l' analyse de programmes informatiques effectuée sans les exécuter, contrairement à l'analyse dynamique de programmes , qui est effectuée sur les programmes pendant leur exécution dans l'environnement intégré.

Le terme s'applique généralement à l'analyse effectuée par un outil automatisé, l'analyse humaine étant généralement appelée « compréhension du programme », « analyse de code » ou « revue de code ». Dans ce dernier cas, on utilise également les termes « inspection du logiciel » et « analyse détaillée du logiciel » . Le plus souvent, l'analyse porte sur une version du code source du programme , et parfois sur une version de son code objet .

Deux approches majeures de la certification des ressources sont l'analyse statique (AS) et la complexité algorithmique implicite (CAI). L'AS est de nature algorithmique : elle se concentre sur un langage de programmation donné et cherche à déterminer, par des moyens syntaxiques, si des programmes écrits dans ce langage sont réalisables. À l'inverse, la CAI vise à créer dès le départ des langages ou des méthodes de programmation spécialisés qui définissent une classe de complexité. Ainsi, l'AS se concentre sur le temps de compilation, sans imposer d'exigence au programmeur ; tandis que la CAI relève de la conception de langages.

— D. Leivant (2020)

Il ne faut pas confondre l'analyse statique avec le linting , qui est le processus de vérification des erreurs de style de codage .

du code source d'un programme. L'utilisation des informations obtenues est diverse : elle peut aller de la détection d'erreurs de codage potentielles (par exemple, avec un outil de lint ) à des méthodes formelles permettant de démontrer mathématiquement des propriétés d'un programme donné (par exemple, son comportement est conforme à sa spécification).

Les métriques logicielles et la rétro-ingénierie peuvent être décrites comme des formes d'analyse statique. La dérivation de métriques logicielles et l'analyse statique sont de plus en plus souvent utilisées conjointement, notamment dans la création de systèmes embarqués, en définissant des objectifs de qualité logicielle .

L'analyse statique trouve une application commerciale croissante dans la vérification des propriétés des logiciels utilisés dans les systèmes informatiques critiques pour la sécurité et la localisation des codes potentiellement vulnérables . Par exemple, les secteurs suivants ont identifié l'analyse statique du code comme un moyen d'améliorer la qualité de logiciels de plus en plus sophistiqués et complexes :

  1. Logiciels médicaux : La Food and Drug Administration (FDA) américaine a identifié l'utilisation de l'analyse statique pour les dispositifs médicaux.
  2. Logiciels nucléaires : Au Royaume-Uni, l’Office for Nuclear Regulation (ONR) recommande l’utilisation de l’analyse statique sur les systèmes de protection des réacteurs .
  3. Logiciel aéronautique (en combinaison avec l'analyse dynamique ).
  4. Automobile et machines (les dispositifs de sécurité fonctionnelle font partie intégrante de chaque phase de développement d'un produit automobile, ISO 26262 , section 8).

Une étude menée en 2012 par VDC Research a révélé que 28,7 % des ingénieurs en logiciels embarqués interrogés utilisaient des outils d'analyse statique et que 39,7 % prévoyaient de les utiliser dans les deux ans à venir. Une étude de 2010 a montré que 60 % des développeurs interrogés dans le cadre de projets de recherche européens utilisaient au moins l'analyseur statique intégré à leur environnement de développement intégré (IDE). Cependant, seulement 10 % environ utilisaient un autre outil d'analyse (éventuellement plus avancé).

Dans le secteur de la sécurité des applications , on utilise également le terme de tests statiques de sécurité des applications (SAST). Les SAST constituent une partie importante des cycles de vie de développement sécurisé (SDL), tels que le SDL défini par Microsoft , et une pratique courante dans les entreprises de logiciels.

Types d'outils

L’OMG ( Object Management Group ) a publié une étude sur les types d’analyse logicielle nécessaires à la mesure et à l’évaluation de la qualité des logiciels . Ce document, intitulé « Comment fournir des systèmes informatiques résilients, sécurisés, efficaces et facilement modifiables conformément aux recommandations du CISQ », décrit trois niveaux d’analyse logicielle.

Niveau de l'unité
Analyse effectuée au sein d'un programme ou d'une sous-routine spécifique, sans lien avec le contexte de ce programme.
Niveau technologique
Une analyse qui prend en compte les interactions entre les programmes unitaires afin d'obtenir une vue plus holistique et sémantique du programme global, dans le but de détecter les problèmes et d'éviter les faux positifs évidents .
Niveau système
Une analyse qui prend en compte les interactions entre les programmes unitaires, sans pour autant se limiter à une technologie ou un langage de programmation spécifique.

Un niveau d'analyse logicielle supplémentaire peut être défini.

Niveau de mission/d'activité
L'analyse prend en compte les termes, règles et processus de la couche métier/mission mis en œuvre au sein du système logiciel pour son fonctionnement dans le cadre des activités de l'entreprise ou du programme/de la mission. Ces éléments ne sont pas limités à une technologie ou un langage de programmation spécifique et sont souvent répartis entre plusieurs langages ; ils sont extraits et analysés statiquement pour la compréhension du système et la garantie de la mission.

De nombreux outils d'analyse statique utilisent des représentations intermédiaires des programmes pour examiner la structure du code source sans exécuter le programme. À cette fin, les arbres de syntaxe abstraite (AST) sont couramment utilisés, car ils fournissent une représentation structurée des éléments syntaxiques d'un programme.logiciels (et du matériel informatique ) dont les résultats sont obtenus exclusivement par l'utilisation de méthodes mathématiques rigoureuses. Parmi les techniques mathématiques employées figurent la sémantique dénotationnelle , la sémantique axiomatique , la sémantique opérationnelle et l'interprétation abstraite .

Par une réduction directe au problème de l'arrêt , il est possible de démontrer que (pour tout langage Turing-complet ), la recherche de toutes les erreurs d'exécution possibles dans un programme quelconque (ou plus généralement de toute violation d'une spécification sur le résultat final d'un programme) est indécidable : il n'existe aucune méthode mécanique permettant de déterminer systématiquement et avec certitude si un programme quelconque peut ou non présenter des erreurs d'exécution. Ce résultat date des travaux de Church , Gödel et Turing dans les années 1930 (voir : Problème de l'arrêt et théorème de Rice ). Comme pour de nombreuses questions indécidables, il est néanmoins possible de proposer des solutions approchées utiles.

Certaines des techniques de mise en œuvre de l'analyse statique formelle comprennent :

Analyse statique basée sur les données

L'analyse statique basée sur les données exploite de vastes bases de code pour inférer les règles de codage et améliorer la précision de l'analyse. Par exemple, il est possible d'utiliser tous les packages open source Java disponibles sur GitHub pour apprendre de bonnes stratégies d'analyse. L'inférence des règles peut faire appel à des techniques d'apprentissage automatique. Il est également possible de tirer des enseignements d'un grand nombre de correctifs et d'avertissements antérieurs.

Remédiation

Les analyseurs statiques génèrent des avertissements. Pour certains types d'avertissements, il est possible de concevoir et de mettre en œuvre des techniques de remédiation automatisées . Par exemple, Logozzo et Ball ont proposé des remédiations automatisées pour C# cccheck .