Intel het die ControlFlag-masjienleerstelselkode oopgemaak om foute in die kode te identifiseer

Intel het ontwikkelings ontdek wat verband hou met die ControlFlag-navorsingsprojek, wat daarop gemik is om 'n masjienleerstelsel te skep om kodekwaliteit te verbeter. Die gereedskapstel wat deur die projek voorberei is, maak dit moontlik om, gebaseer op 'n model wat op 'n groot hoeveelheid bestaande kode opgelei is, verskeie foute en anomalieë op te spoor in brontekste wat in hoëvlaktale soos C/C++ geskryf is. Die stelsel is geskik vir die identifisering van verskeie soorte probleme in kode, van die opsporing van tikfoute en verkeerde tipe kombinasies, tot die opsporing van gemiste NULL-tjeks in wysers en geheueprobleme. Die ControlFlag-kode is in C++ geskryf en is oopbron onder die MIT-lisensie.

Die stelsel is selflerend deur 'n statistiese model te bou van die bestaande kodereeks oop projekte wat in GitHub en soortgelyke openbare bewaarplekke gepubliseer is. Op die leerstadium bepaal die stelsel tipiese patrone vir die konstruksie van strukture in die kode en bou 'n sintaktiese boom van skakels tussen hierdie patrone, wat die kode-uitvoeringsvloei in die program weerspieël. As gevolg hiervan word 'n verwysingsbesluitboom gevorm wat die ervaring van die ontwikkeling van al die geanaliseerde brontekste kombineer.

Die kode wat getoets word, gaan deur 'n soortgelyke proses om patrone te identifiseer wat teen 'n verwysingsbesluitboom gekontroleer word. Groot verskille met naburige takke dui op die teenwoordigheid van 'n anomalie in die sjabloon wat nagegaan word. Die stelsel laat ook toe om nie net 'n fout in die sjabloon te identifiseer nie, maar ook om 'n regstelling voor te stel. Byvoorbeeld, in die OpenSSL-kode is die konstruksie "(s1 == NULL) ∧ (s2 == NULL)" gevind, wat slegs 8 keer in die sintaksboom voorgekom het, terwyl die naaste tak met die waarde "(s1 == NULL) || (s2 == NULL)" het ongeveer 7 duisend keer voorgekom. Die stelsel het ook 'n anomalie “(s1 == NULL) | (s2 == NULL)" wat 32 keer in die boom voorgekom het.

Intel het die ControlFlag-masjienleerstelselkode oopgemaak om foute in die kode te identifiseer

Wanneer die kodebrokkie "if (x = 7) y = x;" ontleed word die stelsel het vasgestel dat die "veranderlike == getal"-konstruksie gewoonlik in die "as"-stelling gebruik word om numeriese waardes te vergelyk, daarom, met 'n hoë waarskynlikheid, word die aanduiding "veranderlike = getal" in die "as"-uitdrukking veroorsaak deur 'n tikfout. Tradisionele statiese ontleders sal ook so 'n fout opvang, maar anders as hulle, gebruik ControlFlag nie klaargemaakte reëls waarin dit moeilik is om alle moontlike opsies te voorsien nie, maar is gebaseer op die statistieke van die gebruik van allerhande konstrukte in 'n groot aantal projekte.

As 'n eksperiment, met behulp van ControlFlag in die bronkode van die cURL-hulpprogram, wat dikwels aangehaal word as 'n voorbeeld van hoë kwaliteit en geverifieerde kode, is 'n fout opgemerk wat nie deur statiese ontleders opgemerk is wanneer die "s->keepon"-struktuurelement gebruik word, wat 'n numeriese tipe gehad het, maar met die Boolese waarde WAAR vergelyk is. In die OpenSSL-kode, benewens die bogenoemde probleem met "(s1 == NULL) ∧ (s2 == NULL)", was daar ook anomalieë in die uitdrukkings "(-2 == rv)" (die minus was 'n tikfout ) en "BIO_puts(bp, ":")

Bron: opennet.ru

Voeg 'n opmerking