Systém strojového učenia Intel ControlFlag s otvoreným zdrojom na identifikáciu chýb kódu

Intel objavil vývoj súvisiaci s výskumným projektom ControlFlag zameraným na vytvorenie systému strojového učenia na zlepšenie kvality kódu. Súbor nástrojov pripravený projektom umožňuje na základe modelu natrénovaného na veľkom množstve existujúceho kódu identifikovať rôzne chyby a anomálie v zdrojových textoch napísaných v jazykoch vysokej úrovne, ako je C/C++. Systém je vhodný na identifikáciu rôznych typov problémov v kóde, od identifikácie preklepov a nesprávnych kombinácií typov, až po identifikáciu chýbajúcich kontrol NULL hodnôt v ukazovateľoch a problémov s pamäťou. Kód ControlFlag je napísaný v C++ a je otvorený pod licenciou MIT.

Systém sa samoučí budovaním štatistického modelu existujúceho kódového poľa projektov s otvoreným zdrojovým kódom publikovaných na GitHub a podobných verejných úložiskách. Vo fáze trénovania systém určuje typické vzory na vytváranie štruktúr v kóde a vytvára syntaktický strom spojení medzi týmito vzormi, ktorý odráža tok vykonávania kódu v programe. Výsledkom je vytvorenie referenčného rozhodovacieho stromu, ktorý kombinuje skúsenosti s vývojom všetkých analyzovaných zdrojových kódov.

Skúmaný kód prechádza podobným procesom identifikácie vzorov, ktoré sa kontrolujú podľa referenčného rozhodovacieho stromu. Veľké rozdiely so susednými vetvami naznačujú prítomnosť anomálie v kontrolovanom vzore. Systém tiež umožňuje nielen identifikovať chybu v šablóne, ale aj navrhnúť opravu. Napríklad v kóde OpenSSL bola identifikovaná konštrukcia „(s1 == NULL) ∧ (s2 == NULL)“, ktorá sa v strome syntaxe objavila len 8-krát, pričom najbližšia vetva s hodnotou „(s1 == NULL) || (s2 == NULL)“ sa vyskytlo asi 7 tisíckrát. Systém tiež zistil anomáliu „(s1 == NULL) | (s2 == NULL)“, ktorý sa v strome objavil 32-krát.

Systém strojového učenia Intel ControlFlag s otvoreným zdrojom na identifikáciu chýb kódu

Pri analýze fragmentu kódu „ak (x = 7) y = x;“ Systém zistil, že konštrukcia „premenná == číslo“ sa zvyčajne používa v operátori „if“ na porovnanie číselných hodnôt, takže je vysoko pravdepodobné, že označenie „premenná = číslo“ vo výraze „ak“ je spôsobené preklep. Tradičné statické analyzátory by takúto chybu zachytili, ale na rozdiel od nich ControlFlag neuplatňuje hotové pravidlá, v ktorých je ťažké poskytnúť všetky možné možnosti, ale je založený na štatistikách používania rôznych štruktúr vo veľkom počte projektov.

Ako experiment s použitím ControlFlag v zdrojovom kóde pomôcky cURL, ktorá sa často uvádza ako príklad kvalitného a testovaného kódu, bola pri použití prvku štruktúry „s->keepon“ identifikovaná chyba, ktorú statické analyzátory neodhalili. ktorý mal číselný typ, ale bol porovnaný s boolovskou hodnotou TRUE . V kóde OpenSSL boli okrem vyššie uvedeného problému s "(s1 == NULL) ∧ (s2 == NULL)" identifikované anomálie aj vo výrazoch "(-2 == rv)" (mínus bol preklep) a "BIO_puts(bp, ":")

Zdroj: opennet.ru

Pridať komentár