UBTを利用した静的コード解析方法について教えてください

お世話になっております。

UEの「静的コード解析」リファレンスを参考に静的解析を試そうとしているのですが、

リファレンスが保守されていないのか使用する事ができません。

そこで、下記3点について質問となります。

1.「RunUBT.bat」が存在しない為、「UnrealBuildTool.exe」に直接batと同じ引数を渡す方法で可能でしょうか

2.(1)が可能かは分かりませんが、VisualStudioのスタートアップを「UnrealBuildTool」としたうえで、

「Hoge Win64 Development -StaticAnalyzer=VisualCpp」を渡して実行したところ「UE5Rules」が無いと表示され終了しました。

リファレンスには「UE5Rules」については触れられていませんが、用意する必要がありますでしょうか?

用意する必要がある場合、プロジェクトのどこにどのような内容のものを作れば良いかもお教えいただけると助かります。

3.リファレンスの「Lyra Starter Game をターゲットとして…」のサンプルではTARGETが「LyraGame」のみとなっており、

こちらはuprojectのパスなどではないようですが、具体的に何を渡せば良いでしょうか?

例えば「C:\Hoge\Hoge.uproject」のというプロジェクトがあった場合に、

実行するbatは「C:\Hoge\Tools\Analyze.bat」のようにある場合TARGETには「Hoge」と渡すだけでしょうか?

使用しているのは、EpicGameLauncherからダウンロードしたUE5.4となります。

よろしくお願いたします。

ランチャービルドで静的解析を行いたい場合、RunUBT.batが無いためdotnetを利用し以下の様なコマンドラインで動作させることができます。

MyProject.uprojectのエディタ版ターゲットを静的解析する例

dotnet "Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" MyProjectEditor Win64 Development -Project="D:\dev\ue504projects\MyProject\MyProject.uproject" -StaticAnalyzer=VisualCppゲーム版ターゲットを解析対象にしたい場合ターゲットをMyProjectにします。

ソースビルドのエンジンで静的解析で行う場合はRunUBT.batが利用可能です。

エンジンとゲームプロジェクトが同じフォルダ以下になく、別れた位置にある場合 -project=でuprojectを指定する必要があります。

記述例は以下の通りです。

Engine\Build\BatchFiles\RunUBT.bat -project="D:\dev\ue504projects\MyProject\MyProject.uproject" MyProjectEditor win64 Development -StaticAnalyzer=VisualCpp逆に同一フォルダにゲームプロジェクトがある場合(UE5.slnを開いたときにゲームプロジェクトが見える状態)であれば公式ドキュメントにあるように-project指定を省略することができます。

ログの出力先は -logオプションで変更可能です。

Engine\Build\BatchFiles\RunUBT.bat -project="D:\dev\ue504projects\MyProject\MyProject.uproject" MyProjectEditor win64 Development -StaticAnalyzer=VisualCpp -Log=c:\StaticAnalyserOutput\Log.txt

静的解析結果だけを出力するオプションについてですが、そういったオプションは用意されておりません。UBTの出力を減らす方法としては “-Quiet” がありますが完全にログが省略されるわけではありません。

完全なフィルタのためには出力を整形するようなスクリプトをご用意いただくのがよろしいかと思います。

出力フォーマットは利用されるアナライザーによりますが、例えばVisualCppであれば警告番号C6000番台が静的解析用の警告になるのでこれをフィルタに利用できそうです。

他には特定のアナライザーだけに利用できるオプションも少々あります。具体的にはTargetRules.csなどのコード内に記述がございますのでご確認ください。

追加のご返答もありがとうございます。

指定した場所に出力される事が確認できましたので、解析結果のみ抽出できるよう対応してみようと思います。

ご返答ありがとうございます。

無事にこちらでも静的解析を行う事ができました。ありがとうございます。

解析を行ったうえでの追加質問となりますが。

1.現状だとビルドの全ログがLog.txtに出力されますが、実行時のオプションで静的解析の結果(warning?)のみ出力する事は可能でしょうか?

2.Log.txtの出力先を実行時オプションで指定する事は可能でしょうか?

検証用プロジェクトで静的解析ができるようになったので本プロジェクトでも試したところ、WinDualShockで添付のエラーが発生してしまいました。

こちら、原因となるものはお分かりになりますでしょうか?また、調査方法があればお教えいただけると助かります。

お手数をおかけいたしますが、よろしくお願いいたします。

Unable to instantiate module 'WinDualShock': System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.IO.FileNotFoundException: Could not load file or assembly 'System.Console, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. 指定されたファイルが見つかりません。
File name: 'System.Console, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at LibScePad.GetPadLibLocation(String EngineDir, WindowsCompiler Compiler, String& PadLibLocation)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at UnrealBuildTool.Rules.WinDualShock..ctor(ReadOnlyTargetRules Target)
(referenced via ***.uproject -> WinDualShock.uplugin)

追加となりますが、clang系のプラットフォームで実行した際には"cvarCheckCode()"マクロ使用箇所にてエラーが発生してしまいます。

3箇所中1箇所は下記定義によりclangでは無効となっているようですが、エラーとなる2箇所でも同様の定義で囲っても大丈夫なものでしょうか?

#if !defined(__clang__) // @todo Mac: figure out how to make this compile

手元の環境ではWinDualShockプラグインの問題を再現することができませんでした。

まず検証用プロジェクトにてWinDualShockプラグインを有効化した場合に正しく動作している環境かどうかご確認いただけると幸いです。

エラーからはWinDualShockのコンストラクタ実行時に System.Console がロードできなかったことしかわかりません。これはC#ランタイムモジュール側のファイルです。

環境依存の可能性があるので、VisualStudio、コンパイラ、SDKなどのバージョン確認やIntermediateの削除、GenerateProjectFilesの再実行、プロジェクトのCleanなどをお試しいただくことになるかと思います。

エンジン側のモジュールの静的解析が必須ではないのであれば、-Module=オプションを使ってタイトル側のモジュールだけに静的解析を適用することもご検討ください。

追加で質問いただいた特定のプラットフォームでのコンパイルエラーに関しても手元で再現できておりませんがassertionマクロを無効化することで最終的なパッケージに影響がでることはないため#ifディレクティブを利用して除外することは問題ありません。

この件に関してはより具体的な解決がお望みであれば再現手順なども含めて機密プラットフォームに言及せざるを得ないので改めて対応するプラットフォームでのご質問をいただけますと幸いです。