Випуск 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

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