Wydanie ControlFlag 1.0, narzędzia do identyfikacji błędów w kodzie C

Firma Intel opublikowała pierwszą dużą wersję narzędzia ControlFlag 1.0, które pozwala identyfikować błędy i anomalie w kodzie źródłowym za pomocą systemu uczenia maszynowego przeszkolonego na dużej ilości istniejącego kodu. W odróżnieniu od tradycyjnych analizatorów statycznych ControlFlag nie stosuje gotowych reguł, w których trudno uwzględnić wszystkie możliwe opcje, lecz opiera się na statystykach dotyczących wykorzystania różnych konstrukcji językowych w dużej liczbie istniejących projektów. Kod ControlFlag jest napisany w języku C++ i jest udostępniany na zasadach open source na licencji MIT.

System jest szkolony poprzez budowanie modelu statystycznego istniejącej tablicy kodów projektów open source opublikowanych w GitHub i podobnych publicznych repozytoriach. Na etapie uczenia system wyznacza typowe wzorce konstruowania struktur w kodzie i buduje drzewo składniowe powiązań pomiędzy tymi wzorcami, odzwierciedlające przebieg wykonywania kodu w programie. W rezultacie powstaje referencyjne drzewo decyzyjne, które łączy doświadczenia programistyczne wszystkich analizowanych kodów źródłowych. Przeglądany kod przechodzi podobny proces identyfikacji wzorców, które są sprawdzane w oparciu o referencyjne drzewo decyzyjne. Duże rozbieżności z sąsiednimi gałęziami wskazują na obecność anomalii w sprawdzanym wzorze.

Wydanie ControlFlag 1.0, narzędzia do identyfikacji błędów w kodzie C

Jako przykład możliwości ControlFlag programiści przeanalizowali kody źródłowe projektów OpenSSL i cURL:

  • Anomalne konstrukcje „(s1 == NULL) ∧ (s2 == NULL)” i „(s1 == NULL) | (s2 == NULL)" , które nie pasują do powszechnie używanego wzorca "(s1 == NULL) || (s2 == NULL)”. W kodzie zidentyfikowano także anomalie w wyrażeniach „(-2 == rv)” (minus był literówką) oraz „BIO_puts(bp, „:”) <= 0)” (w kontekście sprawdzenia pomyślnego wykonania zadania funkcja powinna mieć wartość „== 0”).
  • W cURL odkryto błąd, który nie został wykryty przez analizatory statyczne przy użyciu elementu struktury „s->keepon”, który miał typ numeryczny, ale został porównany z wartością logiczną TRUE.

Wśród funkcji wersji ControlFlag 1.0 znajduje się pełna obsługa standardowych szablonów dla języka C oraz możliwość wykrywania anomalii w wyrażeniach warunkowych „if”. Na przykład, analizując fragment kodu „if (x = 7) y = x;” System ustali, że instrukcja „if” zwykle używa konstrukcji „zmienna == liczba” do porównywania wartości liczbowych, więc jest wysoce prawdopodobne, że „zmienna = liczba” w wyrażeniu „if” jest spowodowana literówką. Zestaw zawiera skrypt, który pozwala pobrać istniejące repozytoria języka C na GitHub i wykorzystać je do zbudowania modelu. Dostępne są również gotowe modele, dzięki którym można od razu przystąpić do sprawdzania kodu.

Źródło: opennet.ru

Dodaj komentarz