Intel je otvorio kod sustava strojnog učenja ControlFlag kako bi identificirao greške u kodu

Intel je otkrio razvoj povezan s istraživačkim projektom ControlFlag, čiji je cilj stvaranje sustava strojnog učenja za poboljšanje kvalitete koda. Skup alata pripremljen u okviru projekta omogućuje, na temelju modela obučenog na velikoj količini postojećeg koda, otkrivanje raznih pogrešaka i anomalija u izvornim tekstovima napisanim na jezicima visoke razine kao što je C/C++. Sustav je prikladan za prepoznavanje raznih vrsta problema u kodu, od otkrivanja pogrešaka pri upisu i netočnih kombinacija tipova, do otkrivanja propuštenih NULL provjera u pokazivačima i problema s memorijom. ControlFlag kod je napisan u C++ i otvorenog je koda pod MIT licencom.

Sustav je samoučeći izgradnjom statističkog modela postojećeg niza kodova otvorenih projekata objavljenih na GitHubu i sličnim javnim repozitorijima. U fazi učenja, sustav određuje tipične obrasce za konstrukciju struktura u kodu i gradi sintaktičko stablo veza između tih obrazaca, što odražava tijek izvršavanja koda u programu. Kao rezultat toga, formira se referentno stablo odlučivanja koje kombinira iskustvo razvoja svih analiziranih izvornih tekstova.

Kod koji se testira prolazi kroz sličan proces identificiranja uzoraka koji se provjeravaju prema referentnom stablu odlučivanja. Velika odstupanja sa susjednim granama ukazuju na prisutnost anomalije u predlošku koji se provjerava. Sustav također omogućuje ne samo prepoznavanje pogreške u predlošku, već i predlaganje ispravka. Na primjer, u kodu OpenSSL pronađena je konstrukcija “(s1 == NULL) ∧ (s2 == NULL)” koja se pojavila samo 8 puta u stablu sintakse, dok je najbliža grana s vrijednošću “(s1 == NULL) || (s2 == NULL)" dogodio oko 7 tisuća puta. Sustav je također otkrio anomaliju “(s1 == NULL) | (s2 == NULL)" koji se dogodio 32 puta u stablu.

Intel je otvorio kod sustava strojnog učenja ControlFlag kako bi identificirao greške u kodu

Prilikom raščlambe isječka koda "if (x = 7) y = x;" sustav je utvrdio da se konstrukcija "varijabla == broj" obično koristi u izjavi "if" za usporedbu numeričkih vrijednosti, stoga je s velikom vjerojatnošću indikacija "varijabla = broj" u izrazu "if" uzrokovana pogreška pri upisu. Tradicionalni statički analizatori uhvatili bi takvu pogrešku, ali za razliku od njih, ControlFlag ne koristi gotova pravila u kojima je teško predvidjeti sve moguće opcije, već se temelji na statistici korištenja svih vrsta konstrukata u velikom broju projekata. .

Kao eksperiment, koristeći ControlFlag u izvornom kodu uslužnog programa cURL, koji se često navodi kao primjer visokokvalitetnog i provjerenog koda, detektirana je pogreška koju statički analizatori nisu primijetili prilikom korištenja elementa strukture "s->keepon", koji je imao numerički tip, ali je uspoređivan s boolean vrijednošću TRUE. U OpenSSL kodu, osim gore spomenutog problema s "(s1 == NULL) ∧ (s2 == NULL)", bilo je i anomalija u izrazima "(-2 == rv)" (minus je bila tipfeler ) i "BIO_puts(bp, ":")

Izvor: opennet.ru

Dodajte komentar