Kod səhvlərini müəyyən etmək üçün Intel açıq mənbəli ControlFlag maşın öyrənmə sistemi

Intel, kodun keyfiyyətini yaxşılaşdırmaq üçün maşın öyrənmə sisteminin yaradılmasına yönəlmiş ControlFlag tədqiqat layihəsi ilə bağlı inkişafları kəşf etdi. Layihə tərəfindən hazırlanmış alətlər dəsti, böyük həcmdə mövcud kod əsasında hazırlanmış model əsasında C/C++ kimi yüksək səviyyəli dillərdə yazılmış mənbə mətnlərdəki müxtəlif səhvləri və anomaliyaları müəyyən etməyə imkan verir. Sistem, yazı xətalarını və yanlış tip birləşmələrini müəyyən etməkdən tutmuş göstəricilərdə və yaddaş problemlərində çatışmayan NULL dəyər yoxlamalarını müəyyən etmək üçün koddakı müxtəlif problemləri müəyyən etmək üçün uyğundur. ControlFlag kodu C++ dilində yazılmışdır və MIT lisenziyası altında açıq mənbəlidir.

Sistem GitHub və oxşar ictimai depolarda dərc edilmiş açıq layihələrin mövcud kod massivinin statistik modelini qurmaqla öz-özünə öyrənir. Təlim mərhələsində sistem kodda strukturların qurulması üçün tipik nümunələri müəyyən edir və proqramda kodun icrası axınını əks etdirən bu nümunələr arasında əlaqələrin sintaktik ağacını qurur. Nəticədə, bütün təhlil edilən mənbə kodlarının inkişaf təcrübəsini birləşdirən istinad qərar vermə ağacı formalaşır.

Nəzərdən keçirilən kod istinad qərar ağacı ilə yoxlanılan nümunələri müəyyən etmək üçün oxşar prosesdən keçir. Qonşu filiallarla böyük uyğunsuzluqlar yoxlanılan nümunədə bir anomaliya varlığını göstərir. Sistem həm də şablonda nəinki səhvi müəyyən etməyə, həm də düzəliş təklif etməyə imkan verir. Məsələn, OpenSSL kodunda sintaksis ağacında cəmi 1 dəfə görünən “(s2 == NULL) ∧ (s8 == NULL)” konstruksiyası müəyyən edilmişdir, ən yaxın budaq isə “(s1 ==) dəyərinə malikdir. NULL) || (s2 == NULL)” təqribən 7 min dəfə baş verib. Sistem həmçinin anomaliya aşkarladı “(s1 == NULL) | (s2 == NULL)” ağacda 32 dəfə göründü.

Kod səhvlərini müəyyən etmək üçün Intel açıq mənbəli ControlFlag maşın öyrənmə sistemi

Kod fraqmentini təhlil edərkən “əgər (x = 7) y = x;” Sistem müəyyən edib ki, “dəyişən == ədəd” konstruksiyası adətən “if” operatorunda rəqəmli dəyərləri müqayisə etmək üçün istifadə olunur, buna görə də “if” ifadəsindəki “dəyişən = ədəd” işarəsinin səbəb olması ehtimalı yüksəkdir. yazı səhvi. Ənənəvi statik analizatorlar belə bir səhvə yol verərdilər, lakin onlardan fərqli olaraq ControlFlag bütün mümkün variantları təmin etmək çətin olan hazır qaydaları tətbiq etmir, lakin çox sayda müxtəlif strukturların istifadəsi statistikasına əsaslanır. layihələrdən.

Təcrübə olaraq, tez-tez yüksək keyfiyyətli və sınaqdan keçirilmiş kod nümunəsi kimi göstərilən cURL yardım proqramının mənbə kodunda ControlFlag istifadə edərək, “s->keepon” struktur elementindən istifadə edərkən statik analizatorlar tərəfindən aşkar edilməmiş bir xəta müəyyən edilmişdir. ədədi növü olan, lakin TRUE Boolean dəyəri ilə müqayisə edilmişdir. OpenSSL kodunda yuxarıda qeyd olunan "(s1 == NULL) ∧ (s2 == NULL)" probleminə əlavə olaraq, "(-2 == rv)" ifadələrində də anomaliyalar müəyyən edilmişdir (mənfi yazı xətası) və "BIO_puts(bp, ":")

Mənbə: opennet.ru

Добавить комментарий