Voir le résumé
Les systèmes informatiques jouent un rôle central dans les sociétés contemporaines, se développant et s'adaptant continuellement pour répondre aux nouvelles exigences et pratiques. Au fil des ans, grâce à des efforts de développement importants et à de nombreuses mises à jour du code, ces systèmes peuvent accumuler des millions de lignes de code. En outre, ils présentent des caractéristiques de complexité, de configurabilité et de multilinguisme, et s'appuient sur des pipelines de construction vastes et complexes pour cibler de multiples plateformes et matériels. Ce qui nécessite des analyses de code approfondies pour maintenir le code, contrôler la qualité et détecter les erreurs. L'analyse automatisée du code est un processus coûteux en ressources, principalement conçu pour examiner une seule version d'un logiciel. Actuellement, les méthodes d'analyse de code existantes peinent à évaluer efficacement plusieurs versions de logiciels au cours d'une seule analyse, ce qui prend beaucoup de temps. Ce type d'analyse de code, qui examine le code d'un logiciel à plusieurs moments de son existence, est appelé "analyse de code temporel". Les analyses temporelles de code ouvrent de nouvelles perspectives pour l'amélioration de la qualité et de la fiabilité des logiciels. Par exemple, de telles analyses permettraient d'étudier pleinement la façon dont le code et ses tests évoluent conjointement dans l'historique du code. Pour surmonter les différents défis qui empêchent de telles analyses de fonctionner à grande échelle, cette thèse apporte les contributions suivantes. Cette thèse démontre d'abord la faisabilité de l'analyse des changements de code source pour identifier les relations de causalité entre les changements (c'est-à-dire les co-évolutions). La deuxième contribution porte sur l'efficacité du calcul des modifications fines et de leurs impacts à partir de l'historique des codes. Pour ce faire, il a fallu revoir la manière dont les historiques des codes sources sont représentés et traités, en tirant parti de la nature structurée du code et de sa stabilité dans le temps. Cela a conduit à une approche, appelée HyperAST, qui calcule de manière incrémentale les dépendances référentielles. La troisième contribution est une nouvelle technique de différenciation structuré de code pour différencier les commits. Cette dernière contribution, appelée HyperDiff, complète HyperAST pour comparer les commits à grande échelle.