Intel heeft onderzoek naar het ControlFlag-project onthuld, dat gericht is op de ontwikkeling van een machine learning-systeem voor het verbeteren van de codekwaliteit. De door het project ontwikkelde tools maken het mogelijk om op basis van een model dat is getraind op een grote hoeveelheid bestaande code verschillende fouten en anomalieën in de bronteksten, geschreven in hoog-niveau programmeertalen zoals C/C++, te identificeren. Het systeem is geschikt voor het opsporen van verschillende soorten problemen in de code, van het identificeren van typfouten en onjuiste typecombinaties tot het opsporen van gemiste NULL-waardecontroles in pointers en geheugenproblemen. De ControlFlag-code is geschreven in C++ en is open source onder de MIT-licentie.
Het systeem leert zelf door het opbouwen van een statistisch model van de bestaande codebase van open source-projecten, gepubliceerd op GitHub en soortgelijke openbare repositories. In de leerfase identificeert het systeem typische patronen in de codeconstructies en bouwt het een syntactische boom van de verbindingen tussen deze patronen, die het uitvoeringspad van de code in het programma weerspiegelt. Uiteindelijk wordt er een referentiebeslissingsboom gevormd die de ontwikkelingservaring van alle geanalyseerde bronteksten verenigt.
Voor de gecontroleerde code wordt een soortgelijk proces uitgevoerd om patronen te identificeren die worden vergeleken met de referentiebeslissingsboom. Grote afwijkingen van naburige takken wijzen op een anomalie in het gecontroleerde patroon. Het systeem stelt ook in staat om niet alleen een fout in het patroon te identificeren, maar ook een correctie voor te stellen. Bijvoorbeeld, in de OpenSSL-code bleek de constructie "(s1 == NULL) ∧ (s2 == NULL)" slechts 8 keer in de syntactische boom voor te komen, terwijl de dichtstbijzijnde tak met de waarde "(s1 == NULL) || (s2 == NULL)" ongeveer 7000 keer voorkwam. Het systeem identificeerde ook de anomalie "(s1 == NULL) | (s2 == NULL)" die 32 keer in de boom voorkwam.

Bij de analyse van de codefragment «if (x = 7) y = x;» heeft het systeem vastgesteld dat normaal gesproken in de «if»-operator voor de vergelijking van numerieke waarden de constructie «variabele == getal» wordt gebruikt. Daarom is de kans groot dat de vermelding «variabele = getal» in de «if»-expressie het gevolg is van een typfout. Zo'n fout zou ook door traditionele statische analysetools zijn opgemerkt, maar in tegenstelling tot hen past ControlFlag geen kant-en-klare regels toe waarin het moeilijk is om alle mogelijke varianten te voorzien, maar baseert het zich op statistieken van het gebruik van verschillende constructies in een groot aantal projecten.
Als experiment zijn met behulp van ControlFlag in de bronbestanden van de cURL-tool, die vaak wordt genoemd als een voorbeeld van kwaliteitscode, ongezien fouten ontdekt door statische analysetools bij het gebruik van het structuurelement «s->keepon», dat een numeriek type had maar werd vergeleken met de booleaanse waarde TRUE. In de code van OpenSSL zijn naast het eerder genoemde probleem met «(s1 == NULL) ∧ (s2 == NULL)» ook anomalieën gevonden in de uitdrukkingen «(-2 == rv)» (de min was een typfout) en «BIO_puts(bp, «:»)»
Bron: opennet.ru
