Spoločnosť Intel publikovala prvý významný release nástroja ControlFlag 1.0, ktorý umožňuje identifikovať chyby a anomálie v zdrojových kódoch, využívajúc systém strojového učenia, trénovaný na veľkom množstve existujúceho kódu. Na rozdiel od tradičných statických analyzátorov, ControlFlag nepoužíva pripravené pravidlá, v ktorých je ťažké predpokladať všetky možné varianty, ale vychádza zo štatistiky použitia všetkých jazykových konštrukcií v mnohých existujúcich projektoch. Kód ControlFlag je napísaný v jazyku C++ a je otvorený pod licenciou MIT.
Systém sa učí vytváraním štatistického modelu existujúceho súboru kódu otvorených projektov publikovaných na GitHub a podobných verejných repozitároch. V štádiu učenia systém identifikuje typické šablóny konštrukcií kódu a vytvorí syntaktický strom väzieb medzi týmito šablónami, odrážajúci tok vykonávania kódu v programe. Nakoniec sa formuje referenčný strom rozhodovania, ktorý spája skúsenosti z vývoja všetkých analyzovaných zdrojových textov. Pre kontrolovaný kód sa vykonáva podobný proces identifikovania šablón, ktoré sa porovnávajú s referenčným stromom rozhodovania. Veľké nezrovnalosti so susednými vetvami naznačujú existenciu anomálie v kontrolovanej šablóne.

Ako príklad možností ControlFlag vykonali jeho vývojári analýzu zdrojových textov projektov OpenSSL a cURL:
- V OpenSSL boli identifikované anomálne konštrukcie „(s1 == NULL) ∧ (s2 == NULL)“ a „(s1 == NULL) | (s2 == NULL)“, ktoré nezodpovedajú bežne používanému vzoru „(s1 == NULL) || (s2 == NULL)“. V kóde boli taktiež identifikované anomálie vo výrazoch „(-2 == rv)“ (mínus bol preklepom) a „BIO_puts(bp, „:“) <= 0)“ (v kontexte kontroly úspešného dokončenia funkcie malo byť „== 0“).
- V cURL bola identifikovaná prehliadnutá chyba statickými analyzátormi pri použití prvku štruktúry „s->keepon“, ktorý mal číselný typ, ale bol porovnávaný s booleovskou hodnotou TRUE.
Medzi funkciami verzie ControlFlag 1.0 vyniká úplná podpora typových šablón pre jazyk C a možnosť odhaľovania anomálií v podmienkových výrazoch „if“. Napríklad pri analýze úryvku kódu „if (x = 7) y = x;“ systém určí, že vo väčšine prípadov sa v operátore „if“ na porovnávanie číselných hodnôt používa konštrukcia „premenná == číslo“, a preto je s vysokou pravdepodobnosťou zadanie „premenná = číslo“ v siedmom výraze „if“ spôsobené preklepom. Súčasťou balíka je aj skript, ktorý umožňuje načítať existujúce repozitáre na GitHube napísané v jazyku C a využiť ich na vytvorenie modelu. K dispozícii sú aj už hotové modely, ktoré umožňujú okamžité začatie kontroly kódu.
Zdroj: opennet.ru
