Otwarty system uczenia maszynowego Intel ControlFlag umożliwiający identyfikację błędów w kodzie

Firma Intel odkryła zmiany związane z projektem badawczym ControlFlag, mającym na celu stworzenie systemu uczenia maszynowego poprawiającego jakość kodu. Przygotowany w ramach projektu zestaw narzędzi pozwala, w oparciu o model wyszkolony na dużej ilości istniejącego kodu, identyfikować różne błędy i anomalie w tekstach źródłowych napisanych w językach wysokiego poziomu, takich jak C/C++. System nadaje się do identyfikowania różnego rodzaju problemów w kodzie, od identyfikowania literówek i nieprawidłowych kombinacji typów, po identyfikowanie brakujących wartości NULL we wskaźnikach i problemów z pamięcią. Kod ControlFlag jest napisany w języku C++ i jest udostępniany na zasadach open source na licencji MIT.

System uczy się samoczynnie, budując model statystyczny istniejącej tablicy kodów otwartych projektów opublikowanych w GitHubie 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. System pozwala także nie tylko zidentyfikować błąd w szablonie, ale także zasugerować korektę. Przykładowo w kodzie OpenSSL zidentyfikowano konstrukcję „(s1 == NULL) ∧ (s2 == NULL)”, która pojawiła się w drzewie składniowym tylko 8 razy, natomiast najbliższa gałąź o wartości „(s1 == NULL) || (s2 == NULL)” wystąpiło około 7 tysięcy razy. System wykrył również anomalię „(s1 == NULL) | (s2 == NULL)”, który pojawił się w drzewie 32 razy.

Otwarty system uczenia maszynowego Intel ControlFlag umożliwiający identyfikację błędów w kodzie

Analizując fragment kodu „if (x = 7) y = x;” System ustalił, że konstrukcja „zmienna == liczba” jest zwykle używana w operatorze „if” do porównywania wartości liczbowych, dlatego jest wysoce prawdopodobne, że wskazanie „zmienna = liczba” w wyrażeniu „if” jest spowodowane przez literówka. Tradycyjne analizatory statyczne wyłapałyby taki błąd, jednak w odróżnieniu od nich ControlFlag nie stosuje gotowych reguł, w których trudno przewidzieć wszystkie możliwe opcje, lecz opiera się na statystykach wykorzystania różnych struktur w dużej liczbie projektów.

W ramach eksperymentu, wykorzystując ControlFlag w kodzie źródłowym narzędzia cURL, które jest często przytaczane jako przykład wysokiej jakości i przetestowanego kodu, zidentyfikowano niewykryty przez analizatory statyczne błąd przy użyciu elementu struktury „s->keepon”, który miał typ numeryczny, ale został porównany z wartością logiczną TRUE . W kodzie OpenSSL oprócz wspomnianego powyżej problemu z „(s1 == NULL) ∧ (s2 == NULL)” zidentyfikowano także anomalie w wyrażeniach „(-2 == rv)” (minus był literówka) i „BIO_puts(bp, „:”)

Źródło: opennet.ru

Dodaj komentarz