Kuinka staattinen koodianalyysi auttaa GameDev-teollisuudessa

( 4. joulukuuta 2020)

Peliteollisuus kehittyy jatkuvasti ja kehittyy nopeammin kuin ylinopeus. Teollisuuden kasvun myötä myös kehityksen monimutkaisuus kasvaa: koodikanta kasvaa ja myös vikojen määrä kasvaa. Siksi nykyaikaisissa pelihankkeissa on kiinnitettävä erityistä huomiota koodin laatuun. Tänään käsittelemme yhtä tapaa tehdä koodistasi kunnollisempi, eli staattinen analyysi, samoin kuin miten PVS-Studio käytännössä auttaa erikokoisten peliprojektien kehittämisessä.

”Tärkeintä, mitä olen tehnyt ohjelmoijana viime vuosina, on jatkaa aggressiivisesti staattista koodianalyysiä. Vielä arvokkaampi kuin sadat vakavat virheet, jotka olen estänyt sillä, on ajattelutavan muutos tavassa, jolla tarkastelen ohjelmistojen luotettavuutta ja koodin laatua. ”- John Carmack

Olemme työskennelleet suurten pelikehittäjien kanssa useita vuosia, ja tänä aikana onnistuimme tekemään paljon mielenkiintoista ja hyödyllistä pelialalle. Se ei ole suuri yllätys, kun otetaan huomioon pelialan asiakkaiden luettelo asiakkaistamme . Tuemme aktiivisesti asiakkaitamme: integroimme PVS-Studio omaan kehitysprosessiinsa, korjaamme analysaattorin löytämät virheet ja teemme jopa erityisiä mukautettuja ominaisuuksia.

Lisäksi kehitämme paljon itsenäisesti analysaattori GameDev-suuntaan sekä mainostaa PVS-Studiota kertomalla ihmisille mielenkiintoisista virheistä, joita se on löytänyt erilaisissa videopeleissä.

Toki, meillä on kyllä ​​mielenkiintoisia tarinoita kerrottavaa. Tämä artikkeli kattaa useita tällaisia ​​tapauksia.

PVS-Studio ja Unity

Yksi tapa mainostaa tuotetta on kirjoittamalla artikkeleita avoimien projektien tarkistamisesta. Kaikki hyötyvät näistä artikkeleista: lukija saa mahdollisuuden tarkistaa epätavallisia virheitä tutussa projektissa ja oppia jotain uutta. Mitä tulee PVS-Studio-tiimiin, saamme tilaisuuden näyttää tehdyn työn oikealla koodilla, jotta projektin kehittäjät voivat oppia virheistä ja korjata ne etukäteen.

Ensimmäinen suuri tutustumisemme Unityyn tapahtui vuonna 2016, kun tämän pelimoottorin kehittäjät avasivat useiden komponenttien, kirjastojen ja demojen lähdekoodin virallisessa arkistossaan. Ei ihme, emme voineet ohittaa tällaista houkuttelevaa tapausta ja halusimme kirjoittaa artikkelin lähetetyn koodin tarkistamisesta.

Sitten saimme selville, että Unity3D-koodi (tuolloin moottoria kutsuttiin niin) oli erittäin korkealaatuista. Mutta silti pystyimme löytämään siinä melko paljon vakavia virheitä. Heitä riitti kirjoittamaan artikkelin .

Kaksi vuotta myöhemmin tapahtui toinen asia – Unityn kehittäjät avasivat moottorin koodin ja toimittaja itse. Aivan kuten edellisellä kerralla, emme voineet olla huomaamatta sitä ja tarkistaneet moottorin lähdekoodin. Ja se ei ollut mitään turhaa – löysimme myös joukon kiehtovia puutteita.

Samalla aikomuksemme ovat paljon pidemmälle kuin vain kirjoittaminen artikkeleita. Jatkamme työtä PVS-Studion parissa, ja GameDev on yksi merkittävimmistä alueistamme kehityksellemme. Siksi haluamme, että Unity-pelinkehittäjät voivat saada parhaan mahdollisen analyysin projekteistaan.

Yksi vaiheista Unity-projektien analyysin laadun parantamiseksi oli merkintöjen kirjoittaminen Unity Scripting -sovellusliittymässä määritetyille menetelmille. .

Menetelmämerkintä on erityinen mekanismi, jota käytetään PVS-Studiossa. Sen avulla käyttäjä voi toimittaa analysaattorille kaikki tarvittavat tiedot tietystä menetelmästä. Analysaattorikehittäjät itse (ts. Me) kirjoittavat sen erityiskoodina.

Nämä tiedot voivat olla täysin erilaisia. Esimerkiksi: miten menetelmä voi vaikuttaa sille välitettäviin parametreihin, voiko se allokoida muistia ja palauttaako se käsiteltävän arvon. Täten merkinnät mahdollistavat analysaattorin ymmärtää paremmin menetelmien logiikan, jolloin se pystyy havaitsemaan uudet ja monimutkaisemmat virheet.

Olemme jo kirjoittaneet valtavan määrän erilaisia ​​merkintöjä (esimerkiksi järjestelmän menetelmille) nimitila), ja lisäsimme niihin mielellämme metodimerkinnät Unity Scripting -sovellusliittymästä.

Aloimme lisätä merkintäluetteloa arvioinnilla. Kuinka monta menetelmää on yhteensä? Mitkä tulisi merkitä ensin? Menetelmiä oli yhteensä paljon, joten päätimme aloittaa merkitsemällä useimmin käytetyt menetelmät.

Näin etsimme suosittuja menetelmiä: ensin keräsimme joukon GitHubin projekteja, jotka käyttävät Unity-ominaisuuksia, ja sitten käytimme itse kirjoittamaasi apuohjelmaa (Roslynin perusteella) laskemaan puhelut menetelmät, joista olimme kiinnostuneita. Tuloksena saatiin luettelo luokista, joiden menetelmiä käytettiin eniten:

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

Seuraavaksi se jäi merkitä näiden luokkien menetelmät. Luomme testiprojektin ja kaivoimme dokumentaatioon saadaksemme mahdollisimman paljon tietoa näistä menetelmistä. Yritimme esimerkiksi välittää null erilaisina argumentteina selvittääkseen, miten ohjelma käyttäytyy.

Tällaisissa tarkastuksissa löysimme aika ajoin mielenkiintoisia asiakirjoittomia tietoja. Löysimme moottorista jopa pari huomionarvoista vikaa. Esimerkiksi kun käytämme seuraavaa koodia:

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

Unity-editori itse kaatuu (ainakin versiossa 2019.3.10f1). Tietenkin on epätodennäköistä, että kukaan kirjoittaa tällaisen koodin. Silti se, että Unity-editori voi kaatua suorittamalla tällaisen komentosarjan, on utelias.

Meillä oli siis merkinnät kirjoitettu. Analyysin suorittamisen jälkeen löysimme välittömästi uudet laukaisut. Esimerkiksi analysaattori havaitsi outon kutsun GetComponent -menetelmään:

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

Analysaattorin varoitus: V3010 Funktion GetComponent palautusarvoa on käytettävä. – LISÄTIETOJA NYKYISESSÄ UIEditorWindow.cs 22

Menetelmä GetComponent tarkoittaa tietyn arvon palauttamista jopa sen nimeen. On loogista olettaa, että tätä arvoa tulisi käyttää jollakin tavalla. Uuden huomautuksen ansiosta analysaattori tietää, että tällainen ”valvomaton” kutsu tähän menetelmään voi viitata loogiseen virheeseen ja varoittaa siitä.

Tämä ei ole ainoa varoitus, joka ilmestyi testiprojekteja uusien merkintöjen lisäämisen jälkeen. En mainitse loput, jotta ei tekisi tästä artikkelista liian suurta. Tärkeintä on, että nyt PVS-Studiota käyttävien Unity-projektien kehittäminen antaa sinun kirjoittaa paljon turvallisemman ja puhtaamman koodin ilman virheitä.

Jos haluat lukea lisää työstämme Unity-menetelmien huomautuksilla, tässä on artikkeli: Miten PVS-Studio-analysaattori alkoi löytää vielä enemmän virheitä Unity-projekteissa .

Unreal Engine 4

Kun Unreal kehittäjät vuonna 2014 Moottori 4 avasi moottorin lähdekoodin, emme yksinkertaisesti päässeet ohitse projektia, ja kirjoitimme siitä myös artikkelin . Moottorikehittäjät pitivät artikkelista ja korjasivat löytämämme virheet. Mutta tämä ei riittänyt meille, ja päätimme yrittää myydä analysaattorimme lisenssin Epic Gamesille.

Epic Games oli kiinnostunut parantamaan moottoriaan PVS-Studion avulla, joten sovimme seuraavasta : korjaamme Unreal Engine -koodin itse, jotta analysaattori ei anna varoituksia, ja Epic Gamesin kaverit ostavat lisenssimme ja palkitsevat meidät lisäksi tehdystä työstä.

Miksi kaikki varoitukset oli kiinteä? Tosiasia on, että staattisesta analyysistä voi saada parhaan hyödyn korjaamalla virheet heti kun ne näkyvät . Kun tarkistat projektisi ensimmäistä kertaa, saat yleensä useita satoja (ja joskus tuhansia) varoituksia. Kaikkien näiden analysaattorien laukaisujen joukosta on helppo menettää vasta kirjoitetulle koodille annettuja varoituksia.

Ensi silmäyksellä tämä ongelma voidaan ratkaista melko helposti: sinun tarvitsee vain istua alas ja käydä läpi koko raportti. korjaamalla virheet asteittain. Vaikka tämä menetelmä on intuitiivisempi, se voi viedä aikaa. Suojaustiedostojen käyttö on paljon kätevämpää ja nopeampaa.

Pakkaustiedostot ovat PVS-Studion erikoisominaisuus , jonka avulla voit piilottaa analysaattorin varoitukset erityisessä tiedostossa. Piilotetut varoitukset eivät kuitenkaan näy seuraavissa lokeissa: voit tarkastella niitä erikseen.

Kun olet saanut useita käynnistyksiä ensimmäisen tarkistuksen jälkeen, voit lisätä kaikki havaitut varoitukset estotiedostoon muutamalla napsautuksella ja saat seuraavan tarkistuksen jälkeen puhtaan lokin ilman yhtä merkintää.

Nyt kun vanhoja varoituksia ei enää ole lokissa, voit helposti tunnistaa uuden varoituksen heti, kun se ilmestyy. Toimintojen järjestys on seuraava: kirjoita koodi -> tarkista se analysaattorilla -> etsi uusi varoitus -> korjaa virhe. Näin saat kaiken irti analysaattorin käytöstä.

Älä kuitenkaan unohda tukahdustiedoston varoituksia: ne voivat silti sisältää varoituksia merkittävistä virheistä ja haavoittuvuuksista, kuten aiemmin. Siksi on palattava näihin varoituksiin ja vähennettävä niiden määrää säännöllisesti.

Epäilemättä tämä skenaario on kätevä, mutta Epic Gamesin kehittäjät halusivat koodinsa korjattavan heti, joten he ohittivat tehtävä meille.

Ja aloitimme työn. Tarkistettuamme projektikoodin löysimme 1821 varoitusta tasosta_1 ja tasosta_2. Tällaisen suuren määrän varoitusten jäsentäminen vaatii vakavaa työtä, ja tämän prosessin helpottamiseksi olemme asettaneet jatkuvan koodianalyysin CI-palvelimellemme.

Se näytti tältä: joka ilta palvelimellamme, nykyinen Unreal Engine 4 -versio rakennettiin, ja heti koontin jälkeen analyysi aloitettiin automaattisesti. Niinpä kun kaverimme tulivat töihin aamulla, heillä oli aina uusi raportti analysaattorilta, mikä auttoi heitä seuraamaan varoitusten poistamisen edistymistä. Lisäksi tämän järjestelmän avulla voimme tarkistaa rakenteiden vakauden milloin tahansa suorittamalla sen palvelimella manuaalisesti.

Koko prosessi kesti 17 työpäivää. Virheiden korjaamisen aikataulu oli seuraava:

Itse asiassa tämä aikataulu ei heijasta täysin työtämme. Korjattuamme kaikki varoitukset odotimme vielä kaksi päivää, kunnes he hyväksyivät viimeisimmät vetopyynnöt. Koko tämän ajan uusinta Unreal Enginen versiota tarkistettiin automaattisesti, mikä puolestaan ​​päivitettiin uudella koodilla. Joten mitä luulet tapahtuneen? Noiden kahden päivän aikana PVS-Studio löysi koodista vielä neljä virhettä! Yksi niistä oli ratkaiseva ja saattaa johtaa määrittelemättömään käyttäytymiseen.

Tietysti korjasimme myös nuo virheet. Tuolloin Unreal Enginen kehittäjillä oli vain yksi asia jäljellä: perustanut automaattisen analyysin omalle paikalleen, aivan kuten olemme tehneet. Siitä hetkestä lähtien he alkoivat nähdä päivittäin varoituksia juuri kirjoittamastaan ​​koodista. Tämä antoi heille mahdollisuuden korjata virheet koodissa heti, kun ne ilmestyivät – kehityksen varhaisimmissa vaiheissa .

Voit lukea lisää Unreal Engine -koodin käsittelystä artikkelista virallinen Unreal Engine -blogi tai verkkosivustollamme .

Analyysi erilaiset pelit

Mainitsinko tarkistaa erilaisia ​​avoimia projekteja ja kirjoittaa niistä artikkeleita? Joten meillä on nyt paljon samanlaisia ​​artikkeleita peliprojekteista! Kirjoitimme peleistä, kuten VVVVVV , Avaruusinsinöörit , Komento & Conque r, osu! ja jopa (hyvin varhainen artikkeli) Doom 3 . Olemme myös koonneet top 10 videopelialan mielenkiintoisimmat ohjelmavirheet.

Joten tarkistimme todennäköisesti suurimman osan tunnetut avoimen lähdekoodin moottorit. Unity ja Unreal Engine 4: n lisäksi projektit, kuten Godot , Bullet , Amazonin puutavarahalli , Cry Engine V ja monet muut ovat joutuneet silmäyksemme alle. p> Parasta kaikessa tässä on se, että projektikehittäjät korjaivat myöhemmin monet kuvailemistamme virheistä. On mukava tuntea, että kehittämäsi työkalu tuo todellisia, näkyviä ja konkreettisia etuja maailmalle.

Voit tarkastella luetteloa kaikista videopelien kehittämiseen liittyvistä artikkeleistamme tavalla tai toisella sivustolla. erikoissivu blogissamme.

Päätelmä

Tässä vaiheessa artikkelini päättyy. Toivotan sinulle puhtaan ja oikein toimivan koodin ilman virheitä ja virheitä!

Kiinnostaako staattisen analyysin aihe? Haluatko tarkistaa projektisi virheiden varalta? Kokeile PVS-Studio .

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *