Intel şirkəti Kontrolluq layihəsi ilə əlaqəli tədqiqat işlərini təqdim etdi; bu layihənin məqsədi kodun keyfiyyətini artırmaq üçün maşın öyrənmə sisteminin yaradılmasıdır. Layihə tərəfindən hazırlanmış alətlər, mövcud kodun böyük bir həcmi əsasında təlim edilmiş modelə əsaslanaraq, C/C++ kimi yüksək səviyyəli dillərdə yazılmış mənbə kodlarında müxtəlif səhvləri və anomaliyaları aşkar etməyə imkan tanıyır. Sistem, kodda olan müxtəlif problemləri müəyyən etməyə yarıyır, məsələn, səhvləri tapmaqdan, növ uyğunluğu problemindən, NULL dəyərinin yoxlanılmasının itirilməsinə və yaddaşla bağlı məsələlərin aşkar edilməsinə qədər.
Sistem, GitHub və oxşar açıq resurslarda dərc edilmiş proyektlərin mövcud kod bazasının statistik modelini quraraq, öz-özünə öyrənir. Öyrənmə mərhələsində sistem, kodda qurğuların inşasında tipik nümunələri müəyyən edir və bu nümunələr arasında kodun icra axınını əks etdirən sintaktik ağac düzəldir. Nəticədə, təhlil edilmiş bütün mənbə kodlarının inkişaf təcrübəsini birləşdirən qərar qəbul etmə standart ağacı yaranır.
Yoxlanılan kod üçün, qərar qəbul etmə standart ağacı ilə müqayisə olunan nümunələri müəyyən edən oxşar bir proses yerinə yetirilir. Yanlısı budaqlarla böyük fərqliliklər yoxlanılan nümunədə anomaliyanın mövcudluğundan xəbər verir. Sistem, yalnızca nümunədəki səhvi aşkar etməklə qalmır, həm də düzəliş təklif etməyə imkan tanıyır. Məsələn, OpenSSL kodunda «(s1 == NULL) ∧ (s2 == NULL)» quruluşu yalnız 8 dəfə sintaktik ağacda görünmüşdür, halbuki ən yaxın budaq «(s1 == NULL) || (s2 == NULL)» təxminən 7 min dəfə baş vermişdir. Sistem eyni zamanda «(s1 == NULL) | (s2 == NULL)» anomalisini aşkar etdi ki, bu da ağacda 32 dəfə baş vermişdir.

«if (x = 7) y = x;» kod fraqmentini analiz edərkən, sistem «if» operatorunda ədədi dəyərləri müqayisə etmək üçün adətən «dəyişən == ədəd» formasının istifadə edilməsini müəyyən etdi, buna görə «dəyişən = ədəd» ifadəsində olan bu tip istifadə, səhvən baş verdiyinin böyük ihtimali var. Bu cür səhvləri ənənəvi statik analizatorlar da aşkar edə bilər, amma fərqli olaraq ControlFlag əvvəllər tərtib olunmuş qaydalardan istifadə etmir, hansılar ki, bütün mümkün variantların gözlənilməsində çətinlik yaradır, lakin müxtəlif proyektlərdə bütün qurğuların istifadəsinin statistikası əsasında işləyir.
ControlFlag vasitəsilə, tez-tez keyfiyyətli və yoxlanılmış kodun nümunəsi kimi göstərilən cURL utilitindəki mətnlərdə aparılan eksperiment nəticəsində, statik analizatorlar tərəfindən aşkar edilməyən bir səhv aşkar edilib. Bu səhv, "s->keepon" struktur elementinin ədədi tipə sahib olmasına baxmayaraq, TRUE Boolean dəyəri ilə müqayisə edilməsi ilə bağlıdır. OpenSSL kodunda, yuxarıda qeyd olunan "(s1 == NULL) ∧ (s2 == NULL)" problemi ilə yanaşı, «(-2 == rv)» ifadəsindəki anomaliyalar (mənfi işarə yazı səhvi idi) və «BIO_puts(bp, ":")» ifadəsi də qeyd olunub.
Mənbə: opennet.ru
