+38/050/370-3627
+38/093/220-0872
+38/044/257-2444
Новини

Intel відкрив код проекту для підвищення якості коду ControlFlag

Intel відкрила код проекту для поліпшення якості управлінняКодуFlag

Компанія Intel відкрила код дослідницького проекту controlflag , спрямованого на створення системи машинного навчання для підвищення якості коду. Підготовлений проектом інструментарій дозволяє на основі моделі, навченої на великому обсязі існуючого коду, виявляти різні помилки і аномалії в вихідних текстах, написаних на мовах високого рівня, таких як C / C ++. Система підходить для виявлення різного роду проблем в коді, від виявлення помилок і неправильного поєднання типів, до виявлення пропущених нульових перевірок в покажчиках і проблем з пам'яттю. Код ControlFlag написаний на C++ і відкритий під ліцензією MIT.

Система самонавчається шляхом побудови статистичної моделі існуючого масиву коду проектів з відкритим кодом, опублікованих в GitHub і подібних публічних репозиторіях. На етапі навчання система визначає типові закономірності побудови конструкцій в коді і будує синтаксичне дерево зв'язків між цими патернами, що відображає потік виконання коду в програмі. В результаті формується еталонне дерево рішень, що об'єднує досвід розробки всіх аналізованих вихідних текстів.

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

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

В якості експерименту з використанням ControlFlag в вихідному коді утиліти cURL, який часто наводиться як приклад якісного і перевіреного коду, помилка була виявлена непомітно статичними аналізаторами при використанні елемента структури «s->keepon», який мав числовий тип, але порівнювався з булевим значенням TRUE. У коді OpenSSL, крім вищезгаданої проблеми з "(s1 == NULL) ∧ (s2 == NULL)", були виявлені аномалії і в виразах "(-2 == rv)" (мінусом була помилка) і "BIO_puts(bp, ":") <= 0)" (в контексті перевірки успішного завершення функції повинно було бути "== 0"). Також повідомляється, що використання ControlFlag дозволило виявити кілька сотень помилок в неспецифічному пропрієтарному ПО, що призводять до збоїв і проблем при роботі з пам'яттю.

Інші новини