[UBA][Windows] ネイティブ再試行時に、日本語のコンパイラ出力が文字化けする

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

UnrealBuildAccelerator (UBA) を日本語 Windows 環境で使用した際、

「bForceRetry」と「bForceRetryRemote」により失敗したアクションが Native でリトライされると、

そのネイティブリトライ時のログだけ日本語の MSVC 診断が文字化けします。

元の出力やリモート実行時の出力は正常です。

■環境

- Windows 11(日本語システムロケール / CP932)

- Visual Studio 2022 17.14

- UE 5.7 source build

■期待結果

Native リトライ時も日本語診断が正しく表示される

■実際の結果

Native リトライ時の出力だけ文字化けする

例)

`error C4430: 型指定子がありません`

→ `error C4430: フ^ホwメ│…`

■補足

Native リトライ経路のコードページ処理、または multibyte-to-wide 変換に起因しているように見えます。

ローカルでは修正も確認できており、必要であれば詳細を共有できます。

[Attachment Removed]

再現手順

  1. UBA を有効にする
  2. 「bForceRetry」と「bForceRetryRemote」 を有効にする
  3. 日本語の MSVC 診断が出るコンパイルエラーを発生させる
  4. 失敗したアクションのリトライもコンパイルエラーにする
  5. ビルドログを確認する
    [Attachment Removed]

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

詳細な情報をお知らせ頂きありがとうございます。​ネイティブ再試行(ProcessFinishedResponse.RerunNative → m_detourEnabled == false)では、CreatePipe + ReadFile で バイト列だけを読み、PipeReader::ReadData が次のようにしていました。TString(char*, char*) は 1 バイトを 1 文字の wchar_t に拡張するだけなので、日本語 Windows の CP932(Shift-JIS)の 2 バイト文字が壊れます。おそらくここを修正する必要があるかと思いますが、もし可能でしたらローカルで行って頂いた修正と合致しているかどうかをご確認いただけますと幸いです。

					currentString.append(TString(startPos, end));
					return;
				}
				char* lineEnd = endOfLine;
				if (lineEnd > startPos && lineEnd[-1] == '\r')
					--lineEnd;
				currentString.append(TString(startPos, lineEnd));
				process.InternalLogLine(false, TString(currentString), logType);

[Attachment Removed]

ご確認いただきありがとうございます。

基本方針は合致しておりますが、併せて変更している部分もございますので、

変更内容を以下へ記載と、差分をzipにて添付させて頂きます。

■変更内容

UbaDetoursShared.cpp — Shared_WriteConsole(const char*, …)

  • 1バイトずつの符号拡張コピーを MultiByteToWideChar 変換に置き換え。
  • 複数呼び出しにまたがる不完全マルチバイト文字の繰り越しバッファを追加。
  • コードページは GetConsoleOutputCP() 経由で取得(修正後の Detour を通る)。

UbaProcess.cpp — PipeReader::ReadData()

  • TString(startPos, endOfLine) の char イテレータ構築を MultiByteToWideChar(GetACP(), …) による明示的変換に置き換え。
  • パイプ読み取り境界でのマルチバイト分断に対応する繰り越しバッファを追加。

UbaDetoursFunctionsKernelBase.inl — Detoured_GetConsoleOutputCP() / AppendNarrowToStdFile()

  • Detoured_GetConsoleOutputCP() を 437 固定から GetACP() に変更。
  • AppendNarrowToStdFile() を新設し、CRT の %hs フォーマット変換(Appendf(L"%.*hs", …))を MultiByteToWideChar(GetACP(), …) による明示的変換に置き換え。
  • AppendNarrowToStdFile() に不完全マルチバイト文字の繰り越しバッファを追加。

UbaDetoursFunctionsUcrtBase.inl — Detoured__write()

  • strchr(line, ‘\n’) を memchr(line, ‘\n’, end - line) に変更(バッファ境界安全性)。

お手数をおかけしますが、ご確認のほどよろしくお願いいたします。

[Attachment Removed]

情報を提供いただきありがとうございます。

本件の根本的な修正に有益な情報となりそうです。こちら正式な修正など進展がございましたらお知らせいたします。

[Attachment Removed]