Intel åbnede ControlFlag maskinlæringssystemkoden for at identificere fejl i koden

Intel har opdaget udviklinger relateret til ControlFlag-forskningsprojektet, der sigter mod at skabe et maskinlæringssystem for at forbedre kodekvaliteten. Værktøjssættet, der er udarbejdet af projektet, gør det muligt, baseret på en model trænet på en stor mængde eksisterende kode, at opdage forskellige fejl og anomalier i kildetekster skrevet på højt niveau sprog som C/C++. Systemet er velegnet til at identificere forskellige slags problemer i kode, lige fra detektering af tastefejl og forkerte typekombinationer, til at opdage ubesvarede NULL-tjek i pointere og hukommelsesproblemer. ControlFlag-koden er skrevet i C++ og er open source under MIT-licensen.

Systemet er selvlærende ved at bygge en statistisk model af det eksisterende kodearrangement af åbne projekter udgivet i GitHub og lignende offentlige repositories. På indlæringsstadiet bestemmer systemet typiske mønstre for at konstruere strukturer i koden og opbygger et syntaktisk træ af forbindelser mellem disse mønstre, som afspejler kodeeksekveringsflowet i programmet. Som følge heraf dannes et referencebeslutningstræ, der kombinerer erfaringen med at udvikle alle de analyserede kildetekster.

Koden, der testes, gennemgår en lignende proces med at identificere mønstre, der kontrolleres mod et referencebeslutningstræ. Store uoverensstemmelser med tilstødende grene indikerer tilstedeværelsen af ​​en anomali i skabelonen, der kontrolleres. Systemet giver også mulighed for ikke kun at identificere en fejl i skabelonen, men også at foreslå en rettelse. For eksempel blev der i OpenSSL-koden fundet konstruktionen "(s1 == NULL) ∧ (s2 == NULL)", som kun forekom 8 gange i syntakstræet, mens den nærmeste gren med værdien "(s1 == NULL) || (s2 == NULL)" forekom omkring 7 tusinde gange. Systemet registrerede også en anomali "(s1 == NULL) | (s2 == NULL)", som forekom 32 gange i træet.

Intel åbnede ControlFlag maskinlæringssystemkoden for at identificere fejl i koden

Ved parsing af kodestykket "if (x = 7) y = x;" systemet har fastslået, at "variabel == tal"-konstruktionen normalt bruges i "hvis"-sætningen til at sammenligne numeriske værdier, derfor er indikationen "variabel = tal" i "hvis"-udtrykket med stor sandsynlighed forårsaget af en tastefejl. Traditionelle statiske analysatorer ville også fange en sådan fejl, men i modsætning til dem bruger ControlFlag ikke færdige regler, hvor det er svært at forudse alle mulige muligheder, men er baseret på statistikken over at bruge alle slags konstruktioner i et stort antal projekter.

Som et eksperiment, ved at bruge ControlFlag i kildekoden til cURL-værktøjet, som ofte nævnes som et eksempel på højkvalitets og verificeret kode, blev der opdaget en fejl, der ikke blev bemærket af statiske analysatorer, ved brug af "s->keepon" strukturelementet, som havde en numerisk type, men blev sammenlignet med den boolske værdi TRUE . I OpenSSL-koden var der udover det førnævnte problem med "(s1 == NULL) ∧ (s2 == NULL)", også anomalier i udtrykkene "(-2 == rv)" (minus var en tastefejl ) og "BIO_puts(bp, ":")

Kilde: opennet.ru

Tilføj en kommentar