Intel avas välja ControlFlag teadusprojekti, mille eesmärk on arendada välja masinõppe süsteem koodi kvaliteedi parandamiseks. Projekti raames loodud tööriist võimaldab tuvastada erinevaid vigu ja anomaaliaid kõrgema taseme keeles, nagu C/C++, põhinedes suurel hulgal olemasolevast koodist treenitud mudelile. Süsteem sobib erinevat tüüpi probleemide määramiseks koodis, alates trükivigade ja vale andmetüübi kombinatsioonide tuvastamisest kuni NULL väärtuse kontrollide ja mälu probleemide leidmiseni. ControlFlag kood on kirjutatud C++ keeles ja on avatud MIT litsentsi alusel.
Süsteem õpib iseseisvalt, ehitades statistilisi mudeleid olemasolevatest avatud projektide koodidest, mis on avaldatud GitHubis ja sarnastes avalikes hoidlates. Koolitusprotsessis tuvastab süsteem tüüpilised koodistruktuuride mustrid ja koostab süntaktilise puu ühendustes nende mustrite vahel, peegeldades koodi teostamise voogu programmis. Lõpptulemusena moodustub viimase otsuse puu, mis kogub kõikide analüüsitud lähtekoodide arenduse kogemused.
Kontrollitava koodi puhul toimub sarnane protsess mustrite tuvastamiseks, mida võrreldakse viimase otsuse puuga. Suured lahknevused kõrvalharudest osutavad kontrollitava mustri anomaaliale. Süsteem võimaldab mitte ainult tuvastada mustris viga, vaid ka pakkuda parandusi. Näiteks OpenSSL koodis tuvastati konstruktsioon „(s1 == NULL) ∧ (s2 == NULL)“, mida ilmnes süntaktilises puus vaid 8 korda, samas kui lähim haru väärtusega „(s1 == NULL) || (s2 == NULL)“ ilmnes umbes 7000 korda. Süsteem tuvastas ka anomaalia „(s1 == NULL) | (s2 == NULL)“, mis ilmnes puus 32 korda.

Koodi lõigu "if (x = 7) y = x;" analüüsimisel tuvastas süsteem, et tavaliselt kasutatakse "if"-lause numbriliste väärtuste võrdlemiseks konstruktsiooni "muutuja == number", seega on tõenäoliselt "muutuja = number" kasutamine "if"-väites trükiveast tingitud. Sellise vea oleks kinni püüdnud ka traditsioonilised staatilised analüsaatorid, kuid erinevalt neist ei kasuta ControlFlag valmisreegleid, milles on keeruline ette näha kõiki võimalikke variatsioone, vaid tugineb statistikale, mis hõlmab erinevate konstruktsioonide kasutamist suures hulgas projektides.
Eksperimendi raames leidis ControlFlag utiliidi cURL lähtekoodis, mis on tihti toodud kvaliteetse ja kontrollitud koodina, staatiliste analüsaatorite poolt tähelepanuta jäänud vea struktuuri elementi "s->keepon", mis oli numbrilise tüübiga, kuid võrreldud loogilise väärtusega TRUE. OpenSSL koodis, peale eelpoolmainitud probleemi "(s1 == NULL) ∧ (s2 == NULL)", tuvastati samuti anomaaliaid väljendites "(-2 == rv)" (miinus oli trükiviga) ja "BIO_puts(bp, ":")".
Allikas: opennet.ru
