Intel on avaldanud esimese olulise versiooni tööriistast ControlFlag 1.0, mis võimaldab tuvastada vigu ja anomaaliaid lähtekoodides, kasutades masinõppe süsteemi, mis on treenitud suure hulga olemasoleva koodi peal. Erinevalt traditsioonilisest staatilisest analüüsist ei kasuta ControlFlag rangete reeglite rakendamist, mis ei suuda kõiki võimalikke olukordi ette näha, vaid toetub statistikale keelekonstruktsioonide kasutamise kohta paljusid olemasolevaid projekte arvesse võttes. ControlFlag'i kood on kirjutatud C++ keeles ja see on avatud MIT litsentsi alusel.
Süsteem õpib, luues statistilise mudeli olemasolevast avatud projektide koodist, mis on avaldatud GitHubis ja sarnastes avalikes hoidlatest. Õppeetapis määrab süsteem tüüpilised struktuuri mallit koodis ja loob süntaktilise puu, mis peegeldab koodi täitmise voogu programmis. Lõppkokkuvõttes moodustatakse eeskujuliku otsuste puu, mis ühendab kõikide analüüsitud allikate arenduskogemuse. Kontrollitava koodi puhul toimub sarnane mallide määratlemise protsess, mille tulemused võrreldakse eeskujuliku otsuste puuga. Suured erinevused naabervarude vahel näitavad, et kontrollitavas malis esineb kõrvalekalle.

Näiteks ControlFlagi võimaluste demonstreerimiseks viisid arendajad läbi OpenSSL ja cURL projektide allikakoodide analüüsi:
- OpenSSL-is on avastatud ebatavalised konstruktsioonid „(s1 == NULL) ∧ (s2 == NULL)“ ja „(s1 == NULL) | (s2 == NULL)“, mis ei vasta tavaliselt kasutatavale mustrile „(s1 == NULL) || (s2 == NULL)“. Koodis tuvastati ka ebanormaalsusi väljendites „(-2 == rv)“ (miinus oli trükiviga) ja „BIO_puts(bp, «:») <= 0)“ (funktsiooni edukuse kontrollimise kontekstis pidi olema „== 0“).
- cURL-is tuvastati staatiliste analüsaatorite poolt tähelepanuta jäetud viga, kui kasutati struktuuri elementi „s->keepon“, mis oli numbriline tüüp, kuid võrreldud boolean väärtusega TRUE.
ControlFlag 1.0 versiooni eripära on täielik toetus C keele standardsete mallide jaoks ning võimalus tuvastada kõrvalekaldeid tingimuslike lauseid "if". Näiteks, koodi fragmendi analüüsimisel "if (x = 7) y = x;" tuvastab süsteem, et tavaliselt kasutatakse "if" operaatoris numbriliste väärtuste võrdlemiseks konstruktsiooni "muutuja == number", mistõttu on tõenäoliselt "muutuja = number" väljendis "if" sisestatud trükiviga. Komplekt sisaldab skripti, mis võimaldab laadida olemasolevad C keele projektid GitHubist ja kasutada neid mudeli koostamiseks. Samuti on saadaval juba valmis mudelid, mis võimaldavad koheselt koodi kontrollimist alustada.
Allikas: opennet.ru
