Intel кодтағы қателерді анықтау үшін ControlFlag машиналық оқыту жүйесінің кодын ашты

Intel код сапасын жақсарту үшін машиналық оқыту жүйесін құруға бағытталған ControlFlag зерттеу жобасына қатысты әзірлемелерді тапты. Жобамен дайындалған құралдар жинағы қолданыстағы кодтың үлкен көлеміне үйретілген модельге негізделген C/C++ сияқты жоғары деңгейлі тілдерде жазылған бастапқы мәтіндердегі әртүрлі қателер мен ауытқуларды анықтауға мүмкіндік береді. Жүйе қателерді және қате түр комбинацияларын анықтаудан бастап көрсеткіштердегі өткізіп алған NULL тексерулерін және жад мәселелерін анықтауға дейін кодтағы әртүрлі ақауларды анықтауға жарамды. ControlFlag коды C++ тілінде жазылған және 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» операторында «айнымалы == сан» конструкциясы қолданылатынын анықтады, сондықтан жоғары ықтималдықпен «егер» өрнегіндегі «айнымалы = сан» көрсеткіші туындайды қате. Дәстүрлі статикалық анализаторлар да мұндай қатені байқайды, бірақ олардан айырмашылығы, ControlFlag барлық ықтимал нұсқаларды болжау қиын болатын дайын ережелерді пайдаланбайды, бірақ көптеген құрылымдарда конструкциялардың барлық түрлерін пайдалану статистикасына негізделген. жобалар.

Эксперимент ретінде жоғары сапалы және тексерілген кодтың мысалы ретінде жиі келтірілетін cURL утилитасының бастапқы кодында ControlFlag көмегімен «s->keepon» құрылым элементін пайдалану кезінде статикалық анализаторлар байқамаған қате анықталды, оның сандық түрі болды, бірақ логикалық мәнімен салыстырылды TRUE . OpenSSL кодында жоғарыда келтірілген "(s1 == NULL) ∧ (s2 == NULL)" мәселесіне қоса, "(-2 == rv)" өрнектерінде де ауытқулар болды (минус қате болды ) және "BIO_puts(bp, ":")

Ақпарат көзі: opennet.ru

пікір қалдыру