Intel atvērtā pirmkoda ControlFlag mašīnmācīšanās sistēma koda kļūdu identificēšanai

Intel ir atklājis attīstību saistībā ar ControlFlag pētniecības projektu, kura mērķis ir izveidot mašīnmācīšanās sistēmu, lai uzlabotu koda kvalitāti. Projekta sagatavotais rīku komplekts ļauj, pamatojoties uz modeli, kas apmācīts uz liela daudzuma esošā koda, identificēt dažādas kļūdas un anomālijas avota tekstos, kas rakstīti augsta līmeņa valodās, piemēram, C/C++. Sistēma ir piemērota dažādu veidu problēmu identificēšanai kodā, sākot ar drukas kļūdu un nepareizu tipu kombināciju identificēšanu, līdz trūkstošo NULL vērtību pārbaužu noteikšanai rādītājos un atmiņas problēmām. ControlFlag kods ir rakstīts C++ valodā un ir atvērts ar MIT licenci.

Sistēma mācās pašmācības ceļā, veidojot statistikas modeli esošajam atvērto projektu koda masīvam, kas publicēts GitHub un līdzīgos publiskajos krātuvēs. Apmācības posmā sistēma nosaka tipiskus modeļus koda struktūru konstruēšanai un izveido sintaktisko savienojumu koku starp šiem modeļiem, atspoguļojot koda izpildes plūsmu programmā. Rezultātā tiek izveidots atsauces lēmumu pieņemšanas koks, kas apvieno visu analizēto pirmkodu izstrādes pieredzi.

Pārskatāmajam kodam tiek veikts līdzīgs process, lai identificētu modeļus, kas tiek pārbaudīti, salīdzinot ar atsauces lēmumu koku. Lielas neatbilstības ar blakus esošajiem zariem norāda uz pārbaudāmā modeļa anomāliju. Sistēma arī ļauj ne tikai identificēt kļūdu veidnē, bet arī ieteikt labojumu. Piemēram, OpenSSL kodā tika identificēta konstrukcija “(s1 == NULL) ∧ (s2 == NULL)”, kas sintakses kokā parādījās tikai 8 reizes, savukārt tuvākais zars ar vērtību “(s1 == NULL) || (s2 == NULL)” notika apmēram 7 tūkstošus reižu. Sistēma arī atklāja anomāliju “(s1 == NULL) | (s2 == NULL)”, kas kokā parādījās 32 reizes.

Intel atvērtā pirmkoda ControlFlag mašīnmācīšanās sistēma koda kļūdu identificēšanai

Analizējot koda fragmentu “ja (x = 7) y = x;” Sistēma ir noteikusi, ka konstrukciju “mainīgais == skaitlis” parasti izmanto operatorā “if”, lai salīdzinātu skaitliskās vērtības, tāpēc ļoti iespējams, ka norādi “mainīgais = skaitlis” izteiksmē “ja” izraisa drukas kļūda. Tradicionālie statiskie analizatori būtu pieķēruši šādu kļūdu, taču atšķirībā no tiem ControlFlag nepiemēro gatavus noteikumus, kuros ir grūti paredzēt visas iespējamās iespējas, bet ir balstīts uz statistiku par dažādu struktūru izmantošanu lielā skaitā. no projektiem.

Eksperimentā, izmantojot ControlFlag utilīta cURL avota kodā, kas bieži tiek minēts kā kvalitatīva un pārbaudīta koda piemērs, tika konstatēta statisko analizatoru neatklāta kļūda, izmantojot struktūras elementu “s->keepon”. kam bija skaitlisks tips, bet tas tika salīdzināts ar Būla vērtību TRUE . OpenSSL kodā papildus iepriekš minētajai problēmai ar "(s1 == NULL) ∧ (s2 == NULL)" anomālijas tika konstatētas arī izteicienos "(-2 == rv)" (mīnus bija drukas kļūda) un "BIO_puts(bp, ":")

Avots: opennet.ru

Pievieno komentāru