Intel udostępnił kod systemu uczenia maszynowego ControlFlag do wykrywania błędów w kodzie

Firma Intel ujawnila prace związane z projektem badawczym ControlFlag, który ma na celu stworzenie systemu uczenia maszynowego w celu poprawy jakości kodu. Opracowane przez projekt narzędzia pozwala na wykrywanie różnych błędów i anomalii w kodzie źródłowym napisanym w wysokopoziomowych językach, takich jak C/C++, na podstawie modelu wytrenowanego na dużej ilości istniejącego kodu. System nadaje się do identyfikacji różnych problemów w kodzie, od wykrywania literówek i nieprawidłowych kombinacji typów, po identyfikację pominiętych sprawdzeń wartości NULL w wskaźnikach oraz problemów związanych z pamięcią. Kod ControlFlag został napisany w języku C++ i jest udostępniony na licencji MIT.

System uczy się samodzielnie, budując model statystyczny istniejącego zbioru kodu projektów open source opublikowanych na GitHubie i podobnych publicznych repozytoriach. W fazie uczenia system identyfikuje typowe wzorce konstrukcji w kodzie i tworzy drzewo syntaktyczne relacji między tymi wzorcami, odzwierciedlające przepływ wykonania kodu w programie. W rezultacie tworzy się wzorcowe drzewo podejmowania decyzji, które łączy doświadczenie wszystkich analizowanych kodów źródłowych.

Dla sprawdzanego kodu przeprowadzany jest podobny proces identyfikacji wzorców, które są porównywane z wzorcowym drzewem podejmowania decyzji. Znaczne rozbieżności z sąsiednimi gałęziami wskazują na obecność anomalii w sprawdzanym wzorcu. System pozwala nie tylko na wykrycie błędu w wzorcu, ale także na zaproponowanie poprawki. Na przykład w kodzie OpenSSL zidentyfikowano konstrukcję „(s1 == NULL) ∧ (s2 == NULL)”, która pojawiała się w drzewie syntaktycznym tylko 8 razy, podczas gdy najbliższa gałąź z wartością „(s1 == NULL) || (s2 == NULL)” występowała około 7 tysięcy razy. System zidentyfikował również anomalię „(s1 == NULL) | (s2 == NULL)”, która występowała w drzewie 32 razy.

Intel udostępnił kod systemu uczenia maszynowego ControlFlag do wykrywania błędów w kodzie

Analizując fragment kodu „if (x = 7) y = x;”, system ustalił, że w operatorze „if” do porównania wartości numerycznych zwykle używa się konstrukcji „zmienna == liczba”, dlatego z dużym prawdopodobieństwem wskazanie „zmienna = liczba” w wyrażeniu „if” jest wynikiem literówki. Taki błąd wykryłby również tradycyjny statyczny analizer, ale w przeciwieństwie do nich ControlFlag nie stosuje gotowych reguł, w których trudno przewidzieć wszystkie możliwe warianty, ale opiera się na statystyce użycia różnych konstrukcji w wielu projektach.

W ramach eksperymentu za pomocą ControlFlag w źródłowych tekstach narzędzia cURL, które często jest podawane jako przykład wysokiej jakości i sprawdzonego kodu, ujawniono niedostrzeżony przez statyczne analizy błąd w użyciu elementu struktury „s->keepon”, który miał typ numeryczny, ale był porównywany z wartością logiczną TRUE. W kodzie OpenSSL, oprócz wspomnianego wcześniej problemu z „(s1 == NULL) ∧ (s2 == NULL)”, ujawniono również anomalie w wyrażeniach „(-2 == rv)” (minus był literówką) i „BIO_puts(bp, „:”).

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster