Jak analýza statického kódu pomáhá v průmyslu GameDev

( 4. prosince 2020)

Herní průmysl se neustále vyvíjí a vyvíjí se rychleji než rychlá kulka. Spolu s růstem odvětví se také zvyšuje složitost vývoje: rozšiřuje se kódová základna a roste také počet chyb. Moderní herní projekty proto musí věnovat zvláštní pozornost kvalitě kódu. Dnes se budeme zabývat jedním ze způsobů, jak zvýšit slušnost vašeho kódu, kterým je statická analýza, a také to, jak PVS-Studio v praxi pomáhá při vývoji herních projektů různých velikostí.

„To nejdůležitější, co jsem jako programátor v posledních letech udělal, je agresivně provádět statickou analýzu kódu. Ještě cennější než stovky závažných chyb, kterým jsem zabránil, je změna v myšlení ohledně způsobu, jakým vnímám spolehlivost softwaru a kvalitu kódu. ”- John Carmack

Spolupracujeme s hlavními vývojáři her po mnoho let a během této doby se nám podařilo udělat spoustu zajímavých a užitečných věcí pro herní průmysl. Vzhledem k seznamu našich klientů z herního průmyslu to není velké překvapení. Aktivně podporujeme naše klienty: integrovat PVS-Studio do jejich vlastního vývojového procesu, opravovat chyby zjištěné analyzátorem a dokonce vyrábíme speciální vlastní funkce.

Kromě toho provádíme mnoho nezávislého vývoje analyzátor ve směru GameDev a také propagovat PVS-Studio a informovat lidi o zajímavých chybách, které našel v různých videohrách.

Jistě, máme několik zajímavých příběhů. Tento článek pojedná o několika takových případech.

PVS-Studio and Unity

Jedním ze způsobů, jak propagovat náš produkt, je psaní článků o kontrole otevřených projektů. Tyto články těží pro všechny: čtenář dostane příležitost vyzkoušet některé neobvyklé chyby ve známém projektu a naučit se něco nového. Pokud jde o tým PVS-Studio, dostáváme příležitost ukázat práci na reálném kódu, aby se vývojáři projektů mohli dozvědět o chybách a opravit je předem.

Proběhlo naše první hlavní seznámení s Unity v roce 2016, kdy vývojáři tohoto herního enginu otevřeli ve svém oficiálním úložišti zdrojový kód několika komponent, knihoven a ukázek. Není divu, že jsme nemohli obejít takový lákavý případ a chtěli jsme napsat článek o kontrole zveřejněného kódu.

Pak jsme zjistili, že kód Unity3D (v té době se motor tak volal) byl velmi kvalitní. Ale přesto jsme v něm našli spoustu vážných chyb. Bylo jich dost na napsání článku .

O dva roky později se stala další věc – vývojáři Unity otevřeli kód enginu a samotný editor. Stejně jako v minulosti jsme si toho nemohli nevšimnout a zkontrolovali zdrojový kód motoru. A nebylo to nadarmo – našli jsme také hromadu podmanivých chyb.

Současně naše záměry přesahují rámec pouhého psaní článků. Pokračujeme v práci na PVS-Studio a GameDev je jednou z nejvýznamnějších oblastí našeho vývoje. Proto chceme, aby vývojáři her Unity byli schopni získat co nejlepší analýzu svých projektů.

Jedním z kroků ke zlepšení kvality analýzy projektů Unity bylo psaní anotací pro metody definované v API Unity Scripting .

Anotace metody je speciální mechanismus používaný v PVS-Studio. Umožňuje uživateli poskytnout analyzátoru všechny potřebné informace o konkrétní metodě. Jsou psány ve speciálním kódu samotnými vývojáři analyzátoru (tj. Námi).

Tyto informace mohou být zcela různého druhu. Například: jak může metoda ovlivnit parametry, které jí byly předány, zda může přidělit paměť a zda vrací hodnotu, která musí být zpracována. Anotace tedy umožňuje analyzátoru lépe porozumět logice metod, což mu umožňuje detekovat nové a složitější chyby.

Již jsme napsali obrovské množství různých anotací (například pro metody ze systému namespace), a rádi jsme k nim přidali anotace metod z Unity Scripting API.

Začali jsme rozšiřovat seznam anotací o hodnocení. Kolik metod je celkem? Které z nich by měly být anotovány jako první? Celkem bylo spousty metod, a proto jsme se rozhodli začít anotací nejčastěji používaných metod.

Takto jsme hledali populární metody: nejprve jsme shromáždili skupinu projektů z GitHubu, které využívají funkce Unity, a pak jsme k výpočtu hovorů použili vlastní program (založený na Roslynovi) metody, které nás zajímaly. Ve výsledku jsme dostali seznam tříd, jejichž metody se nejčastěji používaly:

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

Dále to zůstalo anotovat metody těchto tříd. Vytvořili jsme testovací projekt a prozkoumali dokumentaci, abychom získali co nejvíce informací o těchto metodách. Například jsme zkusili předat null jako různé argumenty, abychom zjistili, jak se program bude chovat.

Během těchto kontrol jsme občas objevili některé zajímavé nezdokumentované informace. V motoru jsme dokonce našli několik pozoruhodných chyb. Například když používáme následující kód:

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

dojde k chybě samotného editoru Unity (alespoň ve verzi 2019.3.10f1). Je samozřejmě nepravděpodobné, že někdo takový kód napíše. Skutečnost, že editor Unity lze spustit spuštěním takového skriptu, je kuriózní.

Takže jsme měli napsané anotace. Po spuštění analýzy jsme okamžitě našli nové spouštění. Analyzátor například detekoval podivné volání metody GetComponent :

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

Upozornění analyzátoru: V3010 Je nutné použít návratovou hodnotu funkce GetComponent. – DALŠÍ V AKTUÁLNÍM UIEditorWindow.cs 22

Metoda GetComponent implikuje vrácení konkrétní hodnoty i kvůli na jeho jméno. Je logické předpokládat, že tato hodnota by měla být nějakým způsobem použita. Nyní díky nové anotaci analyzátor ví, že takové „bezobslužné“ volání této metody může znamenat logickou chybu a varuje před ní.

Toto není jediné varování, které se objevilo v sadě našich testovat projekty po přidání nových anotací. Zbytek nebudu citovat, aby tento článek nebyl příliš velký. Hlavní věc je, že nyní vývoj projektů Unity pomocí PVS-Studio umožňuje psát mnohem bezpečnější a čistší kód bez chyb.

Pokud si chcete přečíst více o naší práci s anotacemi pro metody Unity, zde je článek: Jak začal analyzátor PVS-Studio hledat v projektech Unity ještě více chyb .

Unreal Engine 4

Když v roce 2014 vývojáři Unrealu Engine 4 otevřel zdrojový kód enginu, jednoduše jsme tento projekt nemohli projít a také jsme o něm napsali článek . Vývojářům enginu se článek líbil a opravili chyby, které jsme našli. Ale to pro nás nestačilo a rozhodli jsme se zkusit prodat licenci pro náš analyzátor společnosti Epic Games.

Společnost Epic Games se zajímala o vylepšení svého enginu pomocí PVS-Studio, proto jsme se dohodli na následujícím : kód Unreal Engine opravujeme sami, aby analyzátor nevydával žádná varování, a kluci z Epic Games si kupují naši licenci a navíc nás odměňují za odvedenou práci.

Proč musela být všechna varování pevný? Faktem je, že statickou analýzou lze získat maximální užitek opravou chyb hned když se objeví . Při první kontrole projektu obvykle dostanete několik stovek (a někdy i tisíců) varování. Ze všech těchto spouštění analyzátoru je snadné ztratit varování vydaná pro nově napsaný kód.

Na první pohled lze tento problém vyřešit docela snadno: stačí si sednout a projít celou zprávu , postupně opravovat chyby. Ačkoli je tato metoda intuitivnější, může to nějakou dobu trvat. Je mnohem pohodlnější a rychlejší používat potlačené soubory.

Potlačené soubory jsou speciální funkcí PVS-Studio , která umožňuje skrýt varování analyzátoru ve speciálním souboru. Skrytá varování se však v následujících protokolech neobjeví: můžete je zobrazit samostatně.

Po mnoha spuštěních po první kontrole můžete přidat všechna detekovaná varování do potlačeného souboru několika kliknutími a po další kontrole získáte čistý protokol bez jediného záznamu.

Nyní, když stará varování již nejsou zahrnuta v protokolu, můžete snadno zjistit nové varování ihned, jakmile se objeví. Zde je pořadí akcí: napište kód -> zkontrolujte jej pomocí analyzátoru -> najděte nové varování -> opravte chybu. Tímto způsobem využijete analyzátor na maximum.

Současně nezapomeňte na varování v potlačovacím souboru: mohou stejně jako dříve obsahovat varování o hlavních chybách a zranitelnostech. Proto byste se měli k těmto upozorněním vrátit a pravidelně snižovat jejich počet.

Není pochyb o tom, že tento scénář je vhodný, ale vývojáři z Epic Games chtěli, aby byl jejich kód ihned opraven, takže předali úkol pro nás.

A musíme se pustit do práce. Po kontrole kódu projektu jsme našli 1821 varování úrovní_1 a úrovně_2. Analýza tak velkého množství varování vyžaduje seriózní práci a pro usnadnění tohoto celého procesu jsme na našem serveru CI nastavili průběžnou analýzu kódu.

Vypadalo to takto: každou noc na našem serveru aktuální byla vytvořena verze Unreal Engine 4 a ihned po sestavení byla automaticky spuštěna analýza. Když tedy naši muži ráno přišli do práce, měli vždy novou zprávu od analyzátoru, která jim pomohla sledovat postup eliminace varování. Kromě toho nám tento systém umožnil kdykoli zkontrolovat stabilitu sestavení ručním spuštěním na serveru.

Celý proces nám trval 17 pracovních dnů. Časový plán pro opravu chyb byl následující:

Ve skutečnosti tento plán plně neodráží naši práci. Poté, co jsme opravili všechna varování, čekali jsme další dva dny, než přijali naše nejnovější žádosti o stažení. Celou tu dobu se automaticky kontrolovala nejnovější verze Unreal Engine, která se zase nadále aktualizovala novým kódem. Co si myslíte, že se stalo? Během těchto dvou dnů našla aplikace PVS-Studio v kódu další čtyři chyby! Jeden z nich byl zásadní a mohl by potenciálně vést k nedefinovanému chování.

Samozřejmě jsme také opravili i tyto chyby. V té chvíli vývojářům Unreal Engine zbývala jen jedna věc: nastavit automatickou analýzu na svém místě, stejně jako my. Od té chvíle začali každý den vidět varování vydaná pro kód, který právě napsali. To jim umožnilo opravit chyby v kódu hned, když se objevily – v nejranějších fázích vývoje .

Další informace o tom, jak jsme na kódu Unreal Engine pracovali, naleznete v oficiální blog Unreal Engine nebo na našem webu .

Analýza různé hry

Zmínil jsem, že jsme zkontrolovat různé otevřené projekty a psát o nich články? Takže nyní máme spoustu podobných článků o herních projektech! Psali jsme o hrách jako VVVVVV , Space Engineers , Příkaz & Conque r, osu! a dokonce (velmi raný článek) Doom 3 . Také jsme sestavili top 10 nejzajímavějších softwarových chyb z odvětví videoher.

Takže jsme zkontrolovali pravděpodobně většinu známé open source motory. Kromě Unity a Unreal Engine 4 jsou to projekty jako Godot , Bullet , Amazon Lumberyard , Cry Engine V a mnoho dalších se dostalo pod naše cíle.

Nejlepší na tom všem je, že mnoho chyb, které jsme popsali, byly později opraveny samotnými vývojáři projektu. Je příjemné cítit, že nástroj, který vyvíjíte, přináší světu skutečné, viditelné a hmatatelné výhody.

Seznam všech našich článků týkajících se vývoje videohier si můžete prohlížet tak či onak na speciální stránka našeho blogu.

Závěr

V tomto okamžiku můj článek končí. Přeji vám čistý a správně fungující kód bez chyb a chyb!

Máte zájem o téma statické analýzy? Chcete zkontrolovat, zda váš projekt neobsahuje chyby? Vyzkoušejte PVS-Studio .

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *