Intel har slÀppt sina forskningsinsatser kopplade till projektet ControlFlag, som syftar till att skapa ett maskininlÀrningssystem för att förbÀttra kodkvaliteten. Det verktyg som tagits fram av projektet gör det möjligt att identifiera olika fel och avvikelser i kÀllkoden, skriven pÄ högnivÄsprÄk som C/C++, baserat pÄ en modell som har trÀnats pÄ en stor mÀngd befintlig kod. Systemet Àr lÀmpligt för att identifiera olika typer av problem i koden, frÄn att upptÀcka stavfel och felaktiga typkombinationer till att identifiera saknade NULL-vÀrdeskontroller i pekare och problem med minneshantering. ControlFlag-koden Àr skriven i C++ och Àr öppen under MIT-licens.
Systemet lÀr sig sjÀlv genom att bygga en statistisk modell av den befintliga koden i öppna projekt, som publicerats pÄ GitHub och liknande offentliga arkiv. Under inlÀrningsfasen identifierar systemet typiska mönster i kodstrukturer och bygger ett syntaxtrÀd över sambanden mellan dessa mönster, vilket Äterspeglar flödet av kodens exekvering i programmet. Resultatet blir ett referensbeslutstrÀd som sammanfogar utvecklingserfarenheten frÄn alla analyserade kÀlltexter.
För den kontrollerade koden utförs en liknande process för mönsteridentifiering, dÀr dessa jÀmförs med referensbeslutstrÀdet. Stora avvikelser frÄn nÀrliggande grenar indikerar en anomaly i det kontrollerade mönstret. Systemet kan inte bara identifiera fel i mönstret utan ocksÄ föreslÄ en korrigering. Till exempel, i OpenSSL-koden identifierades konstruktionen "(s1 == NULL) ⧠(s2 == NULL)", som förekom i syntaxtrÀdet endast 8 gÄnger, medan nÀrmaste gren med vÀrdet "(s1 == NULL) || (s2 == NULL)" förekom cirka 7 000 gÄnger. Systemet identifierade ocksÄ anomalin "(s1 == NULL) | (s2 == NULL)", som förekom i trÀdet 32 gÄnger.

Vid analys av kodfragmentet «if (x = 7) y = x;» identifierade systemet att det vanligtvis i «if»-operatorn anvÀnds konstruktionen «variabel == nummer» för att jÀmföra numeriska vÀrden, sÄ det Àr mycket troligt att angivelsen «variabel = nummer» i uttrycket «if» beror pÄ ett skrivfel. En sÄdan felaktighet skulle Àven ha upptÀckts av traditionella statiska analysatorer, men till skillnad frÄn dem tillÀmpar ControlFlag inte fÀrdiga regler, dÀr det Àr svÄrt att förutse alla möjliga variationer, utan baserar sig pÄ statistik över anvÀndningen av olika konstruktioner i ett stort antal projekt.
Som ett experiment, med hjÀlp av ControlFlag, upptÀcktes en obemÀrkt fel som statiska analysatorer missade i kÀllkoden till verktyget cURL, som ofta anvÀnds som exempel pÄ kvalitetskod. Problemet var nÀr ett strukturelement «s->keepon» med numerisk typ jÀmfördes med det booleska vÀrdet TRUE. I OpenSSL-koden, förutom det ovan nÀmnda problemet med «(s1 == NULL) ⧠(s2 == NULL)», upptÀcktes Àven avvikelser i uttrycken «(-2 == rv)» (minustecknet var ett skrivfel) och «BIO_puts(bp, «:»)»
KĂ€lla: opennet.ru
