Intel opende de ControlFlag machine learning-systeemcode om bugs in de code te identificeren

Intel heeft ontwikkelingen ontdekt die verband houden met het ControlFlag-onderzoeksproject gericht op het creëren van een machine learning-systeem om de codekwaliteit te verbeteren. De toolkit die door het project is opgesteld, maakt het mogelijk om, op basis van een model dat is getraind op een grote hoeveelheid bestaande code, verschillende fouten en afwijkingen te identificeren in bronteksten die zijn geschreven in talen op hoog niveau, zoals C/C++. Het systeem is geschikt voor het identificeren van verschillende soorten problemen in code, van het identificeren van typefouten en onjuiste typecombinaties tot het identificeren van ontbrekende NULL-waardecontroles in pointers en geheugenproblemen. De ControlFlag-code is geschreven in C++ en is open source onder de MIT-licentie.

Het systeem is zelflerend door een statistisch model te bouwen van de bestaande codereeks van open projecten die zijn gepubliceerd in GitHub en soortgelijke openbare repository's. In de trainingsfase bepaalt het systeem typische patronen voor het construeren van structuren in de code en bouwt het een syntactische boom van verbindingen tussen deze patronen op, die de stroom van code-uitvoering in het programma weerspiegelt. Als gevolg hiervan wordt een referentiebesluitvormingsboom gevormd die de ontwikkelingservaring van alle geanalyseerde broncodes combineert.

De code die wordt beoordeeld, ondergaat een soortgelijk proces waarbij patronen worden geïdentificeerd die worden gecontroleerd aan de hand van een referentiebeslissingsboom. Grote verschillen met aangrenzende takken duiden op de aanwezigheid van een anomalie in het patroon dat wordt gecontroleerd. Met het systeem kunt u niet alleen een fout in de sjabloon identificeren, maar ook een correctie voorstellen. In de OpenSSL-code werd bijvoorbeeld de constructie “(s1 == NULL) ∧ (s2 == NULL)” geïdentificeerd, die slechts 8 keer in de syntaxisboom verscheen, terwijl de dichtstbijzijnde tak met de waarde “(s1 == NULL) || (s2 == NULL)” kwam ongeveer 7 keer voor. Het systeem heeft ook een anomalie gedetecteerd “(s1 == NULL) | (s2 == NULL)” die 32 keer in de boom voorkomt.

Intel opende de ControlFlag machine learning-systeemcode om bugs in de code te identificeren

Bij het analyseren van het codefragment “if (x = 7) y = x;” Het systeem heeft vastgesteld dat de constructie ‘variabele == getal’ meestal wordt gebruikt in de ‘als’-operator om numerieke waarden te vergelijken, dus het is zeer waarschijnlijk dat de aanduiding ‘variabele == getal’ in de ‘als’-expressie wordt veroorzaakt door een typfout. Traditionele statische analysatoren zouden een dergelijke fout hebben opgemerkt, maar in tegenstelling tot hen past ControlFlag geen kant-en-klare regels toe, waarin het moeilijk is om in alle mogelijke opties te voorzien, maar is het gebaseerd op statistieken van het gebruik van verschillende structuren in een groot aantal van projecten.

Bij wijze van experiment werd met behulp van ControlFlag in de broncode van het hulpprogramma cURL, dat vaak wordt aangehaald als een voorbeeld van hoogwaardige en geteste code, een fout geïdentificeerd die niet door statische analysatoren werd gedetecteerd bij gebruik van het structuurelement “s->keepon”, die een numeriek type had, maar werd vergeleken met de Booleaanse waarde TRUE . In de OpenSSL-code werden, naast het bovengenoemde probleem met "(s1 == NULL) ∧ (s2 == NULL)", ook afwijkingen geïdentificeerd in de uitdrukkingen "(-2 == rv)" (de min was een typefout) en "BIO_puts(bp, ":")

Bron: opennet.ru

Voeg een reactie