Intel hapi kodin e sistemit të mësimit të makinerisë ControlFlag për të identifikuar gabimet në kod

Intel ka zbuluar zhvillime në lidhje me projektin kërkimor ControlFlag që synon krijimin e një sistemi të mësimit të makinerive për të përmirësuar cilësinë e kodit. Paketa e mjeteve e përgatitur nga projekti lejon, bazuar në një model të trajnuar në një sasi të madhe kodi ekzistues, të identifikojë gabime dhe anomali të ndryshme në tekstet burimore të shkruara në gjuhë të nivelit të lartë si C/C++. Sistemi është i përshtatshëm për identifikimin e llojeve të ndryshme të problemeve në kod, nga identifikimi i gabimeve dhe kombinimeve të tipit të pasaktë, deri te identifikimi i kontrolleve të vlerave NULL që mungojnë në treguesit dhe problemet e kujtesës. Kodi ControlFlag është shkruar në C++ dhe është me burim të hapur nën licencën MIT.

Sistemi po mëson vetë duke ndërtuar një model statistikor të grupit ekzistues të kodeve të projekteve me burim të hapur të publikuar në GitHub dhe depo publike të ngjashme. Në fazën e trajnimit, sistemi përcakton modele tipike për ndërtimin e strukturave në kod dhe ndërton një pemë sintaksore të lidhjeve midis këtyre modeleve, duke reflektuar rrjedhën e ekzekutimit të kodit në program. Si rezultat, formohet një pemë referencë vendimmarrëse që kombinon përvojën e zhvillimit të të gjitha kodeve burimore të analizuara.

Kodi në shqyrtim i nënshtrohet një procesi të ngjashëm të identifikimit të modeleve që kontrollohen në një pemë vendimi referimi. Mospërputhjet e mëdha me degët fqinje tregojnë praninë e një anomalie në modelin që kontrollohet. Sistemi gjithashtu ju lejon jo vetëm të identifikoni një gabim në shabllon, por edhe të sugjeroni një korrigjim. Për shembull, në kodin OpenSSL, u identifikua konstruksioni "(s1 == NULL) ∧ (s2 == NULL)", i cili u shfaq në pemën e sintaksës vetëm 8 herë, ndërsa dega më e afërt me vlerën "(s1 == NULL) || (s2 == NULL)” ka ndodhur rreth 7 mijë herë. Sistemi zbuloi gjithashtu një anomali “(s1 == NULL) | (s2 == NULL)” e cila u shfaq 32 herë në pemë.

Intel hapi kodin e sistemit të mësimit të makinerisë ControlFlag për të identifikuar gabimet në kod

Kur analizoni fragmentin e kodit "nëse (x = 7) y = x;" Sistemi ka përcaktuar që deklarata "nëse" zakonisht përdor konstruksionin "variabla == numër" për të krahasuar vlerat numerike, kështu që ka shumë të ngjarë që "variabla = numër" në shprehjen "nëse" të shkaktohet nga një gabim shtypi. Analizuesit statikë tradicionalë do të kishin kapur një gabim të tillë, por ndryshe nga ata, ControlFlag nuk zbaton rregulla të gatshme, në të cilat është e vështirë të sigurohen të gjitha opsionet e mundshme, por bazohet në statistikat e përdorimit të strukturave të ndryshme në një numër të madh. të projekteve.

Si një eksperiment, duke përdorur ControlFlag në kodin burimor të programit cURL, i cili shpesh përmendet si një shembull i kodit me cilësi të lartë dhe të testuar, u identifikua një gabim i pazbuluar nga analizuesit statikë gjatë përdorimit të elementit të strukturës "s->keepon". i cili kishte një tip numerik, por u krahasua me vlerën Boolean TRUE . Në kodin OpenSSL, përveç problemit të lartpërmendur me "(s1 == NULL) ∧ (s2 == NULL)", u identifikuan anomali edhe në shprehjet "(-2 == rv)" (minus ishte një gabim shtypi) dhe "BIO_puts(bp, ":")

Burimi: opennet.ru

Shto një koment