Thèse soutenue

Validation Formelle de Transformations Intra-Procédurales par Simulation Symbolique Défensive

FR  |  
EN
Auteur / Autrice : Léo Gourdin
Direction : Sylvain BoulméFrédéric Pétrot
Type : Thèse de doctorat
Discipline(s) : Informatique
Date : Soutenance le 12/12/2023
Etablissement(s) : Université Grenoble Alpes
Ecole(s) doctorale(s) : École doctorale Mathématiques, sciences et technologies de l'information, informatique (Grenoble ; 1995-....)
Partenaire(s) de recherche : Laboratoire : Laboratoire Verimag (Grenoble)
Jury : Président / Présidente : Gwen Salaün
Examinateurs / Examinatrices : Marc Pouzet, Delphine Demange
Rapporteurs / Rapporteuses : Jens Knoop, Jean-Christophe Filliâtre

Résumé

FR  |  
EN

Les compilateurs sont des systèmes complexes et peuvent contenir des bogues. Ces bogues peuvent se traduire par des erreurs au cours de la compilation ou par la génération d'un code incorrect. Les bogues qui altèrent la sémantique des programmes générés sont souvent insidieux et difficiles à retracer. Dans certaines applications, en particulier dans les systèmes embarqués critiques et sujets à des régulations strictes, l'élimination de ces bogues est d'une importance capitale.Bien que la plupart de ces bogues soient situés dans les passes d'optimisation, la désactivation des optimisations n'est pas une solution viable dans de nombreuses applications. En fait, la simple désactivation des optimisations ne suffit pas à garantir un code exempt de bogues. Les normes imposent en général l'utilisation de processeurs simples et prédictibles, dont la performance dépend du compilateur.Une solution alternative est d'employer un compilateur certifié, prouvé dans un assistant de preuve. Un tel compilateur assure que le code généré préserve la sémantique du code source. CompCert appartient à cette catégorie, et est le premier compilateur C vérifié et utilisé dans l'industrie. Cependant, prouver la correction d'optimisations complexes reste un défi. C'est pourquoi les compilateurs certifiés, y compris CompCert, produisent un code moins performant que les compilateurs classiques tels que GCC ou LLVM.La validation de traduction est une technique où seul le résultat d'une optimisation est vérifié, plutôt que de prouver la correction de son implémentation. L'algorithme d'optimisation, appelé oracle, reste considéré non-fiable. Néanmoins, ses résultats sont toujours soumis à la validation par un validateur prouvé et conçu pour rejeter toute erreur.Dans cette thèse, nous approfondissons le concept de validation de traduction guidée et défensive. Le principe est de permettre aux oracles de guider le validateur en lui fournissant des indices qui réduisent l'espace de recherche, minimisant ainsi la complexité du processus de validation. Plus précisément, nous proposons un interpréteur symbolique vérifié capable de valider toute une classe de transformations. Notre outil demande aux oracles des invariants de programme en tant qu'indices pour guider la simulation symbolique du code original et du code optimisé. Le test de simulation prouvé valide défensivement les optimisations appliquées, en garantissant leur cohérence vis-à-vis du code non optimisé.Nous avons validé plusieurs nouvelles transformations en utilisant cette approche, dont certaines n'avaient jamais été formellement vérifiées. Notamment, nous avons vérifié une optimisation de "strength-reduction" ciblant les architectures RISC-V 64 bits, qui sont prometteuses dans le contexte des systèmes critiques. En plus de la "strength-reduction", notre outil supporte l'élimination de redondances, l'élimination du code mort, le déplacement de code, l'ordonnancement, et une forme pipeline logiciel.Nous avons intégré notre mécanisme dans notre version de CompCert, en développant une nouvelle représentation intermédiaire nommée "Block Transfer Language", BTL. Les traductions de et vers BTL sont également validées de manière défensive, à l'aide d'un vérificateur dédié, vérifié, et capable de valider de la duplication et factorisation de code en tant que morphismes des graphes de flux de contrôle. Pour évaluer l'impact de nos optimisations et le temps de compilation supplémentaire induit par leur validation, nous avons effectué de multiples mesures expérimentales du temps de compilation et des performances à l'exécution. Les optimisations spécifiques à une architecture ont été testées sur AArch64 et RISC-V. Les résultats montrent une amélioration des performances à l'exécution tout en maintenant un temps de compilation raisonnable.À l'avenir, cette même méthode pourrait être appliquée pour valider d'autres transformations, comme l'insertion automatique de contre-mesures de sécurité.