La compagnia Intel ha presentato risultati relativi al progetto di ricerca ControlFlag, mirato alla creazione di un sistema di apprendimento automatico per migliorare la qualità del codice. Gli strumenti forniti dal progetto permettono, sulla base di un modello addestrato su un vasto volume di codice esistente, di identificare vari errori e anomalie nei testi sorgente scritti in linguaggi di alto livello come C/C++. Il sistema è utile per rilevare diversi tipi di problemi nel codice, dall'identificazione di errori di battitura e combinazioni errate di tipi fino all'individuazione di controlli mancanti per valori NULL nei puntatori e problemi di gestione della memoria. Il codice di ControlFlag è scritto in C++ ed è disponibile con licenza MIT.
Il sistema si auto-addestra costruendo un modello statistico dell'insieme di codice dei progetti open source pubblicati su GitHub e in repository pubblici simili. Durante la fase di apprendimento, il sistema identifica modelli standard di strutturazione nel codice e costruisce un albero sintattico delle relazioni tra questi modelli, riflettendo il flusso di esecuzione del codice nel programma. Il risultato è un albero di decisione di riferimento che combina l'esperienza di sviluppo di tutti i testi sorgente analizzati.
Per il codice esaminato, viene eseguito un processo simile per l'identificazione dei modelli, che vengono confrontati con un albero di decisione di riferimento. Grandi discrepanze rispetto ai rami adiacenti indicano la presenza di un'anomalia nel modello esaminato. Il sistema permette non solo di rilevare un errore nel modello, ma anche di suggerire una correzione. Ad esempio, nel codice OpenSSL è stata rilevata la costruzione «(s1 == NULL) ∧ (s2 == NULL)», che appariva nell'albero sintattico solo 8 volte, mentre il ramo più vicino con il valore «(s1 == NULL) || (s2 == NULL)» appariva circa 7.000 volte. Il sistema ha anche identificato l'anomalia «(s1 == NULL) | (s2 == NULL)», che si presentava nell'albero 32 volte.

Analizzando il frammento di codice «if (x = 7) y = x;», il sistema ha stabilito che normalmente nell'operatore «if» per confrontare valori numerici si utilizza la costruzione «variabile == numero». Pertanto, con alta probabilità, l'indicazione «variabile = numero» nell'espressione «if» è dovuta a un errore di battitura. Un errore del genere sarebbe stato rilevato anche dai tradizionali analizzatori statici, ma a differenza di questi, ControlFlag non applica regole predefinite che difficilmente possono prevedere tutte le possibili varianti, ma si basa sulle statistiche di utilizzo di tutte le possibili costruzioni in un gran numero di progetti.
Come esperimento, utilizzando ControlFlag nei codici sorgente dell'utilità cURL, spesso citata come esempio di codice di qualità verificata, è stato scoperto un errore non rilevato dagli analizzatori statici nell'uso dell'elemento della struttura «s->keepon», che aveva un tipo numerico ma veniva confrontato con il valore booleano TRUE. Nel codice di OpenSSL, oltre al problema già menzionato con «(s1 == NULL) ∧ (s2 == NULL)», sono state riscontrate anomalie nelle espressioni «(-2 == rv)» (il meno era un errore di battitura) e «BIO_puts(bp, «:»)».
Fonte: opennet.ru
