Het bedrijf Intel heeft de eerste significante release van de ControlFlag 1.0 toolkit gepubliceerd, waarmee fouten en anomalieƫn in broncode kunnen worden opgespoord met behulp van een machine learning-systeem dat is getraind op een groot volume bestaande code. In tegenstelling tot traditionele statische analyzers past ControlFlag geen vooraf gedefinieerde regels toe, die moeilijk alle mogelijke varianten kunnen voorspellen, maar baseert het zich op statistieken over het gebruik van verschillende taalkonstrukties in een groot aantal bestaande projecten. De code van ControlFlag is geschreven in C++ en is beschikbaar onder de MIT-licentie.
Het systeem leert door een statistisch model op te bouwen van de bestaande code uit open-source projecten, gepubliceerd op GitHub en soortgelijke openbare repositories. Tijdens de leermodus identificeert het systeem typische sjablonen voor het bouwen van constructies in de code en bouwt het een syntactische boom van de relaties tussen deze sjablonen, die de uitvoeringstroom in het programma weerspiegelt. Uiteindelijk vormt het een referentie-besluitvormingsboom die de ontwikkelervaring van alle geanalyseerde bronbestanden samenbrengt. Voor de te controleren code wordt een vergelijkbaar proces uitgevoerd om de sjablonen te identificeren, die worden vergeleken met de referentie-besluitvormingsboom. Grote afwijkingen van aangrenzende takken wijzen op een anomalie in het gecontroleerde sjabloon.

Als voorbeeld van de mogelijkheden van ControlFlag hebben de ontwikkelaars een analyse uitgevoerd van de broncode van de projecten OpenSSL en cURL:
- In OpenSSL werden de anomalieën "(s1 == NULL) ⧠(s2 == NULL)" en "(s1 == NULL) | (s2 == NULL)" ontdekt, die niet voldeden aan het gebruikelijke sjabloon "(s1 == NULL) || (s2 == NULL)". Ook werden anomalieën aangetroffen in de uitdrukkingen "(-2 == rv)" (de min was een typefout) en "BIO_puts(bp, ":") <= 0)" (in de context van de controle op een succesvolle functie-uitvoering had het "== 0" moeten zijn).
- In cURL werd een door statische analyzers gemiste fout ontdekt bij het gebruik van het structuurelement "s->keepon", dat een numeriek type had, maar werd vergeleken met de booleaanse waarde TRUE.
Een van de kenmerken van de ControlFlag 1.0-versie is de volledige ondersteuning voor standaard sjablonen in de programmeertaal C en de mogelijkheid om anomalieƫn in 'if'-voorwaardelijke uitspraken te identificeren. Bijvoorbeeld, bij de analyse van een codefragment zoals 'if (x = 7) y = x;' zal het systeem vaststellen dat normaal gesproken in de 'if'-operator de constructie 'variabele == getal' wordt gebruikt voor het vergelijken van numerieke waarden, en dat het gebruik van 'variabele = getal' in de 'if'-uitdrukking zeer waarschijnlijk het gevolg is van een typfout. Een script wordt meegeleverd waarmee je bestaande C-code uit GitHub-repositories kunt downloaden en gebruiken voor het bouwen van een model. Ook zijn er al kant-en-klare modellen beschikbaar die je direct kunt gebruiken om de code te controleren.
Bron: opennet.ru
