Выпуск ControlFlag 1.0, инструмента для выявления ошибок в коде на языке Си

Компания 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, «:») <= 0)» (в контексте проверки успешного завершения функции должно было быть «== 0»).
  • В cURL выявлена незамеченная статическими анализаторами ошибка при использовании элемента структуры «s->keepon», который имел числовой тип, но сравнивался с булевым значением TRUE.

Из особенностей версии ControlFlag 1.0 отмечается полная поддержка типовых шаблонов для языка Си и возможность выявления аномалий в условных выражениях «if». Например, при анализе фрагмента кода «if (x = 7) y = x;» система определит, что обычно в операторе «if» для сравнения числовых значений используется конструкция «переменная == число», поэтому с большой вероятностью указание «переменная = число» в выражении «if» вызвано опечаткой. В комплекте предоставляется сценарий, позволяющий загрузить имеющиеся в GitHub репозитории на языке Си и использовать их для построения модели. Также доступны уже готовые модели, позволяющие сразу приступить к проверке кода.

OpenNet

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *