La compagnia Intel ha pubblicato il primo significativo rilascio dello strumento ControlFlag 1.0, che consente di identificare errori e anomalie nei testi sorgente, utilizzando un sistema di apprendimento automatico addestrato su un ampio volume di codice esistente. A differenza degli analizzatori statici tradizionali, ControlFlag non applica regole predefinite, in cui è difficile prevedere tutte le possibili varianti, ma si basa sulle statistiche di utilizzo di varie costrutti linguistici in un numero elevato di progetti esistenti. Il codice di ControlFlag è scritto in C++ ed è aperto sotto licenza MIT.
Il sistema si allena creando un modello statistico del set di codice di progetti open source pubblicati su GitHub e in repository pubblici simili. Durante la fase di addestramento, il sistema rileva schemi tipici di costruzione delle strutture nel codice e costruisce un albero sintattico delle relazioni tra questi schemi, riflettendo il flusso di esecuzione del codice nel programma. Alla fine si forma un albero di riferimento per le decisioni, che unisce l'esperienza di sviluppo di tutti i testi sorgente analizzati. Per il codice da verificare viene eseguito un processo simile di identificazione degli schemi, confrontati con l'albero di riferimento per le decisioni. Grandi divergenze con rami adiacenti indicano la presenza di un'anomalia nello schema in analisi.

Come esempio delle potenzialità di ControlFlag, gli sviluppatori hanno condotto un'analisi dei testi sorgente dei progetti OpenSSL e cURL:
- In OpenSSL sono state rilevate costruzioni anomale «(s1 == NULL) ∧ (s2 == NULL)» e «(s1 == NULL) | (s2 == NULL)», che non corrispondono allo schema comunemente utilizzato «(s1 == NULL) || (s2 == NULL)». Nel codice sono state inoltre trovate anomalie nelle espressioni «(-2 == rv)» (il meno era un errore di battitura) e «BIO_puts(bp, «:») <= 0)» (nel contesto della verifica della corretta conclusione della funzione doveva esserci «== 0»).
- In cURL è stata identificata un'errore non notata dagli analizzatori statici durante l'uso dell'elemento della struttura «s->keepon», che aveva un tipo numerico, ma veniva confrontato con un valore booleano TRUE.
Tra le peculiarità della versione ControlFlag 1.0 si segnala il pieno supporto ai modelli predefiniti per il linguaggio C e la possibilità di identificare anomalie nelle espressioni condizionali "if". Ad esempio, analizzando il frammento di codice "if (x = 7) y = x;" il sistema riconoscerà che normalmente nell'operatore "if" per confrontare valori numerici si utilizza la costruzione "variabile == numero", quindi è molto probabile che l'indicazione "variabile = numero" nell'espressione "if" sia dovuta a un errore di battitura. In dotazione è fornito uno script che consente di caricare i progetti esistenti nei repository di GitHub scritti in C e utilizzarli per costruire un modello. Sono inoltre disponibili modelli già pronti che permettono di iniziare subito a verificare il codice.
Fonte: opennet.ru
