Intel ha aperto il codice del sistema di apprendimento automatico ControlFlag per identificare i bug nel codice

Intel ha scoperto sviluppi relativi al progetto di ricerca ControlFlag volto a creare un sistema di machine learning per migliorare la qualità del codice. Il toolkit preparato dal progetto consente, sulla base di un modello addestrato su una grande quantità di codice esistente, di identificare vari errori e anomalie nei testi di origine scritti in linguaggi di alto livello come C/C++. Il sistema è adatto per identificare vari tipi di problemi nel codice, dall'identificazione di errori di battitura e combinazioni di tipi errate, all'identificazione di controlli di valore NULL mancanti nei puntatori e problemi di memoria. Il codice ControlFlag è scritto in C++ ed è open source con licenza MIT.

Il sistema si autoapprende costruendo un modello statistico dell'array di codice esistente di progetti aperti pubblicati su GitHub e archivi pubblici simili. Nella fase di addestramento, il sistema determina modelli tipici per la costruzione di strutture nel codice e costruisce un albero sintattico di connessioni tra questi modelli, riflettendo il flusso di esecuzione del codice nel programma. Di conseguenza, si forma un albero decisionale di riferimento che unisce l'esperienza di sviluppo di tutti i codici sorgente analizzati.

Il codice in esame viene sottoposto a un processo simile di identificazione di modelli che vengono confrontati con un albero decisionale di riferimento. Grandi discrepanze con i rami vicini indicano la presenza di un'anomalia nel modello in esame. Il sistema consente inoltre non solo di identificare un errore nel modello, ma anche di suggerire una correzione. Ad esempio, nel codice OpenSSL è stata identificata la costruzione “(s1 == NULL) ∧ (s2 == NULL)”, che è apparsa nell'albero della sintassi solo 8 volte, mentre il ramo più vicino con il valore “(s1 == NULL) || (s2 == NULL)” si è verificato circa 7 mila volte. Il sistema ha inoltre rilevato un'anomalia “(s1 == NULL) | (s2 == NULL)” apparso 32 volte nell'albero.

Intel ha aperto il codice del sistema di apprendimento automatico ControlFlag per identificare i bug nel codice

Quando si analizza il frammento di codice “if (x = 7) y = x;” Il sistema ha determinato che la costruzione “variabile == numero” viene solitamente utilizzata nell'operatore “se” per confrontare valori numerici, quindi è molto probabile che l'indicazione “variabile = numero” nell'espressione “se” sia causata da un errore di battitura. Gli analizzatori statici tradizionali avrebbero colto un simile errore, ma a differenza di loro, ControlFlag non applica regole già pronte, in cui è difficile prevedere tutte le opzioni possibili, ma si basa su statistiche sull'utilizzo di varie strutture in un gran numero di progetti.

A titolo sperimentale, utilizzando ControlFlag nel codice sorgente dell'utilità cURL, che viene spesso citato come esempio di codice testato e di alta qualità, è stato identificato un errore non rilevato dagli analizzatori statici quando si utilizzava l'elemento di struttura “s->keepon”, che aveva un tipo numerico, ma è stato confrontato con il valore booleano TRUE . Nel codice OpenSSL, oltre al già citato problema con "(s1 == NULL) ∧ (s2 == NULL)", sono state riscontrate anomalie anche nelle espressioni "(-2 == rv)" (il meno era un errore di battitura) e "BIO_puts(bp, ":")

Fonte: opennet.ru

Aggiungi un commento