Intel адкрыў код сістэмы машыннага навучання ControlFlag для выяўлення памылак у кодзе

Кампанія Intel адкрыла напрацоўкі, звязаныя з даследчым праектам ControlFlag, накіраваным на стварэнне сістэмы машыннага навучання для павышэння якасці кода. Падрыхтаваны праектам інструментар дазваляе на аснове мадэлі, навучанай на вялікім аб'ёме існуючага кода, выяўляць розныя памылкі і анамаліі ў зыходных тэкстах, напісаных на высокаўзроўневых мовах, такіх як C/C++. Сістэма падыходзіць для вызначэння ў кодзе розных відаў праблем, ад вызначэння памылак друку і няправільнага спалучэння тыпаў, да выяўлення прапушчаных праверак значэння NULL ва паказальніках і праблем пры працы з памяццю. Код ControlFlag напісаны на мове З і адкрыты пад ліцэнзіяй MIT.

Сістэма саманавучаецца шляхам пабудовы статыстычнай мадэлі існуючага масіва кода адкрытых праектаў, апублікаваных у GitHub і падобных публічных рэпазітарах. На стадыі навучання сістэма вызначае тыпавыя шаблоны пабудовы канструкцый у кодзе і будуе сінтаксічнае дрэва сувязяў паміж гэтымі шаблонамі, якое адлюстроўвае паток выканання кода ў праграме. У выніку фармуецца эталоннае дрэва прыняцця рашэнняў, якое аб'ядноўвае досвед распрацоўкі ўсіх прааналізаваных зыходных тэкстаў.

Для правяраемага кода выконваецца падобны працэс вызначэння шаблонаў, якія спраўджваюцца з эталонным дрэвам прыняцця рашэнняў. Вялікія разыходжанні з суседнімі галінамі сведчаць аб наяўнасці анамаліі ў правярае шаблоне. Сістэма таксама дазваляе не толькі выявіць памылку ў шаблоне, але і прапанаваць выпраўленне. Напрыклад у кодзе OpenSSL была выяўлена канструкцыя "(s1 == NULL) ∧ (s2 == NULL)", якая сустракалася ў сінтаксічным дрэве ўсяго 8 разоў, у той час як бліжэйшая галінка са значэннем "(s1 == NULL) || (s2 == NULL)» сустракалася каля 7 тысяч разоў. Сістэма таксама выявіла анамалію “(s1 == NULL) | (s2 == NULL)» якая сустракалася ў дрэве 32 разы.

Intel адкрыў код сістэмы машыннага навучання ControlFlag для выяўлення памылак у кодзе

Пры аналізе фрагмента кода "if (x = 7) y = x;" сістэма вызначыла, што звычайна ў аператары "if" для параўнання лікавых значэнняў выкарыстоўваецца канструкцыя "пераменная == лік", таму з вялікай верагоднасцю ўказанне "пераменная = лік" у выразе "if" выклікана памылкай друку. Такую памылку вылавілі б і традыцыйныя статычныя аналізатары, але ў адрозненне ад іх ControlFlag не прымяняе гатовых правіл, у якіх цяжка прадугледзець усе магчымыя варыянты, а адштурхваецца ад статыстыкі выкарыстання разнастайных канструкцый у вялікай колькасці праектаў.

У якасці эксперыменту пры дапамозе ControlFlag у зыходных тэкстах утыліты cURL, якая часта прыводзіцца як прыклад якаснага і праверанага кода, была выяўлена незаўважаная статычнымі аналізатарамі памылка пры выкарыстанні элемента структуры "s->keepon", які меў лікавы тып, але параўноўваўся з булевым значэннем TRUE . У кодзе OpenSSL, акрамя вышэйзгаданай праблемы з "(s1 == NULL) ∧ (s2 == NULL)", таксама былі выяўлены анамаліі ў выразах "(-2 == rv)" (мінус быў памылкай друку) і "BIO_puts(bp, «:»)

Крыніца: opennet.ru

Дадаць каментар