„Intel“ atidarė „ControlFlag“ mašininio mokymosi sistemos kodą, kad nustatytų kodo klaidas

„Intel“ atrado naujoves, susijusias su „ControlFlag“ tyrimų projektu, kurio tikslas – sukurti mašininio mokymosi sistemą, kad pagerintų kodo kokybę. Projekto parengtas įrankių rinkinys leidžia, remiantis modeliu, parengtu naudojant didelį esamo kodo kiekį, aptikti įvairias klaidas ir anomalijas šaltinio tekstuose, parašytuose aukšto lygio kalbomis, tokiomis kaip C/C++. Sistema tinka įvairioms kodo problemoms nustatyti, nuo rašybos klaidų ir neteisingų tipų derinių aptikimo iki praleistų NULL patikrinimų rodyklėse ir atminties problemų. „ControlFlag“ kodas parašytas C++ kalba ir yra atvirojo kodo pagal MIT licenciją.

Sistema mokosi savarankiškai, sukurdama esamo atvirų projektų kodų masyvo, paskelbto „GitHub“ ir panašiose viešose saugyklose, statistinį modelį. Mokymosi etape sistema nustato tipinius kode struktūrų konstravimo modelius ir sukuria sintaksinį sąsajų medį tarp šių šablonų, atspindintį kodo vykdymo srautą programoje. Dėl to susidaro nuorodų sprendimų medis, kuris apjungia visų analizuojamų šaltinių tekstų kūrimo patirtį.

Testuojamas kodas vyksta panašiu būdu identifikuojant šablonus, kurie tikrinami pagal nuorodų sprendimų medį. Dideli neatitikimai su gretimomis šakomis rodo, kad tikrinamame šablone yra anomalija. Sistema taip pat leidžia ne tik nustatyti šablono klaidą, bet ir pasiūlyti pataisymą. Pavyzdžiui, OpenSSL kode buvo rasta konstrukcija „(s1 == NULL) ∧ (s2 == NULL)“, kuri sintaksės medyje pasitaikė tik 8 kartus, o artimiausia šaka su reikšme „(s1 == NULL) || (s2 == NULL)“ įvyko apie 7 tūkstančius kartų. Sistema taip pat aptiko anomaliją „(s1 == NULL) | (s2 == NULL)“, kuris medyje įvyko 32 kartus.

„Intel“ atidarė „ControlFlag“ mašininio mokymosi sistemos kodą, kad nustatytų kodo klaidas

Nagrinėjant kodo fragmentą "if (x = 7) y = x;" sistema nustatė, kad „if“ sakinyje paprastai naudojama konstrukcija „kintamasis == skaičius“, norint palyginti skaitines reikšmes, todėl su didele tikimybe rodymą „kintamasis = skaičius“ reiškinyje „if“ sukelia rašybos klaida. Tradiciniai statiniai analizatoriai užfiksuotų tokią klaidą, tačiau, skirtingai nei jie, „ControlFlag“ nenaudoja paruoštų taisyklių, kuriose sunku numatyti visas įmanomas parinktis, o remiasi visų rūšių konstrukcijų naudojimo daugelyje projektų statistika. .

Eksperimento metu cURL programos šaltinio kode naudojant ControlFlag, kuris dažnai minimas kaip aukštos kokybės ir patikrinto kodo pavyzdys, buvo aptikta klaida, kurios nepastebėjo statiniai analizatoriai, naudojant struktūros elementą "s->keepon". kuris turėjo skaitinį tipą, bet buvo lyginamas su logine reikšme TRUE . OpenSSL kode, be jau minėtos problemos su "(s1 == NULL) ∧ (s2 == NULL)", taip pat buvo anomalijų posakiuose "(-2 == rv)" (minusas buvo rašybos klaida ) ir "BIO_puts(bp, ":")

Šaltinis: opennet.ru

Добавить комментарий