Išleista „ControlFlag 1.0“ – įrankis, skirtas C kodo klaidoms nustatyti

„Intel“ paskelbė pirmąjį pagrindinį „ControlFlag 1.0“ įrankio leidimą, leidžiantį nustatyti šaltinio kodo klaidas ir anomalijas naudojant mašininio mokymosi sistemą, parengtą naudojant daug esamo kodo. Skirtingai nuo tradicinių statinių analizatorių, „ControlFlag“ netaiko paruoštų taisyklių, kuriose sunku numatyti visas įmanomas parinktis, bet remiasi statistika apie įvairių kalbos konstrukcijų naudojimą daugelyje esamų projektų. „ControlFlag“ kodas parašytas C++ kalba ir yra atviro kodo pagal MIT licenciją.

Sistema apmokoma kuriant esamo atvirojo kodo projektų kodų masyvo, paskelbto GitHub ir panašiose viešose saugyklose, statistinį modelį. Mokymo etape sistema nustato tipinius kode struktūrų konstravimo modelius ir sukuria sintaksinį šių šablonų ryšių medį, atspindintį kodo vykdymo eigą programoje. Dėl to susidaro atskaitos sprendimų priėmimo medis, kuris apjungia visų analizuojamų šaltinio kodų kūrimo patirtį. Peržiūrimas kodas yra panašus į šablonų, kurie yra tikrinami pagal nuorodų sprendimų medį, identifikavimo procesą. Dideli neatitikimai su gretimomis šakomis rodo, kad tikrinamame šablone yra anomalija.

Išleista „ControlFlag 1.0“ – įrankis, skirtas C kodo klaidoms nustatyti

Kaip ControlFlag galimybių pavyzdį, kūrėjai išanalizavo OpenSSL ir cURL projektų šaltinio kodus:

  • Anomalinės konstrukcijos „(s1 == NULL) ∧ (s2 == NULL)“ ir „(s1 == NULL) | (s2 == NULL)" , kurie neatitinka dažniausiai naudojamo šablono "(s1 == NULL) || (s2 == NULL)". Kodas taip pat nustatė anomalijas posakiuose „(-2 == rv)“ (minusas buvo rašybos klaida) ir „BIO_puts(bp, „:) <= 0)“ (tikrinama, ar sėkmingai atliktas funkcija, ji turėjo būti "== 0").
  • CURL buvo aptikta klaida, kurios neaptiko statiniai analizatoriai naudojant struktūros elementą „s->keepon“, kuris turėjo skaitinį tipą, bet buvo lyginamas su logine reikšme TRUE.

Tarp „ControlFlag 1.0“ versijos funkcijų yra visiškas standartinių C kalbos šablonų palaikymas ir galimybė aptikti sąlyginių „jei“ išraiškų anomalijas. Pavyzdžiui, analizuojant kodo fragmentą „if (x = 7) y = x;“ Sistema nustatys, kad sakinyje „if“ paprastai naudojama konstrukcija „kintamasis == skaičius“, kad palygintų skaitines reikšmes, todėl labai tikėtina, kad „kintamasis = skaičius“ reiškinyje „if“ atsirado dėl rašybos klaidų. Komplekte yra scenarijus, leidžiantis atsisiųsti esamas C kalbos saugyklas GitHub ir naudoti jas modeliui kurti. Taip pat yra paruoštų modelių, leidžiančių nedelsiant pradėti tikrinti kodą.

Šaltinis: opennet.ru

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