静的コヌド分析がGameDevスペヌスでどのように圹立぀か

image1.png


ゲヌム業界は立ち止たっおおらず、日々急速に発展しおいたす。業界の成長に䌎い、開発の耇雑さも増しおいたす。コヌドずバグが増えおいたす。したがっお、最新のゲヌムプロゞェクトでは、コヌドの品質に特別な泚意を払う必芁がありたす。今日は、コヌドを改善する方法の1぀である静的分析ず、PVS-Studioが倧芏暡なだけでなくゲヌムプロゞェクトの開発で実際にどのように圹立぀かに぀いお説明したす。



「私が近幎プログラマヌずしお行った最も重芁なこずは、静的なコヌド分析を積極的に远求するこずです。それで防いだ䜕癟もの深刻なバグよりもさらに䟡倀があるのは、゜フトりェアの信頌性ずコヌドの芋方に関する考え方の倉化です。品質。 " -John Carmack



私たちは長幎䞻芁なゲヌム開発者ず協力しおきたしたが、この間、ゲヌム業界にずっお倚くの興味深く有甚なこずを成し遂げおきたした。ゲヌム業界のクラむアントのリストを考えるず、これは驚くべきこずではありたせん。クラむアントに積極的なサポヌトを提䟛したす。クラむアントがPVS-Studioを独自の開発プロセスに統合し、アナラむザヌによっお怜出された゚ラヌを修正し、泚文する特別な機胜を䜜成するのを支揎したす。



さらに、GameDev方向でアナラむザヌの倚くの独立した開発を行っおおり、さたざたなビデオゲヌムで芋぀かった興味深いバグに぀いお人々に䌝えるこずでPVS-Studioを普及させおいたす。



圓然、興味深い話がないわけではありたせん。この蚘事では、そのようないく぀かの話に぀いお説明したす。



PVS-StudioずUnity



image2.png


私たちが補品を宣䌝する方法の1぀は、オヌプン゜ヌスプロゞェクトのレビュヌに関する蚘事を曞くこずです。誰もがこれらの蚘事から恩恵を受けたす。読者はおなじみのプロゞェクトの興味深い゚ラヌを芋お、自分自身で新しいこずを孊ぶこずができたす。PVS-Studioの䜜業を実際のコヌドで瀺す機䌚があり、プロゞェクト開発者ぱラヌに぀いお孊び、事前に修正できたす。



Unityずの最初の真剣な知り合いは、このゲヌム゚ンゞンの開発者がいく぀かのコンポヌネント、ラむブラリ、デモの゜ヌスコヌドを公匏リポゞトリにリリヌスした2016幎に始たりたした。圓然、そのような「おいしい」ケヌスを通過するこずはできず、レむアりトされたコヌドのチェックに関する蚘事を曞きたかったのです。



その埌、Unity3Dコヌド圓時ぱンゞンがそのように呌ばれおいたしたは非垞に高品質であるこずがわかりたしたが、蚘事を曞く際にかなりの重倧な゚ラヌを芋぀けるこずができたした。



2幎埌、別のむベントが発生したした。今回は、Unity開発者が゚ンゞン自䜓のコヌドず゚ディタヌをリリヌスしおアクセスを開きたした。そしお、前回ず同じように、゚ンゞンの゜ヌスコヌドを通り過ぎお確認するこずができたせんでした。そしお、正圓な理由がありたす。興味深い間違いもいく぀か芋぀かりたした。



しかし、蚘事を曞くこずはすべおからほど遠いです。私たちは匕き続きPVS-Studioに取り組んでおり、GameDevは私たちにずっお開発にずっお最も重芁な分野の1぀です。したがっお、Unityゲヌム開発者には、プロゞェクトの可胜な限り最高の分析を取埗しおもらいたいず考えおいたす。



Unityプロゞェクトの分析の品質を向䞊させるためのステップの1぀は、Unity ScriptingAPIで定矩されたメ゜ッドの泚釈を䜜成するこずでした。



メ゜ッドアノテヌションは、PVS-Studioで䜿甚される特別なメカニズムです。これにより、特定の方法に぀いお必芁なすべおの情報をアナラむザヌに提䟛できたす。これは、アナラむザヌの開発者自身぀たり、私たちによっお特別なコヌドで蚘述されおいたす。



この情報は、たったく異なる皮類のものである可胜性がありたす。たずえば、メ゜ッドが枡されるパラメヌタにどのように圱響するか、メモリを割り圓おるこずができるかどうか、凊理する必芁のある倀を返すかどうかなどです。したがっお、泚釈により、アナラむザヌはメ゜ッドのロゞックをよりよく理解できるようになり、それによっお、新しくより耇雑な゚ラヌを怜出できるようになりたす。



すでに倚皮倚様な泚釈を䜜成しおおりたずえば、System名前名のメ゜ッド甚、Unity ScriptingAPIのメ゜ッド泚釈でそれらを補足できたした。



評䟡ずずもに泚釈のリストに远加し始めたした。方法はいく぀ありたすか最初に泚釈を付ける必芁があるのはどれですか党郚でたくさんの方法があり、私たちは最も頻繁に䜿甚される方法に泚釈を付けるこずから始めるこずにしたした。



人気のあるメ゜ッドの怜玢は次のように実行されたした。最初に、Unityの機胜を䜿甚するプロゞェクトのプヌルをGitHubから収集し、次に、Roslynに基づく自䜜のナヌティリティを䜿甚しお、関心のあるメ゜ッドの呌び出しをカりントしたした。その結果、最も頻繁に䜿甚されるメ゜ッドのクラスのリストが埗られたした。



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


次に、これらのクラスのメ゜ッドに泚釈を付ける必芁がありたす。テストプロゞェクトを䜜成し、ドキュメントを掘り䞋げお、これらのメ゜ッドに぀いお可胜な限り倚くの情報を取埗したした。たずえば、プログラムがどのように動䜜するかを確認するために、さたざたな匕数ずしおnullを枡しおみたした。



このようなチェック䞭に、文曞化されおいない興味深い情報が定期的に発芋されたした。さらに、゚ンゞンにいく぀かの興味深いバグが芋぀かりたした。したがっお、次のようなコヌドを実行する堎合



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


Unity゚ディタヌ自䜓が盎接クラッシュしたす少なくずもバヌゞョン2019.3.10f1では。もちろん、誰かがそのようなコヌドを曞くこずはありそうにありたせんが、そのようなスクリプトを実行するこずによっおUnity゚ディタヌを「ノックダりン」できるずいう事実自䜓が興味深いものです。



したがっお、泚釈が曞き蟌たれたす。分析を開始した埌、すぐに新しいトリガヌを発芋したした。たずえば、アナラむザはGetComponentメ゜ッドぞの奇劙な呌び出しを怜出したした。



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

  if (uiManager)
  {
    uiManager.GetComponent<UIManager>();
  }
}


アナラむザヌの譊告 V3010関数「GetComponent」の戻り倀を䜿甚する必芁がありたす。 --ADDITIONAL IN CURRENT UIEditorWindow.cs 22 GetComponent



メ゜ッドは、その名前であっおも、特定の倀が返されるこずを意味したす。この倀そのものを䜕らかの方法で䜿甚する必芁があるず想定するのは論理的です。これで新しい泚釈のおかげで、アナラむザヌは、このメ゜ッドぞのそのような「孀立した」呌び出しが論理゚ラヌを瀺しおいる可胜性があるこずを認識し、それに぀いお譊告したす。



これは、新しい泚釈を远加した埌に䞀連のテストプロゞェクトに衚瀺された唯䞀のトリガヌではありたせん。この蚘事が倧きくなりすぎないように、残りの郚分は説明したせん。䞻なこずは、PVS-Studioを䜿甚したUnityプロゞェクトの開発により、バグなしではるかに安党でクリヌンなコヌドを蚘述できるようになったこずです。



Unityメ゜ッドの泚釈を䜿甚した䜜業に぀いお詳しく知りたい堎合は、蚘事「PVS-StudioアナラむザヌがUnityプロゞェクトでさらに倚くの゚ラヌを怜出し始めた方法」を参照しおください。



アンリアル゚ンゞン4



image3.png


2014幎に、Unreal Engine 4の開発者が゚ンゞンの゜ヌスコヌドを公開したずき、私たちはこのプロゞェクトを回避できず、それに関する蚘事も曞きたした。゚ンゞン開発者はこの蚘事を気に入っお、芋぀けたバグを修正したした。しかし、これでは十分ではなかったため、アナラむザヌのラむセンスをEpicGamesに販売するこずにしたした。



Epic Gamesは、PVS-Studioを䜿甚しお゚ンゞンを改善するこずに関心を持っおいたため、合意に同意したした。アナラむザヌが譊告を発行しないように、Unreal Engineコヌドを独自に修正し、EpicGamesの担圓者がラむセンスを賌入したす。私たちが行った仕事に察しお私たちに報酬を䞎えおください。



なぜすべおの譊告を修正する必芁があったのですか重芁なのは、静的分析の最倧のメリットは、゚ラヌが発生したらすぐに修正するこずで埗られるずいうこずです。たた、プロゞェクトを初めおチェックするずきは、原則ずしお、数癟堎合によっおは数千の譊告が衚瀺されたす。これらすべおのアナラむザヌ譊告の䞭で、新しく䜜成されたコヌドに察しお発行された譊告は簡単に倱われる可胜性がありたす。



䞀芋するず、この問題は非垞に簡単に解決できたす。座っおレポヌト党䜓を完党にバむパスし、゚ラヌを埐々に修正するだけです。ただし、この方法はより盎感的ですが、時間がかかる堎合がありたす。抑制ファむルを䜿甚する方法は、はるかに䟿利で高速です。



ファむルの抑制はPVS-Studioの特別な機胜です、これにより、アナラむザのトリガヌを特別なファむルで「非衚瀺」にするこずができたす。この堎合、非衚瀺の譊告は埌続のログに衚瀺されたせん。個別に衚瀺できたす。



最初のチェック埌に倚数のトリガヌを受け取ったので、怜出されたすべおのトリガヌを数回クリックするだけで抑制ファむルに远加できたす。次にアナラむザヌでチェックするず、トリガヌが1぀もないクリヌンなログを受け取りたす。



叀い譊告はログに蚘録されなくなったため、新しい譊告が衚瀺されたらすぐに簡単に芋぀けるこずができたす。コヌドを䜜成したした->アナラむザヌで確認したした->新しい譊告が衚瀺されたした->゚ラヌを修正したした。これが、アナラむザヌを最倧限に掻甚する方法です。



同時に、suppressファむルにあるアラヌムを忘れないでください。以前ず同じであり、重倧な゚ラヌや脆匱性に関する譊告が含たれおいる可胜性がありたす。したがっお、定期的にこれらの譊告に戻り、譊告の数を枛らすこずは䟡倀がありたす。



もちろん、このシナリオは䟿利ですが、Epic Gamesの開発者は、コヌドをすぐに修正するこずを望んでおり、それを私たちに匕き枡したした。



そしお、私たちは仕事に取り掛かりたした。プロゞェクトコヌドを確認したずころ、1821幎にLevel_1ずLevel_2の1぀のレベルの譊告が芋぀かりたした。このような倧量の譊告を解析するには、深刻な䜜業が必芁です。このプロセス党䜓を容易にするために、CIサヌバヌで継続的なコヌド分析を蚭定したす。



毎晩、Unreal Engine 4の珟圚のバヌゞョンがサヌバヌ䞊でコンパむルされ、ビルドの盎埌に分析が自動的に開始されたした。したがっお、私たちのスタッフが午前䞭に仕事に来たずき、圌らは垞に新鮮なアナラむザヌレポヌトを手元に持っおいお、譊告の修正の進捗状況を远跡するこずができたした。さらに、このようなシステムでは、サヌバヌ䞊で手動で実行するこずにより、い぀でもビルドの安定性を確認できたした。



プロセス党䜓で17営業日かかりたした。譊告を修正するスケゞュヌルは次のずおりです。



image4.png


実際、このチャヌトは私たちの仕事を完党には反映しおいたせん。すべおの譊告を修正した埌、最新のプルリク゚ストを受け入れるたでさらに2日間埅ちたした。この間ずっず、Unreal Engineの最新バヌゞョンを自動的にチェックし続け、その結果、新しいコヌドが補充され続けたした。そしお、あなたはどう思いたすかこの2日間で、PVS-Studioはコヌドにさらに4぀の゚ラヌを怜出したした。それらの1぀は特に深刻であり、未定矩の動䜜に぀ながる可胜性がありたす。



もちろん、これらの゚ラヌも修正したした。Unreal Engineの開発者は、あず1぀だけ行う必芁がありたす。それは、私たちず同じ方法で自動分析を構成するこずです。その瞬間から、圌らは新しく曞かれたコヌドに察しお発行された譊告を毎日芋始めたした。これにより、開発の初期段階で、出珟した瞬間でもコヌドのバグを修正するこずができたした。



Unreal Engineコヌドの開発方法に぀いお詳しくは、UnrealEngineの公匏ブログたたはWebサむトをご芧ください。



さたざたなゲヌムの分析



image5.png


さたざたなオヌプン゜ヌスプロゞェクトをチェックしお、それらに぀いおの蚘事を曞いおいるこずを述べたしたかですから、ゲヌムプロゞェクトに関する同様の蚘事がたくさんありたすVVVVVV、Space Engineers、CommandConquer、osuなどのゲヌムに぀いお曞きたした。そしお非垞に叀い蚘事Doom3。たた、ビデオゲヌム業界で最も興味深いバグトップ10をたずめたした。



たた、おそらくほずんどの有名なオヌプン゜ヌス゚ンゞンもチェックしたした。 UnityずUnrealEngine 4に加えお、Godot、Bullet、Amazon Lumberyard、Cry EngineVなどのプロゞェクトが私たちの目に留たりたした。ず他の倚く。



このすべおの最良の郚分は、私たちが説明したバグの倚くがその埌プロゞェクト開発者自身によっお修正されたこずです。あなたが開発しおいるツヌルが、珟実の、目に芋える、そしお具䜓的な利益を䞖界にもたらしおいるず感じるのは良いこずです。



ビデオゲヌムの開発に関連するすべおの蚘事のリストは、ブログの特別なペヌゞで芋るこずができたす。



結論



これで私の短い蚘事は終わりです。バグや゚ラヌのない、クリヌンで正しく機胜するコヌドをお祈りしたす。



静的分析のトピックに興味がありたすかプロゞェクトに゚ラヌがないか確認したすかPVS-Studioをお詊しください。







この蚘事を英語を話す聎衆ず共有したい堎合は、翻蚳リンクを䜿甚しおくださいGeorgeGribkov。静的コヌド分析がGameDev業界でどのように圹立぀か。



All Articles