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 :
- Logiciels médicaux : La Food and Drug Administration (FDA) américaine a identifié l'utilisation de l'analyse statique pour les dispositifs médicaux.
- 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 .
- Logiciel aéronautique (en combinaison avec l'analyse dynamique ).
- 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 :
- L'interprétation abstraite permet de modéliser l'effet de chaque instruction sur l'état d'une machine abstraite (c'est-à-dire qu'elle « exécute » le logiciel en fonction des propriétés mathématiques de chaque instruction et déclaration). Cette machine abstraite sur-approxime les comportements du système : le système abstrait est ainsi simplifié à analyser, au prix d' une incomplétude (toutes les propriétés vraies du système original ne le sont pas dans le système abstrait). Cependant, si elle est correctement mise en œuvre, l'interprétation abstraite est valide (chaque propriété vraie du système abstrait peut être mise en correspondance avec une propriété vraie du système original).
- L'analyse de flux de données , une technique basée sur un treillis pour recueillir des informations sur l'ensemble possible des valeurs ;
- La logique de Hoare est un système formel doté d'un ensemble de règles logiques permettant de raisonner rigoureusement sur la correction des programmes informatiques . Elle offre un support technique pour certains langages de programmation (par exemple, le langage de programmation SPARK (un sous-ensemble d' Ada ) et le langage de modélisation Java — JML — utilisant ESC/Java et ESC/Java2 , ainsi que le plugin Frama-C WP ( précondition la plus faible ) pour le langage C étendu avec ACSL ( langage de spécification ANSI/ISO C )).
- La vérification de modèles considère les systèmes qui ont un état fini ou qui peuvent être réduits à un état fini par abstraction ;
- L'exécution symbolique , telle qu'utilisée pour dériver des expressions mathématiques représentant la valeur des variables mutées à des points particuliers du code.
- Analyse de référence nullable
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 .