Az Intel megnyitotta a ControlFlag gépi tanulási rendszer kódját, hogy azonosítsa a kódban lévő hibákat

Az Intel a ControlFlag kutatási projekttel kapcsolatos fejlesztéseket fedezett fel, amelyek célja egy gépi tanulási rendszer létrehozása a kódminőség javítása érdekében. A projekt által készített eszköztár nagy mennyiségű meglévő kódra betanított modell alapján lehetővé teszi a magas szintű nyelveken, például C/C++-ban írt forrásszövegek különböző hibáinak és anomáliáinak azonosítását. A rendszer alkalmas különféle kódproblémák azonosítására, az elírási hibáktól és a hibás típuskombinációktól a mutatók hiányzó NULL érték ellenőrzéséig és a memóriaproblémákig. A ControlFlag kód C++ nyelven íródott, és nyílt forráskódú az MIT licenc alatt.

A rendszer önállóan tanul azáltal, hogy statisztikai modellt készít a GitHubon és hasonló nyilvános tárhelyeken közzétett nyílt projektek meglévő kódtömbjéről. A betanítási szakaszban a rendszer tipikus mintákat határoz meg a kódban lévő struktúrák felépítéséhez, és szintaktikai fát épít fel e minták között, amely tükrözi a programban a kódvégrehajtás folyamatát. Ennek eredményeként létrejön egy referencia-döntési fa, amely egyesíti az összes elemzett forráskód fejlesztési tapasztalatait.

A vizsgált kód hasonló folyamaton megy keresztül a minták azonosítására, amelyeket a referencia-döntési fával összehasonlítanak. A szomszédos ágaktól való nagy eltérések anomáliát jeleznek az ellenőrzött mintában. A rendszer azt is lehetővé teszi, hogy ne csak a sablon hibáját azonosítsa, hanem javaslatot is tegyen a javításra. Például az OpenSSL kódban a „(s1 == NULL) ∧ (s2 == NULL)” konstrukciót azonosították, amely csak 8-szor jelent meg a szintaxisfában, míg a legközelebbi ág „(s1 == NULL) || (s2 == NULL)” körülbelül 7 ezer alkalommal fordult elő. A rendszer anomáliát is észlelt „(s1 == NULL) | (s2 == NULL)”, amely 32-szer jelent meg a fában.

Az Intel megnyitotta a ControlFlag gépi tanulási rendszer kódját, hogy azonosítsa a kódban lévő hibákat

Az „if (x = 7) y = x;” kódrészlet elemzésekor A rendszer megállapította, hogy a „változó == szám” konstrukciót általában az „if” operátorban használják a numerikus értékek összehasonlítására, így nagy valószínűséggel a „változó = szám” jelzést az „if” kifejezésben egy gépelési hiba. A hagyományos statikus analizátorok elkaptak volna egy ilyen hibát, de velük ellentétben a ControlFlag nem alkalmaz kész szabályokat, amelyekben nehéz minden lehetséges opciót megadni, hanem a különféle struktúrák nagyszámú használatának statisztikáin alapul. projektek.

Kísérletként a ControlFlag segítségével a cURL segédprogram forráskódjában, amelyet gyakran emlegetnek a jó minőségű és tesztelt kód példájaként, az „s->keepon” szerkezeti elem használatakor statikus elemzők által nem észlelt hibát azonosítottak. amelynek numerikus típusa volt, de összehasonlították a TRUE logikai értékkel. Az OpenSSL kódban a fent említett "(s1 == NULL) ∧ (s2 == NULL)" probléma mellett a "(-2 == rv)" kifejezésekben is anomáliákat azonosítottak (a mínusz elírás) és "BIO_puts(bp, ":")

Forrás: opennet.ru

Hozzászólás