Intel je odprl sistemsko kodo strojnega učenja ControlFlag, da bi prepoznal napake v kodi

Intel je odkril razvoj, povezan z raziskovalnim projektom ControlFlag, katerega cilj je ustvariti sistem strojnega učenja za izboljšanje kakovosti kode. Zbirka orodij, ki jo je pripravil projekt, omogoča, da na podlagi modela, usposobljenega na veliki količini obstoječe kode, prepozna različne napake in anomalije v izvornih besedilih, napisanih v jezikih na visoki ravni, kot je C/C++. Sistem je primeren za prepoznavanje različnih vrst težav v kodi, od prepoznavanja tipkarskih napak in nepravilnih kombinacij tipov do prepoznavanja manjkajočih preverjanj vrednosti NULL v kazalcih in težav s pomnilnikom. Koda ControlFlag je napisana v C++ in je odprtokodna pod licenco MIT.

Sistem se uči sam z izgradnjo statističnega modela obstoječe kodne matrike odprtokodnih projektov, objavljenih v GitHubu in podobnih javnih repozitorijih. Na stopnji usposabljanja sistem določi tipične vzorce za gradnjo struktur v kodi in zgradi sintaktično drevo povezav med temi vzorci, ki odražajo tok izvajanja kode v programu. Kot rezultat se oblikuje referenčno drevo odločanja, ki združuje razvojne izkušnje vseh analiziranih izvornih kod.

Koda, ki se pregleduje, je podvržena podobnemu postopku prepoznavanja vzorcev, ki se preverjajo glede na referenčno drevo odločitev. Velika odstopanja s sosednjimi vejami kažejo na prisotnost anomalije v vzorcu, ki se preverja. Sistem vam omogoča tudi, da ne samo prepoznate napako v predlogi, ampak tudi predlagate popravek. Na primer, v kodi OpenSSL je bila identificirana konstrukcija “(s1 == NULL) ∧ (s2 == NULL)”, ki se je v sintaksnem drevesu pojavila le 8-krat, medtem ko je najbližja veja z vrednostjo “(s1 == NULL) || (s2 == NULL)« približno 7 tisočkrat. Sistem je zaznal tudi anomalijo “(s1 == NULL) | (s2 == NULL)«, ki se je v drevesu pojavil 32-krat.

Intel je odprl sistemsko kodo strojnega učenja ControlFlag, da bi prepoznal napake v kodi

Pri analizi fragmenta kode "if (x = 7) y = x;" Sistem je ugotovil, da se konstrukcija »spremenljivka == število« običajno uporablja v operatorju »if« za primerjavo številskih vrednosti, zato je zelo verjetno, da je navedbo »spremenljivka = število« v izrazu »if« povzročila tipkarska napaka. Tradicionalni statični analizatorji bi takšno napako ujeli, vendar za razliko od njih ControlFlag ne uporablja že pripravljenih pravil, v katerih je težko predvideti vse možne možnosti, ampak temelji na statistiki uporabe različnih struktur v velikem številu. projektov.

Kot eksperiment je bila z uporabo ControlFlag v izvorni kodi pripomočka cURL, ki se pogosto navaja kot primer visokokakovostne in preizkušene kode, pri uporabi elementa strukture »s->keepon« ugotovljena napaka, ki je statični analizatorji niso zaznali, ki je imel številski tip, vendar je bil primerjan z logično vrednostjo TRUE. V kodi OpenSSL so bile poleg zgoraj omenjene težave z "(s1 == NULL) ∧ (s2 == NULL)" ugotovljene tudi anomalije v izrazih "(-2 == rv)" (minus je bil tipkarska napaka) in "BIO_puts(bp, ":")

Vir: opennet.ru

Dodaj komentar