Intelek ControlFlag ikaskuntza automatikoaren sistemaren kodea ireki zuen kodean akatsak identifikatzeko

Intel-ek ControlFlag ikerketa-proiektuarekin lotutako garapenak aurkitu ditu, kodearen kalitatea hobetzeko makina ikasteko sistema bat sortzea helburu duena. Proiektuak prestatutako tresna-tresnak aukera ematen du, lehendik dagoen kode kopuru handi batean trebatutako eredu batean oinarrituta, hainbat akats eta anomalia detektatzeko goi-mailako lengoaietan idatzitako iturburu-testuetan, hala nola C/C++. Sistema egokia da kodean hainbat arazo mota identifikatzeko, akatsak eta mota konbinazio okerrak hautemateko, erakusleetan galdutako NULL egiaztapenak eta memoria-arazoak detektatzeko. ControlFlag kodea C++-n idatzita dago eta kode irekia da MIT lizentziapean.

Sistema autoikaskuntzan ari da GitHub-en eta antzeko biltegi publikoetan argitaratutako proiektu irekien dagoen kode-matrizearen eredu estatistiko bat eraikiz. Ikaskuntza-etapan, sistemak kodean egiturak eraikitzeko eredu tipikoak zehazten ditu eta eredu horien arteko loturen zuhaitz sintaktiko bat eraikitzen du, programan kodearen exekuzio-fluxua islatzen duena. Ondorioz, aztertutako iturri-testu guztiak garatzeko esperientzia batzen duen erreferentziazko erabaki-zuhaitz bat eratzen da.

Probatzen ari den kodeak erreferentziako erabaki-zuhaitz batekin egiaztatzen diren ereduak identifikatzeko antzeko prozesu bat egiten du. Alboko sukurtsalekiko desadostasun handiek egiaztatzen ari den txantiloian anomalia bat dagoela adierazten dute. Sistemak txantiloian errore bat identifikatzea ez ezik, zuzenketa bat iradokitzea ere ahalbidetzen du. Adibidez, OpenSSL kodean, β€œ(s1 == NULL) ∧ (s2 == NULL)” eraikuntza aurkitu zen, sintaxiaren zuhaitzean 8 aldiz bakarrik gertatu zena, β€œ(s1 == balioa duen adarrik hurbilena den bitartean. NULL) || (s2 == NULL)" 7 mila aldiz inguru gertatu da. Sistemak anomalia bat ere detektatu du β€œ(s1 == NULL) | (s2 == NULL)" zuhaitzean 32 aldiz gertatu dena.

Intelek ControlFlag ikaskuntza automatikoaren sistemaren kodea ireki zuen kodean akatsak identifikatzeko

Kode zatia analizatzean "if (x = 7) y = x;" sistemak zehaztu du "aldagaia == zenbakia" eraikuntza normalean "baldin" adierazpenean erabiltzen dela zenbakizko balioak alderatzeko, beraz, probabilitate handiarekin, "baldin" adierazpeneko "aldagaia = zenbakia" adierazlea da. akats bat. Analizatzaile estatiko tradizionalek ere akats hori harrapatuko lukete, baina haiek ez bezala, ControlFlag-ek ez du prest egindako araurik erabiltzen, zeinetan aukera posible guztiak aurreikustea zaila den, baizik eta era guztietako konstruktu ugari erabiltzearen estatistiketan oinarritzen da. proiektuak.

Esperimentu gisa, cURL utilitatearen iturburu-kodean ControlFlag erabiliz, kalitate handiko eta egiaztatutako kodearen adibide gisa aipatu ohi dena, analizatzaile estatikoek ohartu gabeko errore bat hauteman zen "s->keepon" egitura elementua erabiltzean, zenbakizko mota zuena, baina TRUE balio boolearrarekin alderatu zen. OpenSSL kodean, goiko arazoaz gain "(s1 == NULL) ∧ (s2 == NULL)", "(-2 == rv)" esamoldeetan ere anomaliak zeuden (minus akatsa zen. ) eta "BIO_puts(bp, ":")

Iturria: opennet.ru

Gehitu iruzkin berria