Fondations sémantiques et implémentation d'un atelier logiciel pour l'analyse statique de programmes en code objet Java
| Auteur / Autrice : | Laurent Hubert |
| Direction : | Thomas Jensen |
| Type : | Thèse de doctorat |
| Discipline(s) : | Informatique |
| Date : | Soutenance en 2010 |
| Etablissement(s) : | Rennes 1 |
| Ecole(s) doctorale(s) : | École doctorale Mathématiques, télécommunications, informatique, signal, systèmes, électronique (Rennes) |
| Partenaire(s) de recherche : | Autre partenaire : Université européenne de Bretagne (2007-2016) |
Résumé
Dans cette thèse, nous nous intéressons à l’analyse statique du bytecode Java. L’initialisation d’un système d’information est une phase délicate où des propriétés de sécurité sont vérifiées et des invariants installés. L’initialisation en Java pose des difficultés, que ce soit pour les champs, les objets ou les classes. De ces difficultés peuvent résulter des failles de sécurité, des erreurs d’exécution (bugs), ou une plus grande difficulté à valider statiquement ces logiciels. Cette thèse propose des analyses statiques répondant aux problèmes d’initialisation de champs, d’objets et de classes. Ainsi, nous décrivons une analyse de pointeurs nuls qui suit finement l’initialisation des champs et permet de prouver l’absence d’exception de pointeur nuls (NullPointerException) et de raffiner le graphe de flot de contrôle intra-procédural. Nous proposons aussi une analyse pour raffiner le graphe de flot de contrôle inter-procédural liée à l’initialisation de classe et permettant de modéliser plus finement le contenu des champs statiques. Enfin, nous proposons un système de type permettant de garantir que les objets manipulés sont complètement initialisés, et offrant ainsi une solution formelle et automatique à un problème de sécurité connu. Les fondations sémantiques de ces analyses sont données. Les analyses sont décrites formellement et prouvées correctes. Pour pouvoir adapter ces analyses, formalisées sur de petits langages, au bytecode, nous avons développé une bibliothèque logicielle. Elle nous a permis de produire des prototypes efficaces gérant l’intégralité du bytecode Java.