Intel je otvorio ControlFlag sistemski kod za mašinsko učenje da identifikuje greške u kodu

Intel je otkrio razvoj u vezi sa istraživačkim projektom ControlFlag, čiji je cilj stvaranje sistema mašinskog učenja za poboljšanje kvaliteta koda. Komplet alata koji je pripremio projekat omogućava, na osnovu modela obučenog na velikoj količini postojećeg koda, da se otkriju različite greške i anomalije u izvornim tekstovima napisanim na jezicima visokog nivoa kao što je C/C++. Sistem je pogodan za identifikaciju raznih vrsta problema u kodu, od otkrivanja grešaka u kucanju i netač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.

Sistem se samostalno uči izgradnjom statističkog modela postojećeg niza kodova otvorenih projekata objavljenih na GitHubu i sličnim javnim repozitorijumima. U fazi učenja, sistem određuje tipične obrasce za konstruisanje struktura u kodu i gradi sintaksičko stablo veza između ovih obrazaca, koje odražava tok izvršavanja koda u programu. Kao rezultat, formira se referentno stablo odlučivanja koje kombinuje iskustvo razvoja svih analiziranih izvornih tekstova.

Kod koji se testira prolazi kroz sličan proces identifikacije obrazaca koji se provjeravaju u odnosu na referentno stablo odlučivanja. Velika neslaganja sa susjednim granama ukazuju na prisustvo anomalije u šablonu koji se provjerava. Sistem takođe omogućava ne samo da identifikuje grešku u šablonu, već i da predloži ispravku. Na primjer, u OpenSSL kodu je pronađena konstrukcija “(s1 == NULL) ∧ (s2 == NULL)” koja se pojavila samo 8 puta u stablu sintakse, dok je najbliža grana sa vrijednošću “(s1 == NULL) || (s2 == NULL)" se dogodilo oko 7 hiljada puta. Sistem je također otkrio anomaliju “(s1 == NULL) | (s2 == NULL)" koja se pojavila 32 puta u stablu.

Intel je otvorio ControlFlag sistemski kod za mašinsko učenje da identifikuje greške u kodu

Prilikom raščlanjivanja isječka koda "if (x = 7) y = x;" sistem je utvrdio da se konstrukcija “varijabla == broj” obično koristi u naredbi “if” za upoređivanje numeričkih vrijednosti, stoga, s velikom vjerovatnoćom, indikacija “varijabla = broj” u izrazu “ako” je uzrokovana greška u kucanju. Tradicionalni statički analizatori bi uhvatili takvu grešku, ali za razliku od njih, ControlFlag ne koristi gotova pravila u kojima je teško predvidjeti sve moguće opcije, već se bazira na statistici korištenja svih vrsta konstrukcija u velikom broju projekata. .

Kao eksperiment, korištenjem ControlFlag u izvornom kodu uslužnog programa cURL, koji se često navodi kao primjer kvalitetnog i provjerenog koda, otkrivena je greška koju statički analizatori ne primjećuju prilikom korištenja elementa strukture "s->keepon", koji je imao numerički tip, ali je upoređen s logičkom vrijednošću TRUE . U OpenSSL kodu, pored gornjeg problema sa "(s1 == NULL) ∧ (s2 == NULL)", bilo je i anomalija u izrazima "(-2 == rv)" (minus je bila tipska greška ) i "BIO_puts(bp, ":")

izvor: opennet.ru

Dodajte komentar