Intel malfermis la kodon por maŝinlernado de sistemo ControlFlag por identigi cimojn en la kodo

Intel malkovris evoluojn rilatajn al la esplorprojekto ControlFlag, celanta krei maŝinlernsistemon por plibonigi kodkvaliton. La ilaro preparita de la projekto permesas, surbaze de modelo trejnita sur granda kvanto de ekzistanta kodo, detekti diversajn erarojn kaj anomaliojn en fontotekstoj skribitaj en altnivelaj lingvoj kiel C/C++. La sistemo taŭgas por identigi diversajn problemojn en kodo, de detektado de mistajpoj kaj malĝustaj tipkombinaĵoj, ĝis detektado de maltrafitaj NULL-kontroloj en montriloj kaj memorproblemoj. La ControlFlag-kodo estas skribita en C++ kaj estas malfermfonta sub la MIT-licenco.

La sistemo memlernas konstruante statistikan modelon de la ekzistanta kodaro de malfermitaj projektoj publikigitaj en GitHub kaj similaj publikaj deponejoj. En la lernado, la sistemo determinas tipajn ŝablonojn por konstrui strukturojn en la kodo kaj konstruas sintaksan arbon de ligiloj inter ĉi tiuj ŝablonoj, kiu reflektas la kodan ekzekutfluon en la programo. Kiel rezulto, referenca decida arbo estas formita kiu kombinas la sperton de evoluigado de ĉiuj analizitaj fonttekstoj.

La kodo testata trairas similan procezon de identigado de ŝablonoj, kiuj estas kontrolitaj kontraŭ referenca decida arbo. Grandaj diferencoj kun najbaraj branĉoj indikas la ĉeeston de anomalio en la kontrolata ŝablono. La sistemo ankaŭ permesas ne nur identigi eraron en la ŝablono, sed ankaŭ sugesti korekton. Ekzemple, en la OpenSSL-kodo, oni trovis la konstruon “(s1 == NULL) ∧ (s2 == NULL)”, kiu okazis nur 8 fojojn en la sintaksa arbo, dum la plej proksima branĉo kun la valoro “(s1 == NULL) || (s2 == NULL)" okazis ĉirkaŭ 7 mil fojojn. La sistemo ankaŭ detektis anomalion “(s1 == NULL) | (s2 == NULL)" kiu okazis 32 fojojn en la arbo.

Intel malfermis la kodon por maŝinlernado de sistemo ControlFlag por identigi cimojn en la kodo

Kiam oni analizas la kodan fragmenton "se (x = 7) y = x;" la sistemo determinis, ke la konstruo "variablo == nombro" estas kutime uzata en la deklaro "se" por kompari nombrajn valorojn, tial, kun alta probableco, la indiko "variablo = nombro" en la esprimo "se" estas kaŭzita de tajperaro. Tradiciaj statikaj analiziloj ankaŭ kaptus tian eraron, sed male al ili, ControlFlag ne uzas pretajn regulojn, en kiuj malfacilas antaŭvidi ĉiujn eblajn opciojn, sed baziĝas sur la statistiko de uzado de ĉiaj konstruaĵoj en granda nombro da. projektoj.

Kiel eksperimento, uzante ControlFlag en la fontkodo de la cURL-servaĵo, kiu ofte estas citita kiel ekzemplo de altkvalita kaj kontrolita kodo, eraro nerimarkita de senmovaj analiziloj estis detektita dum uzado de la "s->keepon" strukturelemento, kiu havis nombran tipon, sed estis komparita kun la bulea valoro TRUE . En la OpenSSL-kodo, krom la supra problemo kun "(s1 == NULL) ∧ (s2 == NULL)", estis ankaŭ anomalioj en la esprimoj "(-2 == rv)" (la minuso estis tajperaro). ) kaj "BIO_puts(bp, ":")

fonto: opennet.ru

Aldoni komenton