Hogyan segít a statikus kódelemzés a GameDev iparban

( 2020. december 4.)

A játékipar folyamatosan fejlődik és gyorsabban fejlődik, mint egy gyorshajtó golyó. Az ipar növekedésével együtt a fejlesztés bonyolultsága is növekszik: a kódbázis egyre nagyobb és a hibák száma is növekszik. Ezért a modern játékprojekteknek különös figyelmet kell fordítaniuk a kód minőségére. Ma kitérünk a kódja rendesebbé tételének egyik módjára, a statikus elemzésre, valamint arra, hogy a PVS-Studio a gyakorlatban hogyan segít a különböző méretű játékprojektek fejlesztésében.

„A legfontosabb, amit programozóként tettem az elmúlt években: agresszívan folytatni a statikus kódelemzést. A több száz súlyos hibánál, amelyet megakadályoztam vele, még értékesebb a gondolkodásmód megváltozása a szoftver megbízhatóságának és a kódminőségnek a nézetében. ”- John Carmack

Sok éven át együtt dolgoztunk nagy játékfejlesztőkkel, és ez idő alatt sok érdekes és hasznos dolgot sikerült elvégeznünk a játékipar számára. A játékipar ügyfeleink listáját figyelembe véve nem sok meglepetés. Aktívan támogatjuk ügyfeleinket: integráljuk a PVS-Stúdiót saját fejlesztési folyamatukba, kijavítsuk az elemző által talált hibákat, sőt speciális egyedi szolgáltatásokat is készítünk.

Ezen kívül rengeteg önálló fejlesztést hajtunk végre. az elemzőt a GameDev irányába, valamint népszerűsíteni kell a PVS-Stúdiót, elmondva az embereknek azokat az érdekes hibákat, amelyeket a különböző videojátékokban talált.

Bizony, van néhány érdekes történetünk. Ez a cikk több ilyen esetről fog szólni.

PVS-Studio és a Unity

A termékünk egyik promóciós módja az, hogy cikkeket írunk a nyitott projektek ellenőrzéséről. Mindenki profitál ezekből a cikkekből: az olvasó lehetőséget kap arra, hogy megnézzen néhány szokatlan hibát egy ismert projektben, és valami újat tanuljon. Ami a PVS-Studio csapatát illeti, megkapjuk a lehetőséget, hogy megmutassuk az elvégzett munkát a valós kódon, hogy a projektfejlesztők megismerhessék a hibákat és előre kijavíthassák azokat. 2016-ban, amikor ennek a játékmotornak a fejlesztői megnyitották több összetevő, könyvtár és demó forráskódját a hivatalos tárhelyükön. Nem csoda, hogy nem tudtunk elhaladni egy ilyen csábító eset mellett, és cikket akartunk írni a feladott kód ellenőrzéséről.

Aztán megtudtuk, hogy a Unity3D kód (akkoriban a motort így hívták) nagyon jó minőségű volt. De mégis elég sok súlyos hibát találtunk benne. Elég volt belőlük egy cikk megírásához.

Két évvel később egy másik dolog történt – a Unity fejlesztői kinyitották a motor kódját, és maga a szerkesztő. És csakúgy, mint az előző alkalommal, erről sem tudtunk tudomást venni, és ellenőriztük a motor forráskódját. És nem hiába – találtunk egy csomót lebilincselő hibákat is.

Ugyanakkor szándékaink messze túlmutatnak az íráson cikkeket. Továbbra is dolgozunk a PVS-Studio-n, és a GameDev az egyik legjelentősebb terület a fejlődésünk számára. Ezért azt akarjuk, hogy a Unity játékfejlesztői képesek legyenek a lehető legjobb elemzést elkészíteni a projektjeikről.

A Unity projektek elemzésének minőségének javításához az egyik lépés az volt, hogy kommentárokat írtunk a Unity Scripting API-ban meghatározott módszerekhez. .

A módszer annotációja egy speciális mechanizmus, amelyet a PVS-Studio használ. Lehetővé teszi a felhasználó számára, hogy az elemzőhöz eljuttassa az összes szükséges információt egy adott módszerről. Speciális kódban írják maguk az elemző fejlesztők (vagyis mi).

Ez az információ teljesen különféle lehet. Például: hogyan befolyásolhatja a módszer a neki átadott paramétereket, tud-e lefoglalni memóriát, és visszaad-e egy kezelendő értéket. Így az annotáció lehetővé teszi az elemző számára, hogy jobban megértse a módszerek logikáját, lehetővé téve az új és összetettebb hibák észlelését.

Már rengeteg különböző annotációt írtunk (például a rendszerből származó módszerek számára) névtér), és örömmel vettük fel a metódusjegyzeteket a Unity Scripting API-ból.

Megkezdtük a kommentárok listájának kiértékelésével történő bővítését. Hány módszer létezik összesen? Melyiket kell először feljegyezni? Nagyon sok módszer volt, ezért úgy döntöttünk, hogy a leggyakrabban használt módszerek feljegyzésével kezdjük.

Így kerestük a népszerű módszereket: először összegyűjtöttük a GitHub projektjeinek készletét, amelyek Unity funkciókat használnak, majd egy saját (Roslyn alapú) segédprogram segítségével számoltuk ki a az általunk érdekelt módszerek. Ennek eredményeként kaptunk egy listát azokról az osztályokról, amelyek metódusait leggyakrabban használtuk:

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

Ezután megmaradt hogy feljegyezzem ezen osztályok módszereit. Készítettünk egy tesztprojektet, és belemélyedtünk a dokumentációba, hogy minél több információt kapjunk ezekről a módszerekről. Például megpróbáltuk megadni a null t különféle érvekként, hogy lássuk, hogyan viselkedne a program.

Az ilyen ellenőrzések során időről időre érdekes, dokumentálatlan információkat fedeztünk fel. Még néhány figyelemre méltó hibát is találtunk a motorban. Például, amikor a következő kódot futtatjuk:

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

maga a Unity szerkesztő összeomlik (legalábbis a 2019.3.10f1 verzióban). Természetesen nem valószínű, hogy bárki ilyen kódot írna. Még mindig kíváncsi az a tény, hogy a Unity szerkesztő összeomolhat egy ilyen szkript futtatásával. Az elemzés futtatása után azonnal új kiváltó okokat találtunk. Például az elemző furcsa hívást észlelt a GetComponent módszerrel:

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

Analyzer figyelmeztetés: V3010 A GetComponent függvény visszatérési értékét ki kell használni. – TOVÁBBI AKTUÁLIS UIEditorWindow.cs 22

A GetComponent módszer egy adott érték visszatérését is jelenti nevéhez. Logikus feltételezni, hogy ezt az értéket valamilyen módon fel kell használni. Az új kommentárnak köszönhetően az elemző tudja, hogy egy ilyen „felügyelet nélküli” hívás erre a módszerre logikai hibát jelezhet, és figyelmeztet rá.

Nem ez az egyetlen figyelmeztetés, amely megjelent a teszteljen projekteket új kommentárok hozzáadása után. A többit nem idézem, nehogy túl nagy legyen ez a cikk. A lényeg az, hogy most a PVS-Studio segítségével megvalósított Unity projektek fejlesztése lehetővé teszi, hogy sokkal biztonságosabb és tisztább kódokat írjon hibák nélkül.

Ha többet szeretne megtudni munkánkról a Unity módszerek kommentárjaival, íme a cikk: Hogyan kezdett a PVS-Studio analizátor még több hibát találni a Unity projektekben .

Unreal Engine 4

Amikor még 2014-ben az Unreal fejlesztői A 4-es motor megnyitotta a motor forráskódját, egyszerűen nem tudtunk túljutni azon a projekten, és írtunk róla egy cikket is . A motorfejlesztőknek tetszett a cikk, és kijavították a talált hibákat. De ez nem volt elég számunkra, és úgy döntöttünk, hogy megpróbáljuk eladni az elemzőnk licencét az Epic Games számára.

Az Epic Games érdekelt motorja fejlesztésében a PVS-Studio segítségével, ezért megállapodtunk a következőkben: : önmagunkban kijavítjuk az Unreal Engine kódot, hogy az elemző ne adjon ki figyelmeztetést, és az Epic Games srácai megvásárolják a licencünket, és további jutalmakat adnak nekünk az elvégzett munkáért.

rögzített? Az a tény, hogy a statikus elemzésből a lehető legnagyobb előny származhat a hibák kijavításával amikor megjelennek . A projekt első ellenőrzésekor általában több száz (és néha ezer) figyelmeztetést kap. Mindezen elemzői kiváltás között könnyen elveszítheti az újonnan írt kódra adott figyelmeztetéseket.

Első pillantásra ez a probléma meglehetősen könnyen megoldható: csak le kell ülnie és végig kell néznie az egész jelentést. , fokozatosan javítja a hibákat. Bár ez a módszer intuitívabb, időbe telhet. Sokkal kényelmesebb és gyorsabb a fájlok elnyomása.

A fájlok elnyomása a PVS-Studio speciális funkciója , amely elrejtheti analizátor figyelmeztetések egy speciális fájlban. A rejtett figyelmeztetések azonban nem jelennek meg a későbbi naplókban: külön-külön is megtekintheti őket.

Miután az első ellenőrzés után sok aktiválást kapott, néhány kattintással hozzáadhatja az összes észlelt figyelmeztetést az elnyomási fájlhoz, és tiszta bejegyzést kap egyetlen bejegyzés nélkül a következő ellenőrzés után.

Most, hogy a régi figyelmeztetések már nem szerepelnek a naplóban, könnyedén felismerheti az új figyelmeztetéseket, amikor azok megjelennek. A műveletek sorrendje: írja be a kódot -> ellenőrizze az elemzővel -> találjon új figyelmeztetést -> javítsa ki a hibát. Így fogja kihozni a legtöbbet az analizátor használatából.

Ugyanakkor ne feledkezzen meg az elnyomó fájlban található figyelmeztetésekről: ezek továbbra is tartalmazhatnak figyelmeztetéseket a nagyobb hibákról és sebezhetőségekről, csakúgy, mint korábban. Ezért vissza kell térni ezekre a figyelmeztetésekre, és rendszeresen csökkenteni kell a számukat.

Kétségtelen, hogy ez a forgatókönyv kényelmes, de az Epic Games fejlesztői azt akarták, hogy a kódjukat azonnal kijavítsák, ezért átadták a feladat nekünk.

És nekiláttunk a munkának. A projekt kódjának ellenőrzése után 1821 figyelmeztetést találtunk a Level_1 és a Level_2 szintekre. Ekkora figyelmeztetések elemzése komoly munkát igényel, és ennek az egész folyamatnak a megkönnyítése érdekében folyamatos kódelemzést állítottunk be CI szerverünkön.

Így nézett ki: a szerverünkön minden este a jelenlegi Az Unreal Engine 4 változata elkészült, és közvetlenül az összeállítás után az elemzés automatikusan elindult. Így amikor a srácok reggel munkába jöttek, mindig friss jelentésük volt az elemzőtől, amely segített nekik nyomon követni a figyelmeztetések megszüntetésének előrehaladását. Ezenkívül ez a rendszer lehetővé tette számunkra, hogy bármikor ellenőrizhessük az összeállítás stabilitását a kézi futtatással a szerveren.

Az egész folyamat 17 munkanapot vett igénybe. A hibák kijavításának ütemezése a következő volt:

Valójában ez az ütemezés nem tükrözi teljes mértékben a munkánkat. Miután minden figyelmeztetést kijavítottunk, további két napot vártunk arra, hogy elfogadják a legújabb húzási kérelmeinket. Ennyi idő alatt az Unreal Engine legújabb verzióját automatikusan ellenőrizték, amelyet viszont továbbra is új kóddal frissítettek. Mit gondolsz, mi történt? Ez alatt a két nap alatt a PVS-Studio további négy hibát talált a kódban! Az egyik döntő jelentőségű volt, és meghatározhatatlan viselkedéshez vezethet.

Természetesen ezeket a hibákat is kijavítottuk. Az Unreal Engine fejlesztőinek ekkor már csak egy dolguk maradt: az automatikus elemzés beállítása a saját helyükön, ahogy mi tettük. Ettől a pillanattól kezdve minden nap figyelmeztetéseket kezdtek látni, amelyeket az imént írt kódra adtak ki. Ez lehetővé tette számukra, hogy kijavítsák a hibákat a kódban, amikor megjelentek – a fejlesztés legkorábbi szakaszában .

Az Unreal Engine kóddal kapcsolatos dolgokról a hivatalos Unreal Engine blog vagy a weboldalunkon .

A különféle játékok

Megemlítettem, hogy különféle nyitott projekteket ellenőrizni és cikkeket írni ezekről? Tehát most nagyon sok hasonló cikkünk van a játékprojektekről! Olyan játékokról írtunk, mint VVVVVV , Űrmérnökök , Parancs & Conque r, osu! és még (nagyon korai cikk) 3. végzet . Összeállítottuk a videojáték-ipar legérdekesebb szoftverhibáinak 10 legnépszerűbb változatát is.

Tehát valószínűleg a jól ismert nyílt forráskódú motorok. A Unity és az Unreal Engine 4 mellett olyan projektek, mint Godot , Bullet , Amazon Lumberyard , Cry Engine V és még sokan mások a látókörünkbe kerültek.

Mindennek a legjobb része az, hogy az általunk leírt hibákat sok esetben később maguk a projektfejlesztők javították. Örülök, hogy úgy érezzük, hogy az Ön által fejlesztett eszköz valós, látható és kézzelfogható előnyökkel jár a világ számára.

Megtekintheti a videojátékok fejlesztésével kapcsolatos összes cikkünk listáját, ilyen vagy olyan módon. Blogunk külön oldala .

Következtetés

Ezen a ponton a cikkem véget ér. Tiszta és hibátlanul működő kódot kívánok!

Érdekli a statikus elemzés témája? Szeretné ellenőrizni, hogy a projektben nincsenek-e hibák? Próbálja ki a PVS-Studio alkalmazást.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük