Intel åpen kildekode ControlFlag maskinlæringssystem for å identifisere kodefeil

Intel har oppdaget utviklinger knyttet til ControlFlag-forskningsprosjektet som har som mål å lage et maskinlæringssystem for å forbedre kodekvaliteten. Verktøysettet utarbeidet av prosjektet gjør det mulig, basert på en modell trent på en stor mengde eksisterende kode, å identifisere ulike feil og anomalier i kildetekster skrevet på høynivåspråk som C/C++. Systemet er egnet for å identifisere ulike typer problemer i kode, fra å identifisere skrivefeil og feil typekombinasjoner, til å identifisere manglende NULL-verdisjekker i pekere og minneproblemer. ControlFlag-koden er skrevet i C++ og er åpen kildekode under MIT-lisensen.

Systemet er selvlærende ved å bygge en statistisk modell av den eksisterende kodearrayen av åpne prosjekter publisert i GitHub og lignende offentlige depoter. På treningsstadiet bestemmer systemet typiske mønstre for å konstruere strukturer i koden og bygger et syntaktisk tre av forbindelser mellom disse mønstrene, noe som gjenspeiler flyten av kodeutførelse i programmet. Som et resultat dannes et referansebeslutningstre som kombinerer utviklingserfaringen til alle analyserte kildekoder.

Koden som vurderes gjennomgår en lignende prosess for å identifisere mønstre som kontrolleres mot et referansebeslutningstre. Store avvik med nærliggende grener indikerer tilstedeværelsen av en anomali i mønsteret som kontrolleres. Systemet lar deg også ikke bare identifisere en feil i malen, men også foreslå en korreksjon. For eksempel, i OpenSSL-koden ble konstruksjonen "(s1 == NULL) ∧ (s2 == NULL)" identifisert, som dukket opp i syntakstreet bare 8 ganger, mens den nærmeste grenen med verdien "(s1 == NULL) || (s2 == NULL)” skjedde omtrent 7 tusen ganger. Systemet oppdaget også en anomali "(s1 == NULL) | (s2 == NULL)» som dukket opp 32 ganger i treet.

Intel åpen kildekode ControlFlag maskinlæringssystem for å identifisere kodefeil

Når du analyserer kodefragmentet "hvis (x = 7) y = x;" Systemet har bestemt at "variabel == tall"-konstruksjonen vanligvis brukes i "hvis"-operatoren for å sammenligne numeriske verdier, så det er høyst sannsynlig at indikasjonen "variabel = tall" i "hvis"-uttrykket er forårsaket av en skrivefeil. Tradisjonelle statiske analysatorer ville ha fanget opp en slik feil, men i motsetning til dem bruker ikke ControlFlag ferdige regler, der det er vanskelig å sørge for alle mulige alternativer, men er basert på statistikk over bruken av ulike strukturer i et stort antall av prosjekter.

Som et eksperiment, ved å bruke ControlFlag i kildekoden til cURL-verktøyet, som ofte blir sitert som et eksempel på høykvalitets og testet kode, ble en feil som ikke ble oppdaget av statiske analysatorer identifisert ved bruk av strukturelementet "s->keepon", som hadde en numerisk type, men ble sammenlignet med den boolske verdien TRUE . I OpenSSL-koden, i tillegg til det ovennevnte problemet med "(s1 == NULL) ∧ (s2 == NULL)", ble anomalier også identifisert i uttrykkene "(-2 == rv)" (minus var en skrivefeil) og "BIO_puts(bp, ":")

Kilde: opennet.ru

Legg til en kommentar