Intel koddagi xatolarni aniqlash uchun ControlFlag mashina o'rganish tizimi kodini ochdi

Intel kod sifatini yaxshilash uchun mashinani o'rganish tizimini yaratishga qaratilgan ControlFlag tadqiqot loyihasi bilan bog'liq ishlanmalarni topdi. Loyiha tomonidan tayyorlangan asboblar to'plami katta hajmdagi mavjud kodlar asosida o'qitilgan modelga asoslanib, C/C++ kabi yuqori darajadagi tillarda yozilgan manba matnlardagi turli xato va anomaliyalarni aniqlash imkonini beradi. Tizim koddagi turli xil muammolarni aniqlash uchun javob beradi, matbaa xatolari va noto'g'ri turdagi kombinatsiyalarni aniqlashdan tortib, ko'rsatkichlar va xotira muammolarida o'tkazib yuborilgan NULL tekshiruvlarini aniqlashgacha. ControlFlag kodi C++ tilida yozilgan va MIT litsenziyasi ostida ochiq manba hisoblanadi.

Tizim GitHub va shunga o'xshash ommaviy omborlarda chop etilgan ochiq loyihalarning mavjud kodlari majmuasining statistik modelini yaratish orqali o'z-o'zini o'rganadi. O'rganish bosqichida tizim koddagi tuzilmalarni qurish uchun tipik naqshlarni aniqlaydi va bu naqshlar orasidagi bog'lanishlarning sintaktik daraxtini quradi, bu dasturda kodni bajarish oqimini aks ettiradi. Natijada, tahlil qilingan barcha manba matnlarini ishlab chiqish tajribasini birlashtirgan ma'lumotnoma qarorlar daraxti shakllanadi.

Sinovdan o'tkazilayotgan kod mos yozuvlar qarorlar daraxtiga nisbatan tekshiriladigan naqshlarni aniqlashning o'xshash jarayonidan o'tadi. Qo'shni filiallar bilan katta kelishmovchiliklar tekshirilayotgan shablonda anomaliya mavjudligini ko'rsatadi. Tizim nafaqat shablondagi xatolikni aniqlashga, balki tuzatishni taklif qilishga ham imkon beradi. Masalan, OpenSSL kodida "(s1 == NULL) ∧ (s2 == NULL)" konstruktsiyasi topildi, bu sintaksis daraxtida atigi 8 marta sodir bo'ldi, eng yaqin filial esa "(s1 ==) qiymatiga ega. NULL) || (s2 == NULL)" taxminan 7 ming marta sodir bo'lgan. Tizim shuningdek, anomaliyani aniqladi β€œ(s1 == NULL) | (s2 == NULL)" daraxtda 32 marta sodir bo'lgan.

Intel koddagi xatolarni aniqlash uchun ControlFlag mashina o'rganish tizimi kodini ochdi

Kod parchasini tahlil qilishda "agar (x = 7) y = x;" tizim "o'zgaruvchi == raqam" konstruktsiyasi odatda raqamli qiymatlarni solishtirish uchun "if" iborasida qo'llanilishini aniqladi, shuning uchun yuqori ehtimollik bilan "agar" ifodasidagi "o'zgaruvchi = raqam" ko'rsatkichi sabab bo'ladi. yozuv xatosi. An'anaviy statik analizatorlar bunday xatolikka yo'l qo'yishadi, ammo ulardan farqli o'laroq, ControlFlag barcha mumkin bo'lgan variantlarni oldindan ko'rish qiyin bo'lgan tayyor qoidalardan foydalanmaydi, lekin ko'plab loyihalarda barcha turdagi konstruktsiyalardan foydalanish statistikasiga asoslanadi. .

Tajriba sifatida, ko'pincha yuqori sifatli va tasdiqlangan kod namunasi sifatida keltirilgan cURL yordam dasturining manba kodida ControlFlag-dan foydalangan holda, "s->keepon" struktura elementidan foydalanishda statik analizatorlar tomonidan sezilmaydigan xatolik aniqlandi, Raqamli turga ega bo'lgan, lekin TRUE mantiqiy qiymati bilan taqqoslangan. OpenSSL kodida yuqorida aytib o'tilgan "(s1 == NULL) ∧ (s2 == NULL)" bilan bog'liq muammoga qo'shimcha ravishda, "(-2 == rv)" iboralarida ham anomaliyalar mavjud edi (minus xato edi. ) va "BIO_puts(bp, ":")

Manba: opennet.ru

a Izoh qo'shish