ゲーム開発現場に長らく存在する課題を解決し、スピードと品質担保を両立させる手段として多くのゲーム開発者が導入を始めているのが、コード解析ツールだ。日本シノプシス 営業本部 ソフトウェアインテグリティグループ シニアプロダクトマーケティングマネージャー 津村直史氏にコード解析ツールについてお話をうかがった。
先日、大手ゲーム会社が家庭用ゲーム機向けのゲーム開発からスマートフォンやオンライン対応の開発へシフトすることを発表した。iPhoneやAndroidの登場でスマートフォン端末が普及し、携帯電話会社が提供するWi-Fiスポットも増えた現在、移動中や出先から通信料金を気にすることなく、月額使用料でオンラインゲームを楽しむユーザーが増え続けている。こうした背景から、ゲーム業界ではマルチプラットフォーム対応の開発環境の人気が高まり、UnityやUnreal Engine、Cocos2d-x/Cocos Studioなどの無料で使える開発ツールに注目が集まっている。
これら無料ツールのメリットの一つは、GUIで直感的に開発できる手軽さだ。最近のゲーム開発現場では市場ニーズに素早く反応して機能改善を図る手段としてアジャイル開発が導入されているが、GUIでゲームをある程度作り込める機能は、こういったニーズにも対応しやすい機能として人気の一因となっているのだろう。
一方で、市場ニーズに素早く反応するために要求やロジックの変更が頻繁に繰り返される結果、バグが生まれてしまう可能性は高まってしまう。前述の無料ツールがGUIで作り込めるのは、あくまでも画面周りやキャラクターの簡単な動きのみで、詳細な機能の作り込みには、Unityの場合はUnityScript(JavaScript)/Boo/C#で、Unreal EngineやCocos2d-x/Cocos Studioの場合はC++でのコーディングが必要となるからだ。だが、ゲーム業界のバグつぶしは人間がプレーして発見するという昔ながらの手法を採用するところも多く、どうしても時間がかかる上、目では見つからなかったバグを取りこぼす可能性もある。
そんな課題を解決し、スピードと品質担保を両立させる手段として多くのゲーム開発者が導入を始めているのが、コード解析ツールだ。特に、コードを実行することなく解析を行う静的解析ツールは、コードのテスト実行前に潜在的なバグを発見し、つぶせることから、テスト工数の削減に大きく貢献する。
本稿では、C#やC++でコーディングする本格的なゲーム開発における静的解析ツール「Coverity」の有効性について、日本シノプシス 営業本部 ソフトウェアインテグリティグループ シニアプロダクトマーケティングマネージャー 津村直史氏にお話をうかがった。
静的解析ツールは大きく分けて2種類ある。特性を理解しないまま導入してしまうと、大きな落とし穴が待っている。一つは、標準規約への違反の有無をチェックし、ベストプラクティスに基づいたコード開発を支援する「コーディング規約チェック系」。もう一つは、メモリリークやデータ破壊、データ競合、セキュリティ問題などのバグ自体を検出する「ランタイムエラー検出系」だ。
「どちらが優れている」というのではなく、互いにできることが異なることから、予算が許すならば両方導入して補完し合うのも手だと、日本シノプシスの津村直史氏は言う。「だが、クリティカルな不具合をさらう目的でコーディング規約チェック系を導入してしまうと、本来探しているバグではないものばかり検出され、時間を無駄にしてしまう」。
そうした過ちを犯さないために、日本シノプシスはCoverity 7.0とMicrosoft Visual Studio 2013に内蔵されている静的解析エンジンFxCopの比較実験を行った。実験では、オープンソースのレタッチソフト「paint.net」プロジェクトで、コード行数10万行を静的解析し、結果を比較した。
「FxCopは、.NETフレームワークのデザインガイドラインに対して準拠状況をチェックする。Coverityは、高度なアルゴリズムに基づきコードの不具合を検出する。実験では、その特性がはっきり分かる結果となった」(津村氏)
実験結果は、FxCopが978の不具合を、Coverityが128の不具合を検出。共通して検出されたものはなかったという。
内訳を見ると両ツールの違いが明確に分かる。FxCopが検出した不具合のうち、970個はコーディング規約に関わるもので、クリティカルな不具合は8個検出された。一方のCoverityは、リソースリークやロジックエラー、NULLの関節参照を含むハンドルされない例外といったクリティカルな不具合を125個検出した。
不具合の検出で誤検知が多過ぎると開発者のレビューコストが上がり、バグ修正のライフサイクルがうまく回らなくなってしまうが、Coverity製品は誤検知率が15%以下を誇る。これにより、大量に上がってくる不要な項目をチェックするという時間の無駄も、最小限に抑えられる。「誤検知率の低さは、さまざまな業界で選ばれる大きな理由でもある」(津村氏)。
検出ロジックでは、統計的検知も採用している。例えば、解析の結果、コード内の10カ所のうち9カ所ではNULLチェックしているのに、ある1カ所ではNULLチェックを行っていない場合に、不具合として検出することができる。検出された不具合を担当者にアサインし、修正の有無を判断、登録することで、Coverityはその情報を蓄積し、以降の解析では不具合の報告を抑制できる。複数のプロジェクトでレビュー結果を共有し、レビューコストを下げられるということだ。
売れるゲームを作るには、品質保持は当たり前なのは言うまでもない。プロの開発者なら品質の保持をし続けることが重要となる。
冒頭で述べた通り、最近のゲーム開発現場では市場ニーズに素早く反応して機能改善を図る手段としてアジャイル開発が導入されているが、このアジャイル開発が要求される意味はもう一つある。
それは、iOSやAndroidなどのOSのアップデートサイクルが速いということだ。iOSやAndroidは1年でメジャーバージョンアップデートを行い、新しいAPIも次々に追加される。また、言うまでもなくAndroidについては、端末メーカーが多数存在するのも動作検証の課題となっている。Unityなどの開発ツールは「マルチプラットフォーム」が“売り”の一つなので、それらに対応した機能追加の頻度も多い。さらに開発ツール自体もアップデートをし、次々と機能追加を行っている。最近では、最新版Unity 5で4.x以前との互換性がゲーム開発現場で課題となっている。
こういった状況でゲーム開発現場がゲームの品質を保持するには、JenkinsなどのCI(継続的インテグレーション)ツールやSCM(ソースコード管理システム)によるゲームのバージョン管理、不具合管理の仕組みが欠かせない。
その点Coverityはコマンドベースでも扱うことができるので、GitやSubversion、Visual Source Safe、Visual Studio Team System、Microsoft Team Foundation Server、MercurialなどのSCM、Jenkins(プラグインも用意されている)、BugzillaやJIRA、Tracなどの不具合管理システムと連携可能だ。さらに、シェルスクリプトの作成などで若干のカスタマイズができれば、他ツールとの連携も可能になる。
これにより、コーディング→チェックイン→ビルド→テストというサイクルを自動化する間に、Coverityの静的解析を組み込むことが可能となるのだ。
日本シノプシスのCoverityシリーズの静的解析ツールは、「Code Advisor Enterprise」として提供されている。
他の静的解析のみのツールと違う点の一つに、不具合管理機能がある。「誰が不具合を修正し、プロジェクト単位の修正状況はどうなっているのかなどを管理できる。これによって修正のサイクルを回しながら、バグのないコード開発が実現する」(津村氏)。
もう一つは、エンタープライズクラスの管理機能だ。同製品では、ユーザー管理、アクセスコントロール、ダッシュボードやリポートなど、プロジェクト管理に必要な機能をWebベースの管理画面で一覧できる。「バグの修正状況を可視化するダッシュボードを使えば、進捗(しんちょく)状況を簡単に把握できる。開発担当への確認も効率的に行えて、生産性の向上にもつなげることができる」(津村氏)。
なお、開発担当者への確認通知は自動化することも可能だ。開発者は中央サーバーのSCMにチェックインしてコード開発する構成にすると、Code Advisor Enterpriseがコード解析後、不具合を発見した場合、実際にコード開発した担当者へ自動でメール通知、修正を依頼できる。担当者はメール本文のURLをクリックし、コードを確認、修正などを行うだけだ。
「コピー&ペ―ストによるコーディングの結果、変数名の書き換えを忘れてしまったなど、コードレビューで見逃しがちな細かいところを確実に発見し、レビューするチャンスを作ってくれる。特にコード規模が大きく、膨大な関数が使われているような場合、人間の目で全て追ってミスを発見するのは難しい。そこを補完できるツールだ」(津村氏)。
またCoverityは、IDE(Eclipse、Visual Studio、IntelliJ IDEAなど)とも連携し、自動で解析・割当てられた不具合の該当コードをIDE上ですぐに確認できる。慣れたIDEを使い続けられるので、新たにツールの教育もいらず、生産性の低下も防げる。
Coverityの今後について、津村氏は「より多くの開発者に利用してもらえるよう、対応言語の拡張を検討している」と明かす。「ゲーム開発で使われているObjective-CやJavaScriptなども検討中だ」。
加えて、セキュリティ問題への対応強化も予定されている。日本シノプシスは2015年4月22日にファジングテストツール「Defensics」やソフトウエアコンポーネントのぜい弱性解析ツール「AppCheck」を提供するCodenomiconを買収。5月28日には、動的および静的セキュリティ検査を組み合わせて実行するWebアプリケーションのぜい弱性検出ツール「Seeker」製品技術と開発者をQuotiumから買収している。今後さらに、Coverityソリューションの品質やセキュリティ検証の機能拡充が行われる予定だ。
「開発の効率や生産性を高めながら、バグやセキュリティ上の不具合のないゲームを作成するには、コード解析はとても重要だ。バグ修正のライフサイクルを効果的に回すことができれば、短縮された時間をユーザーエクスペリエンスの改善やシナリオ/機能追加などのクリエイティブな作業に割り当てることができる」(津村氏)
Coverity製品では、無料トライアルを実施している。実際にソースコードを解析し、これまで検出できなかったバグがどれくらい発見できたかを体感できる。現状を知り、コード品質を再考する良い機会として、ぜひ利用してみてはいかがだろうか。
Copyright © ITmedia, Inc. All Rights Reserved.
提供:日本シノプシス合同会社
アイティメディア営業企画/制作:@IT 編集部/掲載内容有効期限:2015年8月13日