Jak statyczna analiza kodu pomaga w branży GameDev

( 4 grudnia 2020 r.)

Branża gier stale się rozwija i rozwija się szybciej niż pędząca kula. Wraz z rozwojem branży rośnie również złożoność programowania: baza kodu rośnie, a liczba błędów również rośnie. Dlatego nowoczesne projekty gier muszą zwracać szczególną uwagę na jakość kodu. Dzisiaj omówimy jeden ze sposobów uczynienia kodu bardziej przyzwoitym, czyli analizę statyczną, a także sposób, w jaki PVS-Studio w praktyce pomaga w tworzeniu projektów gier o różnych rozmiarach.

„Najważniejszą rzeczą, jaką zrobiłem jako programista w ostatnich latach, jest agresywnie realizować statyczną analizę kodu. Jeszcze bardziej wartościowe niż setki poważnych błędów, którym udało mi się zapobiec, jest zmiana sposobu myślenia o sposobie postrzegania niezawodności oprogramowania i jakości kodu. ”- John Carmack

Współpracujemy z największymi twórcami gier od wielu lat iw tym czasie udało nam się zrobić wiele interesujących i przydatnych rzeczy dla branży gier. Nie jest to dużym zaskoczeniem, biorąc pod uwagę listę naszych klientów z branży gier. Aktywnie wspieramy naszych klientów: aby zintegrować PVS-Studio z ich własnym procesem rozwoju, naprawić błędy znalezione przez analizator, a nawet stworzyć specjalne niestandardowe funkcje.

Ponadto wykonujemy wiele niezależnych prac nad analizator w kierunku GameDev, a także promuje PVS-Studio, opowiadając ludziom o interesujących błędach, które znalazł w różnych grach wideo.

Oczywiście, mamy do opowiedzenia kilka interesujących historii. W tym artykule omówimy kilka takich przypadków.

PVS-Studio i Unity

Jednym ze sposobów promowania naszego produktu jest pisanie artykułów o sprawdzaniu otwartych projektów. Te artykuły odnoszą korzyści dla wszystkich: czytelnik ma szansę sprawdzić nietypowe błędy w znajomym projekcie i dowiedzieć się czegoś nowego. Jeśli chodzi o zespół PVS-Studio, mamy możliwość pokazania pracy wykonanej na prawdziwym kodzie, aby programiści projektu mogli dowiedzieć się o błędach i je z wyprzedzeniem naprawić.

Nasza pierwsza duża znajomość z Unity miała miejsce w 2016 roku, kiedy twórcy tego silnika gry otworzyli kod źródłowy kilku komponentów, bibliotek i wersji demonstracyjnych w swoim oficjalnym repozytorium. Nic dziwnego, nie mogliśmy ominąć tak kuszącego przypadku i chcieliśmy napisać artykuł o sprawdzaniu opublikowanego kodu.

Wtedy dowiedzieliśmy się, że kod Unity3D (wtedy silnik był tak nazywany) był bardzo wysokiej jakości. Mimo to udało nam się znaleźć w nim sporo poważnych błędów. Było ich wystarczająco dużo, by napisać artykuł .

Dwa lata później stało się coś innego – programiści Unity otworzyli kod silnika i sam redaktor. I tak jak poprzednio, nie mogliśmy tego nie zauważyć i sprawdziliśmy kod źródłowy silnika. I nie bez powodu – znaleźliśmy także kilka zniewalających błędów.

Jednocześnie nasze intencje wykraczają daleko poza samo pisanie artykuły. Nadal pracujemy nad PVS-Studio, a GameDev jest jednym z najważniejszych obszarów naszego rozwoju. Dlatego chcemy, aby twórcy gier Unity byli w stanie uzyskać najlepszą możliwą analizę swoich projektów.

Jednym z kroków w celu poprawy jakości analizy projektów Unity było napisanie adnotacji dla metod zdefiniowanych w Unity Scripting API .

Adnotacja do metody to specjalny mechanizm używany w PVS-Studio. Umożliwia użytkownikowi dostarczenie analizatorowi wszystkich niezbędnych informacji o określonej metodzie. Jest napisany w specjalnym kodzie przez samych programistów analizatora (tj. Przez nas).

Informacje te mogą być bardzo różnego rodzaju. Na przykład: jak metoda może wpływać na przekazywane do niej parametry, czy może przydzielać pamięć i czy zwraca wartość, którą należy obsłużyć. W ten sposób adnotacja pozwala analizatorowi lepiej zrozumieć logikę metod, umożliwiając wykrywanie nowych i bardziej złożonych błędów.

Napisaliśmy już ogromną liczbę różnych adnotacji (na przykład dla metod z System namespace) iz przyjemnością dodaliśmy do nich adnotacje metod z interfejsu Unity Scripting API.

Zaczęliśmy rozszerzać listę adnotacji o ocenę. Ile jest w sumie metod? Które z nich należy najpierw opisać? W sumie metod było bardzo dużo, więc zdecydowaliśmy się zacząć od opisania najczęściej używanych.

W ten sposób szukaliśmy popularnych metod: najpierw zebraliśmy pulę projektów z GitHub, które używają funkcji Unity, a następnie użyliśmy samodzielnie napisanego narzędzia (opartego na Roslyn) do obliczenia wywołań do metody, którymi byliśmy zainteresowani. W rezultacie otrzymaliśmy listę klas, których metody były używane najczęściej:

  • UnityEngine.Vector3
  • UnityEngine.Mathf
  • UnityEngine.Debug
  • UnityEngine.GameObject
  • UnityEngine.Material
  • UnityEditor.EditorGUILayout
  • UnityEngine.Component
  • UnityEngine.Object
  • UnityEngine.GUILayout
  • UnityEngine.Quaternion

Następnie pozostało aby opisać metody tych klas. Stworzyliśmy projekt testowy i zagłębiliśmy się w dokumentację, aby uzyskać jak najwięcej informacji o tych metodach. Na przykład, próbowaliśmy przekazać null jako różne argumenty, aby zobaczyć, jak program będzie się zachowywał.

Podczas takich kontroli od czasu do czasu odkrywaliśmy interesujące, nieudokumentowane informacje. Znaleźliśmy nawet kilka godnych uwagi błędów w silniku. Na przykład, gdy uruchamiamy następujący kod:

MeshRenderer renderer = cube.GetComponent();
Material m = renderer.material;
List<int> outNames = null;
m.GetTexturePropertyNameIDs(outNames);

sam edytor Unity ulega awarii (przynajmniej w wersji 2019.3.10f1). Oczywiście jest mało prawdopodobne, aby ktokolwiek napisał taki kod. Jednak fakt, że edytor Unity może ulec awarii, uruchamiając taki skrypt, jest ciekawy.

Tak więc napisaliśmy adnotacje. Po przeprowadzeniu analizy od razu znaleźliśmy nowe wyzwalacze. Na przykład analizator wykrył dziwne wywołanie metody GetComponent :

void OnEnable()
{
GameObject uiManager = GameObject.Find("UIRoot"); if (uiManager)
{
uiManager.GetComponent();
}
}

Ostrzeżenie analizatora: V3010 Wartość zwracana funkcji „GetComponent” jest wymagana do wykorzystania. – DODATKOWY W CURRENT UIEditorWindow.cs 22

Metoda GetComponent implikuje zwrócenie określonej wartości nawet z powodu do jego nazwy. Logiczne jest założenie, że wartość tę należy w jakiś sposób wykorzystać. Teraz dzięki nowej adnotacji analizator wie, że takie „nienadzorowane” wywołanie tej metody może wskazywać na błąd logiczny i ostrzega o nim.

Nie jest to jedyne ostrzeżenie, które pojawiło się w zbiorze naszego projekty testowe po dodaniu nowych adnotacji. Nie będę cytował reszty, żeby ten artykuł nie był zbyt obszerny. Najważniejsze jest to, że teraz rozwój projektów Unity przy użyciu PVS-Studio pozwala na pisanie znacznie bezpieczniejszego i czystszego kodu bez błędów.

Jeśli chciałbyś przeczytać więcej o naszej pracy z adnotacjami dla metod Unity, oto artykuł: Jak analizator PVS-Studio zaczął znajdować jeszcze więcej błędów w projektach Unity .

Unreal Engine 4

Kiedy w 2014 roku programiści Unreal Silnik 4 otworzył kod źródłowy silnika, po prostu nie mogliśmy ominąć tego projektu, a także napisaliśmy o nim artykuł . Twórcom silnika spodobał się artykuł i naprawili znalezione przez nas błędy. Ale to nam nie wystarczyło i postanowiliśmy spróbować sprzedać licencję na nasz analizator firmie Epic Games.

Epic Games było zainteresowane ulepszeniem swojego silnika za pomocą PVS-Studio, więc uzgodniliśmy, co następuje : sami naprawiamy kod Unreal Engine, żeby analizator nie wystawiał żadnych ostrzeżeń, a chłopaki z Epic Games kupują naszą licencję i dodatkowo nagradzają nas za wykonaną pracę.

Dlaczego wszystkie ostrzeżenia musiały być naprawiony? Faktem jest, że można uzyskać maksymalne korzyści z analizy statycznej, korygując błędy zaraz gdy się pojawią . Kiedy sprawdzasz swój projekt po raz pierwszy, zwykle otrzymujesz kilkaset (a czasem tysiące) ostrzeżeń. Spośród wszystkich tych wyzwalaczy analizatora łatwo jest zgubić ostrzeżenia wydane dla nowo napisanego kodu.

Na pierwszy rzut oka ten problem można rozwiązać dość łatwo: wystarczy usiąść i przejrzeć cały raport , stopniowo poprawiając błędy. Jednak chociaż ta metoda jest bardziej intuicyjna, może to zająć trochę czasu. Znacznie wygodniejsze i szybsze jest używanie plików z pomijaniem.

Pliki z wygaszaniem to specjalna funkcja programu PVS-Studio , która pozwala ukryć ostrzeżenia analizatora w specjalnym pliku. Jednak ukryte ostrzeżenia nie pojawią się w kolejnych dziennikach: możesz je przeglądać osobno.

Po wielu wyzwoleniach po pierwszym sprawdzeniu możesz dodać wszystkie wykryte ostrzeżenia do pliku pomijania za pomocą kilku kliknięć i po następnym sprawdzeniu otrzymasz czysty dziennik bez ani jednego wpisu.

Teraz, gdy stare ostrzeżenia nie są już uwzględniane w dzienniku, możesz łatwo wykryć nowe ostrzeżenie natychmiast po jego pojawieniu się. Oto kolejność działań: napisz kod -> sprawdź go analizatorem -> znajdź nowe ostrzeżenie -> napraw błąd. W ten sposób uzyskasz najwięcej korzyści z korzystania z analizatora.

Jednocześnie nie zapomnij o ostrzeżeniach w pliku suppress: nadal mogą one zawierać ostrzeżenia o poważnych błędach i lukach, tak jak poprzednio. Dlatego należy wracać do tych ostrzeżeń i na bieżąco zmniejszać ich liczbę.

Bez wątpienia ten scenariusz jest wygodny, ale deweloperzy z Epic Games chcieli, aby ich kod został naprawiony od razu, więc przeszli zadanie dla nas.

I zabraliśmy się do pracy. Po sprawdzeniu kodu projektu znaleźliśmy 1821 ostrzeżeń na poziomach Level_1 i Level_2. Przetwarzanie tak dużej liczby ostrzeżeń wymaga poważnej pracy i aby ułatwić cały ten proces, ustawiliśmy ciągłą analizę kodu na naszym serwerze CI.

Wyglądało to tak: każdej nocy na naszym serwerze bieżące wersja Unreal Engine 4 i natychmiast po jej zbudowaniu analiza została automatycznie uruchomiona. Tak więc, kiedy nasi ludzie przychodzili rano do pracy, zawsze mieli świeży raport z analizatora, który pomagał im śledzić postęp w usuwaniu ostrzeżeń. Ponadto system ten pozwolił nam sprawdzić stabilność kompilacji w dowolnym momencie, uruchamiając ją ręcznie na serwerze.

Cały proces zajął nam 17 dni roboczych. Harmonogram naprawiania błędów był następujący:

W rzeczywistości ten harmonogram nie odzwierciedla w pełni naszej pracy. Po naprawieniu wszystkich ostrzeżeń czekaliśmy kolejne dwa dni, aż zaakceptują nasze najnowsze żądania ściągnięcia. Przez cały ten czas automatycznie sprawdzana była najnowsza wersja Unreal Engine, która z kolei była aktualizowana o nowy kod. Jak myślisz, co się stało? W ciągu tych dwóch dni PVS-Studio znalazło w kodzie kolejne cztery błędy! Jeden z nich był kluczowy i mógł potencjalnie prowadzić do niezdefiniowanego zachowania.

Oczywiście naprawiliśmy również te błędy. W tym momencie deweloperom Unreal Engine zostało tylko jedno: skonfigurowanie automatycznej analizy we własnym miejscu, tak jak to zrobiliśmy. Od tego momentu każdego dnia zaczęli widzieć ostrzeżenia, które były wysyłane dla właśnie napisanego kodu. To pozwoliło im naprawić błędy w kodzie natychmiast po ich pojawieniu się – na najwcześniejszych etapach rozwoju .

Więcej o tym, jak pracowaliśmy nad kodem Unreal Engine, można przeczytać w oficjalny blog Unreal Engine lub w naszej witrynie .

Analiza różne gry

Czy wspominałem, że sprawdzać różne otwarte projekty i pisać o nich artykuły? Mamy więc teraz wiele podobnych artykułów o projektach gier! Pisaliśmy o grach takich jak VVVVVV , Space Engineers , Command & Conque r, osu! , a nawet (bardzo wczesny artykuł) Doom 3 . Zebraliśmy także 10 najważniejszych najciekawszych błędów oprogramowania z branży gier wideo.

Więc sprawdziliśmy prawdopodobnie większość dobrze znane silniki open source. Oprócz Unity i Unreal Engine 4, projekty takie jak Godot , Bullet , Amazon Lumberyard , Cry Engine V i wiele innych znalazło się w naszym zasięgu.

Najlepsze w tym wszystkim jest to, że wiele błędów, które opisaliśmy, zostało później naprawionych przez samych twórców projektu. Miło jest czuć, że narzędzie, które tworzysz, przynosi światu realne, widoczne i namacalne korzyści.

Możesz wyświetlić listę wszystkich naszych artykułów związanych z tworzeniem gier wideo w taki czy inny sposób na specjalną stronę naszego bloga.

Podsumowanie

W tym miejscu mój artykuł dobiega końca. Życzę czystego i poprawnie działającego kodu bez błędów i błędów!

Interesuje Cię temat analizy statycznej? Chcesz sprawdzić swój projekt pod kątem błędów? Wypróbuj PVS-Studio .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *