Deductive verification of Rust programs
Auteur / Autrice : | Xavier Denis |
Direction : | Claude Marché, Jacques-Henri Jourdan |
Type : | Thèse de doctorat |
Discipline(s) : | Informatique |
Date : | Soutenance le 18/12/2023 |
Etablissement(s) : | université Paris-Saclay |
Ecole(s) doctorale(s) : | École doctorale Sciences et technologies de l'information et de la communication (Orsay, Essonne ; 2015-....) |
Partenaire(s) de recherche : | Référent : Faculté des sciences d'Orsay |
graduate school : Université Paris-Saclay. Graduate School Informatique et sciences du numérique (2020-….) | |
Laboratoire : Laboratoire Méthodes formelles (Gif-sur-Yvette, Essonne ; 2021-....) | |
Jury : | Président / Présidente : François Pottier |
Examinateurs / Examinatrices : Sylvain Boulmé, Peter Müller, Claire Dross, Ralf Jung, Mihaela Sighireanu | |
Rapporteur / Rapporteuse : Sylvain Boulmé, Peter Müller |
Mots clés
Mots clés contrôlés
Mots clés libres
Résumé
Rust est un langage de programmation introduit en 2015, qui apporte au programmeur des éléments de sûreté concernant l'utilisation de la mémoire. Le but de cette thèse est le développement d'un outil de vérification déductive pour le langage Rust, en exploitant les spécificités de son système de types afin notamment de simplifier la gestion de l'aliasing mémoire. Une telle approche de vérification permet de s'assurer de l'absence d'erreurs à l'exécution des programmes considérés, ainsi que leur conformité vis-a-vis d'une spécification formelle du comportement fonctionnel attendu. Le fondement théorique de l'approche proposé dans cette thèse est d'utiliser une notion de prophétie qui permet d'interpréter les emprunts mutables du langage Rust en une valeur courante et une valeur future cet emprunt. L'assistant de preuve Coq a été utilisé pour formaliser cet encodage prophétique et prouver la correction de la génération d'obligation de preuves associée. Par ailleurs l'approche a été mise en œuvre dans une implémentation d'un logiciel de vérification pour Rust qui automatise la génération des obligations de preuve et fait appel à des solveurs externes pour valider ces obligations. Afin de supporter les itérateurs de Rust, une extension a été développée pour manipuler les clôtures ainsi qu'une technique de vérification pour les itérateurs et combinateurs. L'implémentation a été évaluée expérimentalement sur des exemples d'algorithmes et structures de données pertinentes. Elle a été également validée par une étude de cas conséquente: la vérification d'un solveur de satisfiabilité modulo theories (SMT).