Intel avas ControlFlag masinõppe süsteemi koodi, et avastada koodis vigu

Intel avas arendustegevused, mis on seotud uurimisprojekti ControlFlagga, mille eesmärk on luua masinõppimise süsteem koodi kvaliteedi parandamiseks. Projekti käigus välja töötatud tööriist võimaldab tuvastada mitmesuguseid vigu ja anomaaliyaid kõrgema taseme keeltes, nagu C/C++, põhinedes mudelil, mis on koolitatud suure hulga olemasoleva koodi maandumiseks. Süsteem sobib erinevat tüüpi probleemide määramiseks koodis, alates trükivigade ja vale tüüpide kombinatsioonide kindlakstegemisest kuni NULL-väärtuse kontrollide ja mälu probleemide tuvastamiseni. ControlFlagi kood on kirjutatud C++ keeles ja avatud MIT litsentsi alusel.

Süsteem õpib iseseisvalt, ehitades statistilise mudeli olemasolevast avatud projektide koodist, mis on avaldatud GitHubis ja sarnastes avalikes repos. Õppimise etapis tuvastab süsteem tüüpilised koodistruktuuride malli struktureerimise mustrid ja loob süntaktilise seose puu nende mallide vahel, mis peegeldab koodi täitmise voogu programmis. Lõpuks moodustatakse standardne otsuste tegemise puu, mis koondab kõigi analüüsitud lähtekoodide arenduse kogemuse.

Kontrollitava koodi puhul järgneb sarnane musterite määramise protsess, kus need võrreldakse mudelpöörduspuu otsustega. Suured lahknevused naaberharudega annavad märku tõenäosusest, et kontrollitavas mustris on anomaalia. Süsteem võimaldab mitte ainult tuvastada viga mustris, vaid pakub ka paranduste ettepanekuid. Näiteks OpenSSL koodis tuvastati konstruktsioon „(s1 == NULL) ∧ (s2 == NULL)“, mida leidus 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)“, mida ilmnes puus 32 korda.

Intel avas ControlFlag masinõppe süsteemi koodi, et avastada koodis vigu

Koodi fragmendi analüüsi tulemusena "if (x = 7) y = x;" tuvastas süsteem, et tavaliselt kasutatakse "if" lauses arvuväärsusete võrdlemiseks konstruktsiooni "muutuja == number". Seetõttu on tõenäolisem, et "muutuja = number" kasutamine "if" väljendis on põhjustatud trükiveast. Sellise vea oleks tabanud ka traditsioonilised staatilised analüsaatorid, kuid erinevalt neist ei kasuta ControlFlag valmis reegleid, mis ei hõlma kõiki võimalikke variante, vaid tugineb erinevate konstruktsioonide statistikale paljusid projekte.

Eksperimendi käigus tuvastas ControlFlag cURL utiliidi lähtekoodis, mis on sageli näidatud kvaliteetse ja kontrollitud koodina, staatiliste analüsaatorite poolt tähelepanuta jäänud vea, kui struktuuri elementi "s->keepon", mis oli numbrilise tüübiga, võrreldi loogilise väärtusega TRUE. OpenSSL koodis, peale eeltoodud probleemi "(s1 == NULL) ∧ (s2 == NULL)", tuvastati ka anomaaliaid väljendites "(-2 == rv)" (miinus oli trükiviga) ja "BIO_puts(bp, ':')".

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster