Компания Intel опубликовала первый значительный релиз инструментария ControlFlag 1.0, позволяющего выявлять ошибки и аномалии в исходных текстах, используя систему машинного обучения, натренированную на большом объёме существующего кода. В отличие от традиционных статических анализаторов, ControlFlag не применяет готовых правил, в которых трудно предусмотреть все возможные варианты, а отталкивается от статистики использования всевозможных языковых конструкций в большом числе существующих проектов. Код ControlFlag написан на языке С++ и открыт под лицензией MIT.
Система обучается путём построения статистической модели имеющегося массива кода открытых проектов, опубликованных в GitHub и подобных публичных репозиториях. На стадии обучения система определяет типовые шаблоны построения конструкций в коде и строит синтаксическое дерево связей между этими шаблонами, отражающее поток выполнения кода в программе. В итоге формируется эталонное дерево принятия решений, объединяющее опыт разработки всех проанализированных исходных текстов. Для проверяемого кода выполняется похожий процесс определения шаблонов, которые сверяются с эталонным деревом принятия решений. Большие расхождения с соседними ветвями свидетельствуют о наличии аномалии в проверяемом шаблоне.
В качестве примера возможностей ControlFlag разработчиками был проведён анализ исходных текстов проектов OpenSSH и cURL:
- В OpenSSL были выявлены аномальные конструкции “(s1 == NULL) ∧ (s2 == NULL)” и “(s1 == NULL) | (s2 == NULL)” , не соответствующие обычно используемому шаблону “(s1 == NULL) || (s2 == NULL)”. В коде также были выявлены аномалии в выражениях “(-2 == rv)” (минус был опечаткой) и “BIO_puts(bp, “:”) В cURL выявлена незамеченная статическими анализаторами ошибка при использовании элемента структуры “s->keepon”, который имел числовой тип, но сравнивался с булевым значением TRUE.
Из особенностей версии ControlFlag 1.0 отмечается полная поддержка типовых шаблонов для языка Си и возможность выявления аномалий в условных выражениях “if”. Например, при анализе фрагмента кода “if (x = 7) y = x;” система определит, что обычно в операторе “if” для сравнения числовых значений используется конструкция “переменная == число”, поэтому с большой вероятностью указание “переменная = число” в выражении “if” вызвано опечаткой. В комплекте предоставляется сценарий, позволяющий загрузить имеющиеся в GitHub репозитории на языке Си и использовать их для построения модели. Также доступны уже готовые модели, позволяющие сразу приступить к проверке кода.