Intel öppen källkod ControlFlag maskininlärningssystem för att identifiera kodfel

Intel har upptäckt utvecklingar relaterade till ControlFlag-forskningsprojektet som syftar till att skapa ett maskininlärningssystem för att förbättra kodkvaliteten. Verktygslådan som utarbetats av projektet tillåter, baserat på en modell tränad på en stor mängd befintlig kod, att identifiera olika fel och anomalier i källtexter skrivna på högnivåspråk som C/C++. Systemet är lämpligt för att identifiera olika typer av problem i kod, från att identifiera stavfel och felaktiga typkombinationer, till att identifiera saknade NULL-värdeskontroller i pekare och minnesproblem. ControlFlag-koden är skriven i C++ och är öppen källkod under MIT-licensen.

Systemet är självlärande genom att bygga en statistisk modell av den befintliga kodarrayen av öppna projekt publicerade i GitHub och liknande offentliga arkiv. På träningsstadiet bestämmer systemet typiska mönster för att konstruera strukturer i koden och bygger ett syntaktiskt träd av kopplingar mellan dessa mönster, vilket återspeglar flödet av kodexekvering i programmet. Som ett resultat bildas ett referensbeslutsträd som kombinerar utvecklingserfarenheten för alla analyserade källkoder.

Koden som granskas genomgår en liknande process för att identifiera mönster som kontrolleras mot ett referensbeslutsträd. Stora avvikelser med närliggande grenar indikerar förekomsten av en anomali i mönstret som kontrolleras. Systemet låter dig också inte bara identifiera ett fel i mallen, utan också föreslå en korrigering. Till exempel, i OpenSSL-koden identifierades konstruktionen "(s1 == NULL) ∧ (s2 == NULL)", som endast förekom i syntaxträdet 8 gånger, medan den närmaste grenen med värdet "(s1 == NULL) || (s2 == NULL)” inträffade cirka 7 tusen gånger. Systemet upptäckte också en anomali "(s1 == NULL) | (s2 == NULL)” som förekom 32 gånger i trädet.

Intel öppen källkod ControlFlag maskininlärningssystem för att identifiera kodfel

När man analyserar kodfragmentet "if (x = 7) y = x;" Systemet har fastställt att konstruktionen "variabel == tal" vanligtvis används i "om"-operatorn för att jämföra numeriska värden, så det är mycket troligt att indikationen "variabel = nummer" i "om"-uttrycket orsakas av en stavfel. Traditionella statiska analysatorer skulle ha fångat ett sådant fel, men till skillnad från dem tillämpar ControlFlag inte färdiga regler, där det är svårt att tillhandahålla alla möjliga alternativ, utan baseras på statistik över användningen av olika strukturer i ett stort antal av projekt.

Som ett experiment, med ControlFlag i källkoden för verktyget cURL, som ofta nämns som ett exempel på högkvalitativ och testad kod, identifierades ett fel oupptäckt av statiska analysatorer när strukturelementet "s->keepon" användes. som hade en numerisk typ, men jämfördes med det booleska värdet TRUE . I OpenSSL-koden, utöver det ovan nämnda problemet med "(s1 == NULL) ∧ (s2 == NULL)", identifierades även anomalier i uttrycken "(-2 == rv)" (minus var ett stavfel) och "BIO_puts(bp, ":")

Källa: opennet.ru

Lägg en kommentar