Intel a deschis codul sistemului de învățare automată ControlFlag pentru a identifica erorile din cod

Intel a descoperit dezvoltări legate de proiectul de cercetare ControlFlag, care vizează crearea unui sistem de învățare automată pentru a îmbunătăți calitatea codului. Setul de instrumente pregătit de proiect permite, pe baza unui model antrenat pe o cantitate mare de cod existent, detectarea diferitelor erori și anomalii în textele sursă scrise în limbaje de nivel înalt precum C/C++. Sistemul este potrivit pentru identificarea diferitelor tipuri de probleme în cod, de la detectarea greșelilor de scriere și a combinațiilor de tipuri incorecte, la detectarea verificărilor NULL ratate în pointere și probleme de memorie. Codul ControlFlag este scris în C++ și este open source sub licența MIT.

Sistemul se învață automat prin construirea unui model statistic al matricei de coduri existente de proiecte deschise publicate în GitHub și în depozite publice similare. În etapa de învățare, sistemul determină modele tipice pentru construirea structurilor în cod și construiește un arbore sintactic de legături între aceste modele, care reflectă fluxul de execuție a codului în program. Ca urmare, se formează un arbore de decizie de referință care combină experiența dezvoltării tuturor textelor sursă analizate.

Codul testat trece printr-un proces similar de identificare a modelelor care sunt verificate cu un arbore de decizie de referință. Discrepanțele mari cu ramurile învecinate indică prezența unei anomalii în șablonul care se verifică. De asemenea, sistemul permite nu numai să identifice o eroare în șablon, ci și să sugereze o corecție. De exemplu, în codul OpenSSL a fost găsită construcția „(s1 == NULL) ∧ (s2 == NULL)”, care a apărut de numai 8 ori în arborele de sintaxă, în timp ce cea mai apropiată ramură cu valoarea „(s1 == NULL) || (s2 == NULL)" a avut loc de aproximativ 7 mii de ori. Sistemul a detectat și o anomalie „(s1 == NULL) | (s2 == NULL)" care a apărut de 32 de ori în arbore.

Intel a deschis codul sistemului de învățare automată ControlFlag pentru a identifica erorile din cod

Când analizați fragmentul de cod „dacă (x = 7) y = x;” sistemul a stabilit că construcția „variabilă == număr” este de obicei utilizată în declarația „dacă” pentru a compara valori numerice, prin urmare, cu o probabilitate mare, indicația „variabilă = număr” în expresia „dacă” este cauzată de o greseala de scriere. Analizoarele statice tradiționale ar surprinde o astfel de eroare, dar spre deosebire de ei, ControlFlag nu folosește reguli gata făcute în care este dificil să se prevadă toate opțiunile posibile, ci se bazează pe statisticile utilizării a tot felul de constructe într-un număr mare de proiecte. .

Ca experiment, folosind ControlFlag în codul sursă al utilitarului cURL, care este adesea citat ca exemplu de cod de înaltă calitate și verificat, a fost detectată o eroare neobservată de analizatorii statici atunci când se folosește elementul de structură „s->keepon”, care avea un tip numeric, dar a fost comparat cu valoarea booleană TRUE . În codul OpenSSL, pe lângă problema menționată mai sus cu „(s1 == NULL) ∧ (s2 == NULL)”, au existat și anomalii în expresiile „(-2 == rv)” (minus a fost o greșeală de tipar). ) și „BIO_puts(bp, „:”)

Sursa: opennet.ru

Adauga un comentariu