Выпуск ControlFlag 1.0, прылады для выяўлення памылак у кодзе на мове Сі

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

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

Выпуск ControlFlag 1.0, прылады для выяўлення памылак у кодзе на мове Сі

У якасці прыкладу магчымасцяў ControlFlag распрацоўшчыкамі быў праведзены аналіз зыходных тэкстаў праектаў OpenSSL і cURL:

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

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

Крыніца: opennet.ru

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