Intel avasi ControlFlag-koneoppimisjärjestelmän koodin tunnistaakseen koodissa olevat viat

Intel on löytänyt kehitystä liittyen ControlFlag-tutkimusprojektiin, jonka tavoitteena on luoda koneoppimisjärjestelmä koodin laadun parantamiseksi. Projektin valmistelema työkalupakki mahdollistaa suurelle määrälle olemassa olevaa koodia opetetun mallin perusteella tunnistaa erilaisia ​​virheitä ja poikkeavuuksia korkean tason kielillä, kuten C/C++, kirjoitetuista lähdeteksteistä. Järjestelmä soveltuu erilaisten koodin ongelmien tunnistamiseen kirjoitusvirheiden ja virheellisten tyyppiyhdistelmien tunnistamisesta osoittimien puuttuvien NULL-arvon tarkistusten ja muistiongelmien tunnistamiseen. ControlFlag-koodi on kirjoitettu C++-kielellä ja se on avoimen lähdekoodin MIT-lisenssillä.

Järjestelmä on itseoppiva rakentamalla tilastollisen mallin olemassa olevasta GitHubissa ja vastaavissa julkisissa arkistoissa julkaistuista avoimien projektien koodijoukosta. Harjoitusvaiheessa järjestelmä määrittää tyypilliset mallit koodin rakenteiden rakentamiseksi ja rakentaa syntaktisen yhteyksien puun näiden mallien välille, mikä kuvastaa koodin suorittamisen kulkua ohjelmassa. Tuloksena muodostuu referenssipäätöksentekopuu, joka yhdistää kaikkien analysoitujen lähdekoodien kehityskokemuksen.

Tarkastelun kohteena oleva koodi käy läpi samanlaisen prosessin, jossa tunnistetaan kuvioita, joita verrataan viitepäätöspuuhun. Suuret erot naapurihaarojen kanssa osoittavat poikkeaman olemassaolosta tarkistettavassa kuviossa. Järjestelmän avulla voit paitsi tunnistaa virheen mallissa myös ehdottaa korjausta. Esimerkiksi OpenSSL-koodissa tunnistettiin konstruktio "(s1 == NULL) ∧ (s2 == NULL)", joka esiintyi syntaksipuussa vain 8 kertaa, kun taas lähin haara arvolla "(s1 == NULL) || (s2 == NULL)" esiintyi noin 7 tuhatta kertaa. Järjestelmä havaitsi myös poikkeaman “(s1 == NULL) | (s2 == NULL)", joka esiintyi puussa 32 kertaa.

Intel avasi ControlFlag-koneoppimisjärjestelmän koodin tunnistaakseen koodissa olevat viat

Analysoitaessa koodin fragmenttia "jos (x = 7) y = x;" Järjestelmä on määrittänyt, että "muuttuja == numero" -rakennetta käytetään yleensä "if"-operaattorissa numeeristen arvojen vertailuun, joten on erittäin todennäköistä, että "jos"-lausekkeen ilmaisu "muuttuja = numero" johtuu kirjoitusvirhe. Perinteiset staattiset analysaattorit olisivat havainneet tällaisen virheen, mutta toisin kuin he, ControlFlag ei ​​käytä valmiita sääntöjä, joissa on vaikea tarjota kaikkia mahdollisia vaihtoehtoja, vaan perustuu tilastoihin useiden erilaisten rakenteiden käytöstä. hankkeista.

Kokeiluna käyttämällä ControlFlag-työkalua cURL-apuohjelman lähdekoodissa, jota usein mainitaan esimerkkinä korkealaatuisesta ja testatusta koodista, havaittiin staattisten analysaattoreiden havaitsematon virhe käytettäessä rakenneelementtiä "s->keepon". jolla oli numeerinen tyyppi, mutta sitä verrattiin Boolen arvoon TRUE . OpenSSL-koodissa edellä mainitun ongelman "(s1 == NULL) ∧ (s2 == NULL)" lisäksi poikkeavuuksia tunnistettiin myös lausekkeissa "(-2 == rv)" (miinus oli kirjoitusvirhe) ja "BIO_puts(bp, ":")

Lähde: opennet.ru

Lisää kommentti