In che modo lanalisi statica del codice aiuta nel settore GameDev

( 4 dicembre 2020)

Lindustria dei giochi è in continua evoluzione e si sta sviluppando più velocemente di un proiettile in corsa. Insieme alla crescita del settore, aumenta anche la complessità dello sviluppo: la base di codice è sempre più grande e anche il numero di bug è in crescita. Pertanto, i progetti di giochi moderni devono prestare particolare attenzione alla qualità del codice. Oggi tratteremo uno dei modi per rendere il tuo codice più decente, che è lanalisi statica, nonché come PVS-Studio in pratica aiuta nello sviluppo di progetti di gioco di varie dimensioni.

“La cosa più importante che ho fatto come programmatore negli ultimi anni è per perseguire in modo aggressivo lanalisi statica del codice. Ancora più prezioso delle centinaia di bug gravi che ho prevenuto è il cambiamento di mentalità sul modo in cui vedo laffidabilità del software e la qualità del codice. ”- John Carmack

Lavoriamo con importanti sviluppatori di giochi da molti anni e durante questo periodo siamo riusciti a fare molte cose interessanti e utili per lindustria dei giochi. Non è una sorpresa, dato l elenco dei nostri clienti del settore dei giochi. Supportiamo attivamente i nostri clienti: per integrare PVS-Studio nel loro processo di sviluppo, correggere gli errori trovati dallanalizzatore e realizziamo anche funzioni speciali personalizzate.

Inoltre, facciamo molto sviluppo indipendente di lanalizzatore nella direzione di GameDev, oltre a promuovere PVS-Studio, raccontando alla gente gli errori interessanti che ha trovato in vari videogiochi.

Certo, abbiamo alcune storie interessanti da raccontare. Questo articolo tratterà diversi casi simili.

PVS-Studio e Unity

Uno dei modi in cui promuoviamo il nostro prodotto è scrivere articoli sul controllo dei progetti aperti. Tutti traggono vantaggio da questi articoli: un lettore ha la possibilità di verificare alcuni errori insoliti in un progetto familiare e imparare qualcosa di nuovo. Per quanto riguarda il team di PVS-Studio, abbiamo lopportunità di mostrare il lavoro svolto sul codice reale, in modo che gli sviluppatori del progetto possano conoscere gli errori e risolverli in anticipo.

La nostra prima grande conoscenza di Unity ha avuto luogo nel 2016, quando gli sviluppatori di questo motore di gioco hanno aperto il codice sorgente di diversi componenti, librerie e demo nel loro repository ufficiale. Non cè da stupirsi, non siamo riusciti a ignorare un caso così allettante e volevamo scrivere un articolo sul controllo del codice pubblicato.

Poi abbiamo scoperto che il codice Unity3D (a quel tempo il motore era chiamato così) era di altissima qualità. Tuttavia, siamo stati in grado di trovare molti errori gravi. Ce nerano abbastanza per scrivere un articolo .

Due anni dopo, accadde unaltra cosa: gli sviluppatori di Unity aprirono il codice del motore e leditore stesso. E proprio come la volta precedente, non potevamo non notarlo e abbiamo controllato il codice sorgente del motore. E non è stato per niente: abbiamo anche trovato un gruppo di difetti accattivanti.

Allo stesso tempo le nostre intenzioni vanno ben oltre la semplice scrittura articoli. Continuiamo a lavorare su PVS-Studio e GameDev è una delle aree più significative per il nostro sviluppo. Pertanto, vogliamo che gli sviluppatori di giochi Unity siano in grado di ottenere la migliore analisi possibile dei loro progetti.

Uno dei passaggi per migliorare la qualità dellanalisi dei progetti Unity è stato scrivere annotazioni per i metodi definiti nellAPI di scripting di Unity .

Lannotazione del metodo è un meccanismo speciale utilizzato in PVS-Studio. Consente a un utente di fornire allanalizzatore tutte le informazioni necessarie su un particolare metodo. È scritto in un codice speciale dagli stessi sviluppatori dellanalizzatore (cioè da noi).

Queste informazioni possono essere di tipo completamente diverso. Ad esempio: come il metodo può influenzare i parametri che gli vengono passati, se può allocare memoria e se restituisce un valore che deve essere gestito. Pertanto, lannotazione consente allanalizzatore di comprendere meglio la logica dei metodi, consentendogli di rilevare errori nuovi e più complessi.

Abbiamo già scritto un numero enorme di annotazioni diverse (ad esempio, per i metodi dal sistema namespace) e siamo stati lieti di aggiungere loro annotazioni di metodo dallAPI Unity Scripting.

Abbiamo iniziato ad estendere lelenco delle annotazioni con una valutazione. Quanti metodi ci sono in totale? Quali dovrebbero essere annotati per primi? Cerano molti metodi in totale, quindi abbiamo deciso di iniziare annotando quelli usati più di frequente.

Questo è il modo in cui stavamo cercando metodi popolari: prima, abbiamo raccolto un pool di progetti da GitHub che utilizzano le caratteristiche di Unity, e poi abbiamo usato unutilità scritta da noi (basata su Roslyn) per calcolare le chiamate a i metodi che ci interessavano. Di conseguenza, abbiamo ottenuto un elenco di classi i cui metodi sono stati utilizzati più spesso:

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

Successivamente, è rimasto per annotare i metodi di queste classi. Abbiamo creato un progetto di test e approfondito la documentazione per ottenere quante più informazioni possibili su questi metodi. Ad esempio, abbiamo provato a passare null come vari argomenti per vedere come si sarebbe comportato il programma.

Durante tali controlli, di tanto in tanto stavamo scoprendo alcune interessanti informazioni non documentate. Abbiamo anche trovato un paio di bug degni di nota nel motore. Ad esempio, quando eseguiamo il codice seguente:

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

leditor di Unity stesso si arresta in modo anomalo (almeno nella versione 2019.3.10f1). Ovviamente è improbabile che qualcuno scriva tale codice. Tuttavia il fatto che leditor di Unity possa essere bloccato eseguendo uno script del genere è curioso.

Quindi, abbiamo scritto le annotazioni. Dopo aver eseguito lanalisi, abbiamo immediatamente trovato nuovi trigger. Ad esempio, lanalizzatore ha rilevato una strana chiamata al metodo GetComponent :

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

Avviso dellanalizzatore: V3010 È necessario utilizzare il valore di ritorno della funzione “GetComponent”. – ADDITIONAL IN CURRENT UIEditorWindow.cs 22

Il metodo GetComponent implica la restituzione di un valore specifico anche se al suo nome. È logico presumere che questo valore debba essere utilizzato in qualche modo. Ora grazie alla nuova annotazione, lanalizzatore sa che una tale chiamata “non presidiata” a questo metodo può indicare un errore logico e lo avverte.

Questo non è lunico avvertimento che è apparso nellinsieme del nostro testare i progetti dopo aver aggiunto nuove annotazioni. Non citerò il resto, per non rendere questo articolo troppo grande. La cosa principale è che ora lo sviluppo di progetti Unity utilizzando PVS-Studio ti consente di scrivere codice molto più sicuro e pulito senza bug.

Se desideri saperne di più sul nostro lavoro con le annotazioni per i metodi Unity, ecco larticolo: Come lanalizzatore PVS-Studio ha iniziato a trovare ancora più errori nei progetti Unity .

Unreal Engine 4

Quando, nel 2014, gli sviluppatori di Unreal Il motore 4 ha aperto il codice sorgente del motore, semplicemente non siamo riusciti a superare quel progetto e abbiamo anche scritto un articolo al riguardo. Gli sviluppatori del motore hanno apprezzato larticolo e hanno corretto gli errori che abbiamo riscontrato. Ma questo non ci bastava e abbiamo deciso di provare a vendere la licenza del nostro analizzatore a Epic Games.

Epic Games era interessata a migliorare il suo motore con PVS-Studio, quindi abbiamo concordato quanto segue : correggiamo il codice Unreal Engine da soli in modo che lanalizzatore non emetta alcun avviso e i ragazzi di Epic Games acquistano la nostra licenza e inoltre ci ricompensano per il lavoro svolto.

Perché tutti gli avvisi dovevano essere fisso? Il fatto è che si può ottenere il massimo beneficio dallanalisi statica correggendo gli errori proprio quando compaiono . Quando controlli il tuo progetto per la prima volta, di solito ricevi diverse centinaia (e talvolta migliaia) di avvisi. Tra tutti questi trigger dellanalizzatore, è facile perdere gli avvisi emessi per il codice appena scritto.

A prima vista, questo problema può essere risolto abbastanza facilmente: devi solo sederti e esaminare lintero rapporto , correggendo gradualmente gli errori. Tuttavia, sebbene questo metodo sia più intuitivo, potrebbe essere necessario del tempo. È molto più comodo e veloce usare i file di soppressione.

I file di soppressione sono una caratteristica speciale di PVS-Studio che ti permette di nascondere avvisi dellanalizzatore in un file speciale. Tuttavia, gli avvisi nascosti non appariranno nei log successivi: puoi visualizzarli separatamente.

Dopo aver avuto molti trigger dopo il primo controllo, puoi aggiungere tutti gli avvisi rilevati al file di soppressione in un paio di clic e otterrai un registro pulito senza una sola voce dopo il controllo successivo.

Ora che i vecchi avvisi non sono più inclusi nel registro, puoi facilmente rilevare un nuovo avviso immediatamente quando appare. Ecco lordine delle azioni: scrivi il codice -> controlla con lanalizzatore -> individua un nuovo avviso -> correggi lerrore. In questo modo otterrai il massimo dallutilizzo dellanalizzatore.

Allo stesso tempo, non dimenticare gli avvisi nel file di soppressione: possono ancora contenere avvisi su errori importanti e vulnerabilità, proprio come prima. Pertanto, si dovrebbe tornare a questi avvisi e ridurne il numero su base regolare.

Senza dubbio, questo scenario è conveniente, ma gli sviluppatori di Epic Games volevano che il loro codice venisse corretto immediatamente, quindi hanno passato il compito a noi.

E dobbiamo lavorare. Dopo aver verificato il codice del progetto, abbiamo trovato 1821 avvisi di Level_1 e Level_2. Lanalisi di un volume così elevato di avvisi richiede un lavoro serio e per facilitare lintero processo, abbiamo impostato unanalisi continua del codice sul nostro server CI.

Sembrava così: ogni notte sul nostro server, lattuale è stata creata la versione di Unreal Engine 4 e, subito dopo la compilazione, lanalisi è stata avviata automaticamente. Pertanto, quando i nostri ragazzi venivano a lavorare la mattina, ricevevano sempre un nuovo rapporto dallanalizzatore, che li aiutava a monitorare i progressi nelleliminazione degli avvisi. Inoltre, questo sistema ci ha permesso di controllare la stabilità della build in qualsiasi momento eseguendolo manualmente sul server.

Lintero processo ha richiesto 17 giorni lavorativi. La pianificazione per la correzione degli errori era la seguente:

In effetti, questo programma non riflette completamente il nostro lavoro. Dopo aver corretto tutti gli avvisi, abbiamo aspettato altri due giorni prima che accettassero le nostre ultime richieste pull. Per tutto questo tempo, lultima versione di Unreal Engine veniva controllata automaticamente, che, a sua volta, continuava ad essere aggiornata con un nuovo codice. Allora, cosa pensi sia successo? Durante quei due giorni, PVS-Studio ha trovato altri quattro errori nel codice! Uno di questi era cruciale e poteva potenzialmente portare a un comportamento indefinito.

Naturalmente, abbiamo anche corretto anche questi errori. A quel punto gli sviluppatori di Unreal Engine avevano solo una cosa: impostare lanalisi automatica al loro posto, proprio come abbiamo fatto noi. Da quel momento in poi, hanno iniziato a vedere ogni giorno gli avvisi che venivano emessi per il codice che avevano appena scritto. Ciò ha consentito loro di correggere gli errori nel codice appena sono apparsi, nelle prime fasi di sviluppo .

Puoi leggere ulteriori informazioni su come abbiamo lavorato sul codice Unreal Engine nella blog ufficiale di Unreal Engine o sul nostro sito web .

Analisi di vari giochi

Ho già detto che abbiamo controllare vari progetti aperti e scrivere articoli su di loro? Quindi, ora abbiamo un sacco di articoli simili sui progetti di gioco! Abbiamo scritto di giochi come VVVVVV , Space Engineers , Comando & Conque r, osu! e persino (uno dei primi articoli) Doom 3 . Abbiamo anche compilato la top 10 dei bug software più interessanti dellindustria dei videogiochi.

Quindi, abbiamo controllato probabilmente la maggior parte dei noti motori open source. Oltre a Unity e Unreal Engine 4, progetti come Godot , Bullet , Amazon Lumberyard , Cry Engine V e molti altri sono finiti nel nostro mirino.

La parte migliore di tutto questo è che molti dei bug che abbiamo descritto sono stati successivamente corretti dagli stessi sviluppatori del progetto. È bello sentire che lo strumento che stai sviluppando apporta benefici reali, visibili e tangibili al mondo.

Puoi visualizzare un elenco di tutti i nostri articoli relativi allo sviluppo di videogiochi in un modo o nellaltro su un pagina speciale del nostro blog.

Conclusione

A questo punto il mio articolo giunge al termine. Ti auguro un codice pulito e correttamente funzionante senza bug ed errori!

Ti interessa largomento dellanalisi statica? Vuoi verificare la presenza di errori nel tuo progetto? Prova PVS-Studio .

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *