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

Додати коментар або відгук