Avancées dans la réparation automatique de programmes avec des modèles de langage
Une nouvelle méthode pour corriger les bugs logiciels en utilisant des modèles de langage pour sélectionner le code source.
― 10 min lire
Table des matières
La réparation automatique de programmes (APR) est un processus qui aide à corriger les bugs logiciels sans avoir besoin d'aide humaine. Cette méthode devient de plus en plus importante à mesure que les systèmes logiciels grandissent et que les bugs s'accumulent. Trouver et corriger les bugs manuellement prend beaucoup de temps et coûte cher aux développeurs. Les outils APR peuvent aider en générant automatiquement des correctifs pour corriger ces bugs. Une approche spécifique de l'APR est l'APR basée sur des templates, qui utilise des modèles prédéfinis décrivant comment corriger des erreurs de code courantes.
Bien que l'APR basée sur des templates ait montré de bons résultats, elle fait face à des défis, notamment en ce qui concerne le choix du bon code donneur à utiliser lors des réparations. Le code donneur fait référence aux morceaux de code qui aident à créer le patch. Si le mauvais code donneur est choisi, même les meilleurs templates peuvent échouer à produire une correction correcte. Cette limitation est un gros problème pour l’efficacité des outils APR basés sur des templates.
Dans ce travail, nous réexaminons l'APR basée sur des templates et proposons une méthode qui utilise de grands modèles de langage pré-entraînés pour générer directement le code donneur nécessaire. L'idée est de prédire les bons tokens de code au lieu de les rechercher dans les fichiers buggués locaux. En utilisant une approche de type "remplir le vide", nous pouvons créer des patches qui ont plus de chances d'être corrects.
Contexte et Motivation
À mesure que les logiciels deviennent plus complexes, le nombre de bugs a augmenté de façon spectaculaire. Ces bugs peuvent frustrer les utilisateurs et entraîner des pertes financières pour les développeurs. En conséquence, trouver et corriger les bugs est devenu une priorité pour les équipes de développement logiciel. L'APR vise à rationaliser ce processus en générant automatiquement des patches.
Il existe diverses techniques pour l'APR, y compris celles basées sur des heuristiques, sur des contraintes et sur des templates. L'APR basée sur des templates a gagné en attention grâce à sa capacité à diviser le processus de correction de bugs en deux parties principales : identifier le modèle de la correction et choisir le bon code donneur. Les modèles de correction représentent des actions de codage courantes, tandis que le code donneur se compose de fragments de code qui s'alignent avec ces actions.
Malgré la promesse de l'APR basée sur des templates, elle repose généralement sur la localisation du code donneur dans le fichier code local. C'est là que les problèmes se posent souvent. De nombreux bugs restent non corrigés car le code donneur pertinent n'est pas disponible dans le même fichier. Lorsque le bon code donneur ne peut pas être trouvé, l'outil APR peut générer des patches qui semblent bons mais ne sont pas corrects. Cela entraîne une performance médiocre et une incapacité à réparer de nombreux bugs.
Pour remédier à cette limitation, nous proposons un nouvel outil qui tire parti des récentes avancées en matière de modèles de langage. En s'appuyant sur ces modèles puissants, nous pouvons prédire le code donneur correct nécessaire pour corriger les bugs, améliorant ainsi la performance globale de l'APR basée sur des templates.
Aperçu de la Méthode
Notre outil APR proposé fonctionne en plusieurs étapes. Tout d'abord, nous rassemblons un ensemble de modèles de correction issus de recherches antérieures et les transformons en modèles pouvant être remplis, ce qui signifie que nous remplaçons certaines parties du code par des tokens masqués. Ensuite, nous utilisons un modèle de langage pré-entraîné pour prédire le code nécessaire pour ces sections masquées, comme s'il s'agissait d'une tâche de remplissage. Cette approche nous permet de générer des patches sans besoin d'exemples antérieurs de bugs corrigés pour l'entraînement.
Nous avons choisi de mettre en œuvre notre méthode en utilisant le modèle UniXcoder. Ce modèle a montré de bonnes performances pour prédire des tokens de code en fonction du contexte. Notre outil a réussi à réparer 82 bugs dans le dataset Defects4J-v1.2, montrant une amélioration de la performance par rapport aux méthodes APR basées sur des templates précédentes.
Modèles de Correction et Code Donneur
Les modèles de correction sont des composants essentiels de notre approche. Un modèle de correction est une règle qui décrit comment changer le code pour corriger un bug. Étant donné que de nombreux bugs sont similaires, les modèles de correction peuvent être réutilisés dans différents scénarios. Nous catégorisons plusieurs modèles courants et les définissons de manière à pouvoir masquer les parties du code nécessitant un changement.
Le deuxième composant clé est le code donneur. Cela fait référence aux extraits de code réels qui remplaceront les tokens masqués dans nos modèles. Pour trouver un code donneur approprié, nous utilisons un modèle de langage pré-entraîné, qui a déjà appris à partir d'une grande quantité de données de programmation. Au lieu de chercher des extraits de code localement, nous pouvons directement prédire le code nécessaire en fonction du contexte.
Processus de l'Outil APR
Localisation des Erreurs : La première étape consiste à identifier où se trouve le bug dans le code. Cela se fait généralement à l'aide d'outils existants capables de mettre en lumière les zones suspectes dans le code.
Sélection de Modèles : En fonction des zones identifiées, nous choisissons des modèles de correction appropriés. Nous analysons la structure du code pour faire correspondre les modèles aux types de problèmes rencontrés.
Prédiction de Masques : Ensuite, nous créons des modèles avec des tokens masqués à partir des modèles sélectionnés. Nous utilisons alors le modèle de langage pour remplir ces masques avec le code correct.
Validation des Patches : Après avoir généré les patches, nous les testons par rapport à des suites de tests existantes pour nous assurer qu'ils n'introduisent pas de nouvelles erreurs et corrigent efficacement les problèmes d'origine.
Inspection Manuelle : Enfin, les patches plausibles sont examinés manuellement pour confirmer qu'ils correspondent aux attentes des développeurs en matière de correction.
Configuration Expérimentale
Pour évaluer la performance de notre outil, nous avons utilisé la référence Defects4J-v1.2, qui contient plusieurs bugs du monde réel et est largement utilisée dans la recherche APR. Ce dataset comprend des bugs connus avec des cas de test correspondants, ce qui nous permet d'évaluer dans quelle mesure l'outil peut les corriger.
Nous avons comparé notre outil à divers outils APR basés sur des méthodes traditionnelles et d'apprentissage, y compris des méthodes basées sur des templates et des méthodes d'apprentissage récentes. L'objectif était de déterminer non seulement le nombre de bugs corrigés mais aussi la qualité de ces corrections.
Mesures d'Évaluation
Nous avons utilisé deux mesures principales pour évaluer la performance :
- Patch Plausible : Cette mesure indique si le patch corrige le bug sans nuire à d'autres fonctionnalités.
- Patch Correct : Cela mesure si le patch généré est sémantiquement équivalent à une correction qu'un développeur aurait réalisée.
Résultats et Discussion
Après avoir mené des expériences approfondies, notre outil a montré des améliorations significatives par rapport aux approches existantes. Nous avons pu corriger 82 bugs dans le dataset Defects4J-v1.2. Ce chiffre est nettement plus élevé que les résultats rapportés par d'autres outils, indiquant une avancée substantielle dans la performance de réparation.
Comparaison avec les Techniques Existantes
Lorsque nous avons comparé notre outil avec des méthodes traditionnelles comme TBar et des techniques basées sur l'apprentissage comme Recoder, nous avons constaté que notre approche non seulement corrigeait plus de bugs, mais atteignait également un meilleur taux de patches corrects. Cela montre le potentiel de notre méthode à surmonter les limitations rencontrées par les techniques APR actuelles.
Généralisation
Nous avons également évalué notre outil sur des datasets supplémentaires, y compris Defects4J-v2.0 et QuixBugs. Cela était important pour tester à quel point notre approche peut s'adapter à différents types de bugs. Les résultats ont montré que notre outil pouvait toujours générer un grand nombre de patches corrects, confirmant encore son efficacité dans des scénarios réels.
Scalabilité
De plus, nous avons exploré la scalabilité de notre méthode en appliquant différents modèles pré-entraînés, comme CodeBERT et ChatGPT, à notre tâche. Les résultats ont indiqué que, bien que tous les modèles aient bien performé, notre mise en œuvre initiale utilisant UniXcoder a systématiquement surpassé les autres. Cela met en évidence l'importance du choix du modèle pour obtenir les meilleurs résultats en matière de réparation de programmes.
Défis et Limitations
Malgré le succès de notre outil, certains défis demeurent. La dépendance aux modèles pré-entraînés signifie que si le modèle sous-jacent ne comprend pas bien une structure de code particulière, la prédiction pourrait échouer. De plus, la qualité et la diversité des modèles de correction jouent un rôle critique dans la détermination du nombre de bugs pouvant être réparés avec succès.
Il est également à noter que, bien que notre méthode montre des promesses, elle peut encore passer à côté de certains bugs nécessitant une approche plus spécialisée ou des modèles de correction différents non couverts dans les templates existants.
Travail Futur
À l'avenir, nous visons à élargir notre bibliothèque de modèles de correction pour couvrir une plus grande variété de bugs. La recherche de nouveaux modèles aidera à accroître la capacité de notre outil à s'attaquer à des problèmes plus complexes qui surgissent dans le développement logiciel. Explorer des modèles pré-entraînés plus avancés et les affiner pour des types de bugs spécifiques pourrait également donner de meilleurs résultats.
Nous prévoyons aussi d'explorer comment implémenter des techniques de localisation des défauts automatisées dans notre flux de travail. Cela améliorera l'utilisabilité de l'outil dans des environnements réels où les développeurs peuvent ne pas avoir d'informations parfaites sur la localisation des bugs.
Conclusion
La réparation automatique de programmes représente une opportunité passionnante d'améliorer les pratiques de développement logiciel en minimisant le temps et l'effort nécessaires pour corriger les bugs. Notre outil proposé se positionne à l'avant-garde de ce domaine en intégrant des modèles de langage puissants avec des approches basées sur des templates, ce qui renforce la capacité à générer des patches corrects. Avec cet outil, nous pouvons nous rapprocher d'un avenir où les bugs logiciels peuvent être traités plus efficacement, laissant aux développeurs la liberté de se concentrer sur la création de nouvelles fonctionnalités et l'amélioration de l'expérience utilisateur.
Titre: GAMMA: Revisiting Template-based Automated Program Repair via Mask Prediction
Résumé: Automated program repair (APR) aims to fix software bugs without human intervention and template-based APR has been widely investigated with promising results. However, it is challenging for template-based APR to select the appropriate donor code, which is an important repair ingredient for generating candidate patches. Inappropriate donor code may cause plausible but incorrect patch generation even with correct fix patterns, limiting the repair performance. In this paper, we aim to revisit template-based APR, and propose GAMMA, to directly leverage large pre-trained language models for donor code generation. Our main insight is that instead of retrieving donor code in the local buggy file, we can directly predict the correct code tokens based on the context code snippets and repair patterns by a cloze task. Specifically, (1) GAMMA revises a variety of fix templates from state-of-the-art template-based APR techniques (i.e., TBar) and transforms them into mask patterns. (2) GAMMA adopts a pre-trained language model to predict the correct code for masked code as a fill-in-the-blank task. The experimental results demonstrate that GAMMA correctly repairs 82 bugs on Defects4J-v1.2, which achieves 20.59\% (14 bugs) and 26.15\% (17 bugs) improvement over the previous state-of-the-art template-based approach TBar and learning-based one Recoder. Furthermore, GAMMA repairs 45 bugs and 22 bugs from the additional Defects4J-v2.0 and QuixBugs, indicating the generalizability of GAMMA in addressing the dataset overfitting issue. We also prove that adopting other pre-trained language models can provide substantial advancement, e.g., CodeBERT-based and ChatGPT-based GAMMA is able to fix 80 and 67 bugs on Defects4J-v1.2, indicating the scalability of GAMMA. Overall, our study highlights the promising future of adopting pre-trained models to generate correct patches on top of fix patterns.
Auteurs: Quanjun Zhang, Chunrong Fang, Tongke Zhang, Bowen Yu, Weisong Sun, Zhenyu Chen
Dernière mise à jour: 2023-09-17 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2309.09308
Source PDF: https://arxiv.org/pdf/2309.09308
Licence: https://creativecommons.org/licenses/by/4.0/
Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.
Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.