Categories: Articoli

Come trovare bug nel codice

Uno dei problemi maggiori della programmazione sono i bug del codice. Per un programmatore esperto, evitarli e trovarli è più semplice ma cosa succede se siete alle prime armi o se state imparando un nuovo linguaggio? ChatGPT promette di risolvere questo problema una volta per tutte trovando gli errori in qualsiasi pezzo di codice, correggendoli e spiegandovi cosa non funziona. Beh, non male! Va precisato che ben prima di ChatGPT esistevano piattaforme simili ma per nostra esperienza lasciavano abbastanza a desiderare. Vediamo allora come si comporta ChatGPT.

Abbiamo creato un semplice script in JavaScript:

function createUser(username){

const user_id = False;

if(usrname.length > 10){

user_id = “user_”+username;

} else if(usrname.length < 10){

username_padded = String(username).

padStart(10, ‘0’);

user_id = “user_”+username;

}

return user_id;

}

function handleUser(user_number){

if(user_number < 100){

console.log(“Questo è un errore, si accettano solo

numeri utente maggiori o uguali a 100″);

}

user_id = createUser(user_number);

//Successo! Possiamo restituire l’ID dell’utente

return user_id;

}

 

Lo script fa queste cose:

A. handleUser deve prendere un numero utente e assicurarsi che sia maggiore o uguale a 100. Se lo è, delega a createUser la creazione di uno username;

B. createUser deve creare uno username testuale composto da una stringa e da un numero di più di 10 cifre;

C. Se il numero fornito ha meno di 10 cifre, deve aggiungere degli 0 fino a renderlo a 10 cifre.

 

Abbiamo volutamente inserito cinque errori di diverso tipo e gravità:

  1. Alla riga 4 abbiamo scritto usrname invece di username;
  2. Alla riga 9 abbiamo usato la variabile username invece di username_padded;
  3. Sempre alla riga 9 abbiamo fatto un’operazione ridondante: siccome in entrambi i casi lo username vuole “user_” come prefisso, avremmo dovuto lasciare questa istruzione fuori dall’if;
  4. In handleUser, se lo user_number è minore di 100 segnaliamo l’errore ma non usciamo dalla funzione;
  5. Alla riga 3, False dovrebbe essere false;
  6. In createUser, user_number è un numero, come si evince dal nome della variabile e da handleUser ma alla riga 4 usiamo .length su un numero invece che su una stringa (dovrebbe essere x.toString().length );
  7. La variabile che createUser usa dovrebbe essere user_number e non username (per una pura questione di leggibilità);
  8. Alla riga 3, non possiamo usare una costante se poi vogliamo cambiarne il valore. Dovremmo invece usare let o var.

Abbiamo passato questo semplice frammento di codice a un programmatore gli abbiamo chiesto di scovare gli errori. L’unico vincolo era che non poteva eseguire il codice: doveva analizzarlo senza farne il deployment.

Fra analisi e comprensione del codice ci ha restituito il risultato della sua analisi dopo circa 20 minuti. Ha trovato tutti gli errori tranne i numeri 5 e 7.
Ecco invece cosa ci ha detto ChatGPT:

Nella funzione createUser, la variabile False deve essere false per assegnare un valore booleano alla variabile user_id. Nel blocco if della funzione createUser, usrname deve essere sostituito con username, che è il parametro della funzione. Nel blocco else if della funzione createUser, alla variabile username_padded viene assegnato un valore, ma non viene utilizzata. Invece, a user_id deve essere assegnato il valore “user_”+username_padded. Nella funzione handleUser, se il numero_utente è inferiore a 100, viene stampato un messaggio di errore, ma la funzione continua a essere eseguita e restituisce un valore non definito. La funzione deve interrompere l’esecuzione dopo la stampa del messaggio di errore. Nella funzione createUser, se la lunghezza del nome utente è esattamente 10, la funzione non assegna alcun valore alla variabile user_id, restituendo un valore non definito.

 

Anzitutto c’è un dato molto importante: ChatGPT ha trovato un errore che ci era sfuggito ed è di tipo logico! Nel cambiare un pezzo di codice ci siamo dimenticati di aggiornare la condizione sulla lunghezza del numero: questo è un errore che il programmatore umano si è perso e che avrebbe creato enormi problemi in fase di deployment perché il codice avrebbe funzionato comunque ma dando risultati incompleti. In compenso non ha notato l’errore 6, che “rompe” lo script e non lo fa funzionare. Inoltre, come il programmatore umano, non ha notato l’errore 7 di leggibilità. Dobbiamo dire però che siamo rimasti decisamente soddisfatti: in pochi secondi ha fatto un lavoro analogo a quello di un essere umano ma trovando un errore logico molto fastidioso.

 

ChatGPT rimane l’opzione migliore

Per capire se possiamo ottenere un risultato migliore abbiamo provato a far analizzare il codice a CodePal e… non è andata benissimo. Ha trovato infatti meno bug di ChatGPT (per esempio non ha notato il fondamentale errore di battitura “usrname”) e in compenso ha restituito questo possibile errore:

Il sesto possibile bug della funzione handleUser è che non gestisce il caso in cui user_number sia esattamente 100. Per risolvere questo problema è necessario modificare il confronto con user_number <= 100. Per risolvere questo problema, è necessario modificare il confronto in user_number <= 100.

 

Questa correzione però è assolutamente fuori posto: nel codice intendevamo proprio usare 100 come soglia e non c’è motivo per dirci che si tratta di un errore. Certo, possiamo tranquillamente ignorare questo contributo però non ci saremmo aspettati questo tipo di problema. In compenso ci ha segnalato una modifica intelligente:

La funzione handleUser non gestisce gli errori in modo semplice per l’utente. Invece di registrare un messaggio di errore nella console, possiamo lanciare un errore con un messaggio di facile comprensione.

function handleUser(user_number){

if (user_number < 100){

throw new Error(“Il numero utente deve essere

maggiore o uguale a 100″);

}

const user_id = createUser(user_number);

return

 

Il nostro verdetto

Partiamo da un presupposto importante: ChatGPT, come anche piattaforme come CodePal, è molto utile per la revisione del codice in cerca di bug. Il modo in cui descrive i problemi aiuta moltissimo chi magari non è molto familiare con il linguaggio usato per programmare, anzitutto. Inoltre trova errori che avremmo pensato difficili da scovare. Al netto di tempo impiegato e documentazione prodotta sicuramente il suo valore è simile a quello del lavoro fatto da un essere umano ma… sì, c’è un ma. Se non trova errori evidenti, non può essere un sostituto per il lavoro umano, che nel nostro test non ha trovato un brutto errore ma che, va detto, non ha operato in un contesto lavorativo/professionale. Per non parlare di CodePal che ha fatto peggio, soprattutto se consideriamo che abbiamo sottoposto alle IA un paio di funzioni da qualche decina di righe di codice in totale. In uno scenario “reale” avremmo bisogno di analizzare migliaia di righe di codice sparse in numerose librerie. Il verdetto è semplice: strumento utilissimo, sì, ma non ancora in grado di rimpiazzare il professionista umano.


Hai trovato questo articolo interessante? Seguici su Facebook , Twitter, Mastodon

hj_backdoor

Share
Published by
hj_backdoor

Recent Posts

Malware per il mobile banking in crescita

Secondo Kaspersky negli ultimi 12  mesi si è registrato un aumento significativo di malware per…

2 giorni ago

L’aspiratutto del Web!

Preleva i video da YouTube, Soundcloud, Vimeo, Dailymotion… e ne estrae l’audio. Ecco come fare

4 giorni ago

Blink presenta una videocamera compatta per uso interno ed esterno

La nuova Blink Mini 2 è dotata di notifiche intelligenti abilitate alla visione computerizzata, tra…

6 giorni ago

CrowdStrike presenta una nuova ed evoluta soluzione di threat hunting per Microsoft Azure

Durante la RSA Conference 2024, evento di rilievo nel settore della sicurezza informatica, CrowdStrike ha…

1 settimana ago

Remote control e WinRAR sotto attacco

L’ultima ricerca di Kaspersky ha rivelato che gli attori delle Advanced Persistent Threat (APT) stanno…

1 settimana ago

Tracciamo l’attività al PC

Con ActivityWatch possiamo tenere sotto controllo il tempo passato con le varie attività al nostro…

1 settimana ago

Abbonati ad Hackerjournal per un anno a 33,90 € con digitale in omaggio anziché 46,90 €!

CLICCA QUI PER ABBONARTI!