Intel har åbnet deres arbejde relateret til forskningsprojektet ControlFlag, som sigter mod at skabe et maskinlæringssystem til at forbedre kodekvaliteten. Det værktøj, der er udviklet af projektet, gør det muligt at identificere forskellige fejl og anomalier i kildekoden, skrevet i højniveau programmeringssprog som C/C++, baseret på en model, der er trænet på en stor mængde eksisterende kode. Systemet er velegnet til at identificere forskellige typer problemer i koden, fra at finde typografiske fejl og forkerte typekombinationer til at opdage manglende NULL-værdi kontrol i pegepinde og problemer med hukommelse. ControlFlag-koden er skrevet i C++ og frigivet under MIT-licensen.
Systemet lærer selv ved at opbygge en statistisk model af det eksisterende kodeudsnit fra åbne projekter, der er offentliggjort på GitHub og lignende offentlige repositoryer. Under træningsfasen identificerer systemet typiske mønstre i kodens konstruktioner og bygger et syntaktisk træ, der viser forbindelserne mellem disse mønstre og afspejler kodens udførelsesflow i programmet. Som resultat dannes et referencebeslutningstræ, der integrerer udviklingserfaringen fra alle analyserede kildefiler.
For den kontrollerede kode udføres en tilsvarende proces for at identificere mønstre, som derefter sammenlignes med det referencebeslutningstræ. Store afvigelser fra nærliggende grene indikerer eksistensen af en anomali i det kontrollerede mønster. Systemet tillader også ikke kun at opdage en fejl i mønsteret, men også at foreslå en løsning. For eksempel blev der i OpenSSL-koden opdaget konstruktionen «(s1 == NULL) ∧ (s2 == NULL)», som optrådte i det syntaktiske træ kun 8 gange, mens den nærmeste gren med værdien «(s1 == NULL) || (s2 == NULL)» optrådte omkring 7.000 gange. Systemet opdagede også en anomali «(s1 == NULL) | (s2 == NULL)», som optrådte i træet 32 gange.

Ved analysen af kodefragmentet «if (x = 7) y = x;» har systemet identificeret, at der normalt anvendes konstruktionen «variabel == tal» til at sammenligne numeriske værdier i «if»-operatoren, derfor er det med stor sandsynlighed en tastefejl, at der anvendes «variabel = tal» i udtrykket «if». En sådan fejl ville også blive fanget af traditionelle statiske analyseværktøjer, men i modsætning til dem bruger ControlFlag ikke faste regler, hvor det er svært at tage højde for alle mulige scenarier, men baserer sig på statistik over brugen af forskellige konstruktioner i et stort antal projekter.
Som et eksperiment blev der med ControlFlag identificeret en overset fejl i koden for værktøjet cURL, som ofte nævnes som et eksempel på kvalitets- og testet kode, ved brugen af strukturelementet «s->keepon», der havde en numerisk datatype, men blev sammenlignet med den booleske værdi TRUE. I OpenSSL-koden blev der, foruden det førnævnte problem med «(s1 == NULL) ∧ (s2 == NULL)», også identificeret anomalier i udtrykene «(-2 == rv)» (minus var en tastefejl) og «BIO_puts(bp, «:»)»
Kilde: opennet.ru
