ControlFlag 1.0 väljalase, tööriist C-koodis vigade tuvastamiseks

Intel on avaldanud ControlFlag 1.0 tööriista esimese suurema väljalase, mis võimaldab tuvastada lähtekoodi vigu ja kõrvalekaldeid, kasutades masinõppesüsteemi, mis on koolitatud suure hulga olemasoleva koodi põhjal. Erinevalt traditsioonilistest staatilistest analüsaatoritest ei rakenda ControlFlag valmisreegleid, milles on raske ette näha kõiki võimalikke valikuid, vaid põhineb statistikal erinevate keelekonstruktsioonide kasutamise kohta paljudes olemasolevates projektides. ControlFlagi kood on kirjutatud C++ keeles ja on avatud lähtekoodiga MIT litsentsi alusel.

Süsteemi koolitatakse, luues GitHubis ja sarnastes avalikes hoidlates avaldatud avatud lähtekoodiga projektide olemasoleva koodimassiivi statistilise mudeli. Koolitusetapil määrab süsteem koodis struktuuride konstrueerimiseks tüüpilised mustrid ja koostab nende mustrite vahel seostest süntaktilise puu, mis peegeldab programmis koodi täitmise voogu. Selle tulemusena moodustub võrdlusotsuste tegemise puu, mis ühendab kõigi analüüsitud lähtekoodide arenduskogemuse. Vaadeldav kood läbib sarnase protsessi, mille käigus tuvastatakse mustrid, mida kontrollitakse võrdlusotsuste puuga. Suured lahknevused naaberharudega näitavad anomaalia olemasolu kontrollitavas mustris.

ControlFlag 1.0 väljalase, tööriist C-koodis vigade tuvastamiseks

ControlFlagi võimaluste näitena analüüsisid arendajad OpenSSL-i ja cURL-i projektide lähtekoode:

  • Anomaalsed konstruktsioonid "(s1 == NULL) ∧ (s2 == NULL)" ja "(s1 == NULL) | (s2 == NULL)" , mis ei ühti tavaliselt kasutatava mustriga "(s1 == NULL) || (s2 == NULL)". Kood tuvastas kõrvalekaldeid ka avaldistes "(-2 == rv)" (miinus oli kirjaviga) ja "BIO_puts(bp, ":) <= 0)" (seoses, et kontrollitakse, kas funktsiooni puhul oleks see pidanud olema "== 0").
  • CURL-is avastati viga, mida staatilised analüsaatorid ei tuvastanud numbrilise tüüpi struktuurielemendi “s->keepon” kasutamisel, kuid võrreldi tõeväärtusega TRUE.

ControlFlag 1.0 versiooni funktsioonide hulgas on C-keele standardmallide täielik tugi ja võimalus tuvastada tingimuslike „kui”-avaldiste kõrvalekaldeid. Näiteks koodifragmendi "if (x = 7) y = x;" analüüsimisel Süsteem teeb kindlaks, et lause "if" kasutab tavaliselt arvväärtuste võrdlemiseks konstruktsiooni "muutuja == number", seega on väga tõenäoline, et "muutuja = number" avaldises "if" on põhjustatud kirjaveast. Komplekt sisaldab skripti, mis võimaldab teil alla laadida GitHubi olemasolevaid C-keelehoidlaid ja kasutada neid mudeli koostamiseks. Saadaval on ka valmismudelid, mis võimaldavad teil kohe koodi kontrollima hakata.

Allikas: opennet.ru

Lisa kommentaar