L'azienda Intel ha rilasciato le sue scoperte legate al progetto di ricerca ControlFlag, volto a creare un sistema di apprendimento automatico per migliorare la qualità del codice. Gli strumenti sviluppati nel progetto consentono di individuare vari errori e anomalie nei testi sorgente, scritti in linguaggi di alto livello come C/C++, basandosi su un modello addestrato su un ampio volume di codice esistente. Il sistema è adatto per identificare diversi tipi di problemi nel codice, dalla rilevazione di errori di battitura e combinazioni di tipi errati, 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 è open source con licenza MIT.
Il sistema si auto-addestra costruendo un modello statistico del codice disponibile da progetti open source pubblicati su GitHub e in repository pubblici simili. Durante la fase di addestramento, il sistema identifica schemi tipici nella costruzione delle strutture di codice e crea un albero sintattico delle relazioni tra questi schemi, riflettendo il flusso di esecuzione del codice nel programma. Alla fine, si forma un albero di decisione di riferimento che unisce l'esperienza di sviluppo di tutti i testi sorgente analizzati.
Per il codice oggetto di verifica viene eseguito un processo simile di identificazione degli schemi, che vengono confrontati con l'albero di decisione di riferimento. Grandi discrepanze con i rami vicini indicano la presenza di un'anomalia nello schema verificato. Il sistema consente anche non solo di identificare un errore nello schema, ma anche di suggerire una correzione. Ad esempio, nel codice di OpenSSL è stata rilevata la costruzione «(s1 == NULL) ∧ (s2 == NULL)», che si trovava nell'albero sintattico solo 8 volte, mentre la ramificazione più vicina con il valore «(s1 == NULL) || (s2 == NULL)» appariva circa 7.000 volte. Il sistema ha anche rilevato l'anomalia «(s1 == NULL) | (s2 == NULL)», che era presente nell'albero 32 volte.

Analizzando il frammento di codice «if (x = 7) y = x;», il sistema ha determinato che di solito nell'operatore «if» si utilizza la costruzione «variabile == numero» per confrontare valori numerici, quindi è molto probabile che la specifica «variabile = numero» nell'espressione «if» sia stata causata da un errore di battitura. Tale errore sarebbe stato individuato anche dai tradizionali analizzatori statici, ma a differenza di questi, ControlFlag non applica regole predefinite in cui è difficile prevedere tutte le possibili varianti, ma si basa sulle statistiche di utilizzo delle varie costruzioni in un gran numero di progetti.
Come esperimento, mediante ControlFlag, è stato identificato un errore non rilevato dagli analizzatori statici nei testi sorgente dell'utility cURL, spesso citata come esempio di codice di qualità e collaudato, durante l'uso dell'elemento di struttura «s->keepon», che aveva un tipo numerico, ma veniva confrontato con un valore booleano TRUE. Nel codice OpenSSL, oltre al problema già citato con «(s1 == NULL) ∧ (s2 == NULL)», sono state individuate anomalie nelle espressioni «(-2 == rv)» (il meno era un errore di battitura) e «BIO_puts(bp, «:»)»
Fonte: opennet.ru
