Simple Science

Scienza all'avanguardia spiegata semplicemente

# Informatica# Ingegneria del software

Progressi nella riparazione automatizzata dei programmi usando modelli linguistici

Un approccio innovativo per risolvere i bug nei software usando i modelli di linguaggio per la selezione del codice donatore.

― 8 leggere min


Correzione dei bugCorrezione dei bugguidata dall'IAlinguaggio avanzati.errori software con modelli diRivoluzionare la riparazione degli
Indice

La riparazione automatizzata dei programmi (APR) è un processo che aiuta a sistemare i bug del software senza bisogno dell'assistenza umana. Questo metodo sta diventando sempre più importante man mano che i sistemi software crescono e aumentano i bug. Trovare e risolvere manualmente i bug è una perdita di tempo e costoso per gli sviluppatori. Gli strumenti APR possono aiutare generando automaticamente patch per correggere questi bug. Un approccio specifico all'APR è l'APR basato su template, che utilizza modelli predefiniti o pattern che descrivono come risolvere errori comuni nel codice.

Anche se l'APR basato su template ha mostrato buoni risultati, affronta delle sfide, in particolare nella scelta del giusto codice donatore da usare per fare le riparazioni. Il codice donatore si riferisce ai pezzi di codice che aiutano a creare la patch. Se viene scelto il codice donatore sbagliato, anche i migliori template possono fallire nel produrre una correzione corretta. Questa limitazione è un grande problema per l'efficacia degli strumenti APR basati su template.

In questo lavoro, diamo una nuova occhiata all'APR basato su template e proponiamo un metodo che utilizza grandi modelli di linguaggio pre-addestrati per generare direttamente il codice donatore necessario. L'idea è prevedere i token di codice corretti invece di cercarli nei file buggy locali. Usando un approccio di riempimento, possiamo creare patch che hanno maggiori probabilità di essere corrette.

Contesto e Motivazione

Man mano che il software diventa più complesso, il numero di bug è aumentato notevolmente. Questi bug possono frustrate gli utenti e comportare perdite finanziarie per gli sviluppatori. Di conseguenza, trovare e sistemare i bug è diventato una priorità per i team di sviluppo software. L'APR mira a snellire questo processo generando automaticamente patch.

Ci sono varie tecniche per l'APR, comprese quelle basate su euristiche, vincoli e template. L'APR basato su template ha attirato l'attenzione per la sua capacità di dividere il processo di correzione dei bug in due parti principali: identificare il pattern della correzione e scegliere il corretto codice donatore. I pattern di correzione rappresentano azioni di codifica comuni, mentre il codice donatore è composto da frammenti di codice che si allineano con quelle azioni.

Nonostante la promessa dell'APR basato su template, di solito si basa sulla localizzazione del codice donatore all'interno del file di codice locale. È qui che spesso sorgono problemi. Molti bug rimangono non risolti perché il codice donatore pertinente non è disponibile nello stesso file. Quando non si riesce a trovare il codice donatore giusto, lo strumento APR può generare patch che sembrano buone, ma non sono corrette. Questo porta a prestazioni scadenti e all'incapacità di riparare numerosi bug.

Per affrontare questa limitazione, proponiamo un nuovo strumento che sfrutta i recenti progressi nei modelli di linguaggio. Sfruttando questi potenti modelli, possiamo prevedere il corretto codice donatore necessario per correggere i bug, migliorando così le prestazioni complessive dell'APR basato su template.

Panoramica del Metodo

Il nostro strumento APR proposto funziona in diverse fasi. Prima di tutto, raccogliamo un insieme di pattern di correzione da ricerche precedenti e li trasformiamo in pattern che possono essere riempiti, il che significa che sostituiamo alcune parti del codice con token mascherati. Poi, utilizziamo un Modello di Linguaggio pre-addestrato per prevedere il codice necessario per queste sezioni mascherate come se fosse un compito di riempimento. Questo approccio ci permette di generare patch senza bisogno di esempi precedenti di bug risolti per l'addestramento.

Abbiamo scelto di implementare il nostro metodo usando il modello UniXcoder. Questo modello ha dimostrato di funzionare bene nel prevedere i token di codice in base al contesto. Il nostro strumento ha riparato con successo 82 bug nel dataset Defects4J-v1.2, mostrando prestazioni migliorate rispetto ai precedenti metodi APR basati su template.

Pattern di Correzione e Codice Donatore

I pattern di correzione sono componenti essenziali del nostro approccio. Un pattern di correzione è una regola che descrive come cambiare il codice per correggere un bug. Poiché molti bug sono simili, i pattern di correzione possono essere riutilizzati in diversi scenari. Classifichiamo diversi pattern comuni e li definiamo in modo da permettere di mascherare parti del codice che necessitano di modifiche.

Il secondo componente chiave è il codice donatore. Questo si riferisce ai frammenti di codice che sostituiranno i token mascherati nei nostri pattern. Per trovare codice donatore adatto, utilizziamo un modello di linguaggio pre-addestrato, che ha già imparato da una vasta quantità di dati di programmazione. Invece di cercare di trovare frammenti di codice localmente, possiamo prevedere direttamente il codice richiesto in base al contesto.

Processo dello Strumento APR

  1. Localizzazione del Difetto: Il primo passo implica identificare dove si trova il bug nel codice. Questo di solito viene fatto usando strumenti esistenti che possono evidenziare aree sospette nel codice.

  2. Selezione del Pattern: In base alle aree identificate, scegliamo i pattern di correzione appropriati. Analizziamo la struttura del codice per abbinare i pattern ai tipi specifici di problemi trovati.

  3. Previsione del Mascheramento: Successivamente, creiamo template con token mascherati dai pattern selezionati. Poi utilizziamo il modello di linguaggio per riempire questi mascheramenti con il codice corretto.

  4. Validazione della Patch: Dopo aver generato le patch, le testiamo contro suite di test esistenti per assicurarci che non presentino nuovi errori e correggano efficacemente i problemi originali.

  5. Ispezione Manuale: Infine, le patch plausibili vengono esaminati manualmente per confermare che soddisfino le aspettative degli sviluppatori in merito alla correttezza.

Impostazione Sperimentale

Per valutare le prestazioni del nostro strumento, abbiamo usato il benchmark Defects4J-v1.2, che contiene diversi bug reali ed è ampiamente utilizzato nella ricerca APR. Questo dataset include bug noti con casi di test corrispondenti, permettendoci di valutare quanto bene lo strumento può risolverli.

Abbiamo confrontato il nostro strumento con vari strumenti APR tradizionali e basati sull'apprendimento, inclusi metodi basati su template e metodi recenti di apprendimento. L'obiettivo era determinare non solo il numero di bug risolti, ma anche la qualità di quelle correzioni.

Metriche di Valutazione

Abbiamo utilizzato due metriche principali per valutare le prestazioni:

  • Patch Plausibile: Questa metrica indica se la patch risolve il bug senza danneggiare altre funzionalità.
  • Patch Corretta: Questa misura se la patch generata è semanticamente equivalente a una correzione che un sviluppatore avrebbe creato.

Risultati e Discussione

Dopo aver condotto ampi esperimenti, il nostro strumento ha dimostrato miglioramenti significativi rispetto agli approcci esistenti. Siamo stati in grado di risolvere 82 bug nel dataset Defects4J-v1.2. Questo numero è notevolmente più alto dei risultati riportati da altri strumenti, indicando un notevole miglioramento nelle prestazioni di riparazione.

Confronto con Tecniche Esistenti

Quando abbiamo confrontato il nostro strumento con metodi tradizionali come TBar e tecniche basate sull'apprendimento come Recoder, abbiamo scoperto che il nostro approccio non solo ha risolto più bug, ma ha anche raggiunto un miglior tasso di patch corrette. Questo mostra il potenziale del nostro metodo per affrontare le limitazioni affrontate dalle attuali tecniche APR.

Generalizzabilità

Abbiamo anche valutato il nostro strumento su dataset aggiuntivi, includendo Defects4J-v2.0 e QuixBugs. Questo era importante per testare quanto bene il nostro approccio possa adattarsi a vari tipi di bug. I risultati hanno mostrato che il nostro strumento è riuscito ancora a generare un numero elevato di patch corrette, confermando ulteriormente la sua efficacia in scenari reali.

Scalabilità

Inoltre, abbiamo esplorato la scalabilità del nostro metodo applicando diversi modelli pre-addestrati, come CodeBERT e ChatGPT, al nostro compito. I risultati hanno indicato che, mentre tutti i modelli hanno funzionato bene, la nostra implementazione iniziale utilizzando UniXcoder ha costantemente superato gli altri. Questo sottolinea l'importanza della selezione del modello nel raggiungere i migliori risultati nella riparazione dei programmi.

Sfide e Limitazioni

Nonostante il successo del nostro strumento, alcune sfide rimangono. La dipendenza dai modelli pre-addestrati significa che se il modello sottostante non comprende bene una particolare struttura di codice, la previsione potrebbe fallire. Inoltre, la qualità e la diversità dei pattern di correzione giocano un ruolo critico nel determinare quanti bug possono essere riparati con successo.

È anche degno di nota che, sebbene il nostro metodo mostri promesse, potrebbe comunque trascurare alcuni bug che richiedono un approccio più specializzato o pattern di correzione diversi non coperti nei template esistenti.

Lavoro Futuro

In futuro, puntiamo ad ampliare la nostra libreria di pattern di correzione per coprire una gamma più ampia di bug. La ricerca di nuovi pattern aiuterà ad aumentare la capacità del nostro strumento di affrontare problemi più complessi che sorgono nello sviluppo software. Esplorare modelli pre-addestrati più avanzati e ottimizzarli per specifici tipi di bug potrebbe anche dare risultati migliori.

Pianifichiamo anche di indagare come implementare tecniche automatizzate di localizzazione dei difetti all'interno del nostro flusso di lavoro. Questo migliorerà l'usabilità dello strumento in ambienti reali dove gli sviluppatori potrebbero non avere informazioni perfette sulla posizione dei bug.

Conclusione

La riparazione automatizzata dei programmi rappresenta un'opportunità entusiasmante per migliorare le pratiche di sviluppo software riducendo il tempo e lo sforzo necessari per risolvere i bug. Il nostro strumento proposto si trova all'avanguardia di questo campo integrando potenti modelli di linguaggio con approcci basati su template, migliorando così la capacità di generare patch corrette. Con questo strumento, possiamo avvicinarci a un futuro in cui i bug del software possono essere affrontati in modo più efficiente, lasciando gli sviluppatori liberi di concentrarsi sulla creazione di nuove funzionalità e sul miglioramento delle esperienze utente.

Fonte originale

Titolo: GAMMA: Revisiting Template-based Automated Program Repair via Mask Prediction

Estratto: 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.

Autori: Quanjun Zhang, Chunrong Fang, Tongke Zhang, Bowen Yu, Weisong Sun, Zhenyu Chen

Ultimo aggiornamento: 2023-09-17 00:00:00

Lingua: English

URL di origine: https://arxiv.org/abs/2309.09308

Fonte PDF: https://arxiv.org/pdf/2309.09308

Licenza: https://creativecommons.org/licenses/by/4.0/

Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.

Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.

Altro dagli autori

Articoli simili