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

Intel on julkaissut työnsä ControlFlag-tutkimusprojektissa, jonka tavoitteena on luoda koneoppimisjärjestelmä koodin laadun parantamiseksi. Projektin työkalupakki käyttää suurella määrällä olemassa olevaa koodia koulutettua mallia tunnistaakseen erilaisia ​​virheitä ja poikkeavuuksia korkean tason kielillä, kuten C/C++:lla, kirjoitetussa lähdekoodissa. Järjestelmä soveltuu tunnistamaan erityyppisiä koodiongelmia, kirjoitusvirheistä ja virheellisistä tyyppiyhdistelmistä puuttuviin NULL-tarkistuksiin osoittimissa ja muistinhallintaongelmiin. ControlFlag on kirjoitettu C++:lla ja se on avoimen lähdekoodin ohjelmisto MIT-lisenssillä.

Järjestelmä oppii itse rakentamalla tilastollisen mallin GitHubissa ja vastaavissa julkisissa arkistoissa julkaistujen avoimen lähdekoodin projektien olemassa olevasta koodikannasta. Koulutusvaiheen aikana järjestelmä tunnistaa koodissa tyypillisiä kaavoja ja rakentaa näiden kaavojen välisistä suhteista syntaktisen puun, joka heijastaa ohjelman koodin suoritusvirtaa. Tämä tuottaa lopulta referenssipäätöspuun, joka yhdistää kaiken analysoidun lähdekoodin kehityskokemuksen.

Samankaltaista prosessia käytetään testattavan koodin kuvioiden tunnistamiseen, joita sitten verrataan referenssipäätöspuuhun. Suuret eroavaisuudet vierekkäisten haarojen välillä osoittavat poikkeavuutta testattavassa kuviossa. Järjestelmä ei ainoastaan ​​tunnista kuvion virhettä, vaan myös ehdottaa korjausta. Esimerkiksi OpenSSL-koodissa havaittiin rakenne "(s1 == NULL) ∧ (s2 == NULL)", joka esiintyi syntaksipuussa vain 8 kertaa, kun taas lähimpänä oleva haara, jonka arvo oli "(s1 == NULL) || (s2 == NULL)", esiintyi noin 7 000 kertaa. Järjestelmä tunnisti myös poikkeavuuden "(s1 == NULL) | (s2 == NULL)", joka esiintyi puussa 32 kertaa.

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

Analysoitaessa koodinpätkää "if (x = 7) y = x;" järjestelmä havaitsi, että "if"-lauseke käyttää tyypillisesti "variable == number" -rakennetta numeeristen arvojen vertailuun. Siksi on erittäin todennäköistä, että "if"-lausekkeen "variable = number" -lauseke johtui kirjoitusvirheestä. Perinteiset staattiset analysaattorit olisivat havainneet tämän virheen, mutta ControlFlag, toisin kuin ne, ei käytä ennalta määritettyjä sääntöjä, joiden on vaikea kattaa kaikkia mahdollisia skenaarioita, vaan se perustuu tilastoihin erilaisten rakenteiden käytöstä suuressa määrässä projekteja.

Kokeiluna ControlFlag-ominaisuuden käyttämisessä cURL-apuohjelman lähdekoodissa, jota usein pidetään esimerkkinä korkealaatuisesta ja varmennetusta koodista, havaittiin staattisilta analysaattoreilta huomaamaton virhe "s->keepon"-rakenneelementin käytössä. Rakenneelementti oli numeerinen, mutta sitä verrattiin loogiseen arvoon TRUE. OpenSSL-koodissa havaittiin edellä mainitun "(s1 == NULL) ∧ (s2 == NULL)" -ongelman lisäksi poikkeavuuksia myös lausekkeissa "(-2 == rv)" (miinusmerkki oli kirjoitusvirhe) ja "BIO_puts(bp, ":")

Lähde: opennet.ru

Osta luotettava isännöinti sivustoille, joissa on DDoS-suojaus, VPS VDS -palvelimet 🔥 Osta luotettavaa verkkosivustojen hostingia DDoS-suojauksella, VPS VDS -palvelimilla | ProHoster