Intel avas ControlFlag masinõppesüsteemi koodi, et tuvastada koodis olevad vead

Intel on avastanud uurimisprojektiga ControlFlag seotud arendused, mille eesmärk on luua masinõppesüsteem koodi kvaliteedi parandamiseks. Projekti koostatud tööriistakomplekt võimaldab suurel hulgal olemasoleval koodil treenitud mudeli põhjal tuvastada erinevaid vigu ja kõrvalekaldeid kõrgetasemelistes keeltes, näiteks C/C++, kirjutatud lähtetekstides. Süsteem sobib erinevate koodiprobleemide tuvastamiseks, alustades kirjavigade ja valede tüübikombinatsioonide tuvastamisest, lõpetades osutite vahelejäänud NULL-kontrollide ja mäluprobleemide tuvastamisega. ControlFlagi kood on kirjutatud C++ keeles ja on avatud lähtekoodiga MIT litsentsi all.

Süsteem õpib ise, luues GitHubis ja sarnastes avalikes hoidlates avaldatud avatud projektide olemasoleva koodimassiivi statistilise mudeli. Õppimisetapis määrab süsteem koodis struktuuride konstrueerimiseks tüüpilised mustrid ja loob nende mustrite vahel linkidest süntaktilise puu, mis kajastab programmis koodi täitmise voogu. Selle tulemusena moodustub viiteotsuste puu, mis ühendab kõigi analüüsitud lähtetekstide arendamise kogemuse.

Testitav kood läbib sarnase protsessi, mille käigus tuvastatakse mustrid, mida võrreldakse võrdlusotsuste puuga. Suured lahknevused naaberharudega näitavad anomaalia olemasolu kontrollitavas mallis. Samuti võimaldab süsteem mitte ainult mallis viga tuvastada, vaid ka parandusettepanekut teha. Näiteks OpenSSL koodis leiti konstruktsioon “(s1 == NULL) ∧ (s2 == NULL)”, mis esines süntaksipuus vaid 8 korda, samas kui lähim haru väärtusega “(s1 == NULL) || (s2 == NULL)" esines umbes 7 tuhat korda. Süsteem tuvastas ka anomaalia “(s1 == NULL) | (s2 == NULL)", mis esines puus 32 korda.

Intel avas ControlFlag masinõppesüsteemi koodi, et tuvastada koodis olevad vead

Koodilõigu parsimisel "if (x = 7) y = x;" süsteem on kindlaks teinud, et "if"-lauses kasutatakse tavaliselt arvuliste väärtuste võrdlemiseks konstruktsiooni "muutuja == number", mistõttu suure tõenäosusega põhjustab "if" avaldises tähise "muutuja = arv" kirjaviga. Traditsioonilised staatilised analüsaatorid tabaksid sellise vea, kuid erinevalt neist ei kasuta ControlFlag valmis reegleid, milles on raske kõiki võimalikke valikuid ette näha, vaid põhineb igasuguste konstruktsioonide kasutamise statistikal väga paljudes projektides. .

Katsena, kasutades cURL-i utiliidi lähtekoodis ControlFlag'i, mida sageli tuuakse kvaliteetse ja kontrollitud koodi näitena, tuvastati struktuurielemendi "s->keepon" kasutamisel staatiliste analüsaatorite poolt märkamatu viga. millel oli numbritüüp, kuid seda võrreldi tõeväärtusega TRUE . OpenSSL-koodis esines lisaks ülaltoodud probleemile "(s1 == NULL) ∧ (s2 == NULL)" anomaaliaid ka avaldistes "(-2 == rv)" (miinus oli kirjaviga ) ja "BIO_puts(bp, ":")

Allikas: opennet.ru

Lisa kommentaar