Skip to content

Windows: 非 ACP 工作目录下 mcpp --version 静默退出 0xC0000409(先修进程边界,再验证构建链) #693

Description

@julixian

实测现象

在 Windows(本机 GetACP() == 936)上,mcpp 2026.9.25.1 从含有当前 ANSI 代码页无法表示的字符的工作目录启动时,连 --version 都会无输出地退出:

PS D:\VSProj> mcpp --version
mcpp 2026.9.25.1

PS D:\VSProj\mcpp-unicode-repro-🧪> mcpp --version
PS D:\VSProj\mcpp-unicode-repro-🧪> $LASTEXITCODE
-1073740791  # 0xC0000409

同一目录下 mcpp build --configure-only 也是无输出、同一退出码。目录里放了最小的 mcpp.toml 和 src/main.cpp,但 --version 已能复现,因此故障发生在读取源码之前。ASCII 工作目录下同一 mcpp.exe 正常。这个签名比 #518 A 中的“没有源文件”更早,也不能靠改进 glob 的诊断覆盖。

同机的 mcpp 自带 Ninja 1.12.1 在该目录能正常运行,ninja.exe -t wincodepage 输出 Build file encoding: UTF-8。Ninja 上游也随 Windows 版本提供 UTF-8 activeCodePage manifest。这说明当前复现至少不是 Ninja 首先拒绝工作目录;其他编译器和构建工具仍需逐一验证。

与已有问题的关系

这个新复现聚焦进程启动/命令分派阶段的静默终止,并希望把修复和后续验证的边界写清楚。

建议方案

  1. 先修 mcpp 自己和 mcpp 生成的 build.mcpp.exe。 在 Windows PE 产物里嵌入 activeCodePage=UTF-8 manifest(Windows 10 1903+ 支持),让 MSVC STL 的窄路径转换与构建图中的 UTF-8 字符串一致。mcpp.exe 可走现有 [resources] 构建能力;build.mcpp.exe 是单独的 host 编译/链接路径,需要单独接入。同一阶段修掉 --version 的静默退出,失败时至少给出准确诊断。Microsoft 的应用程序 manifest 文档说明了这个设置及系统版本要求。
  2. 把 mcpp 的 Unicode 边界显式化。 内部/build.ninja/CDB 的路径字节约定为 UTF-8;进入 Win32 文件、命令行和环境 API 时使用 UTF-16/W API,或明确做 UTF-8↔UTF-16 转换。目前 Windows bounded process 路径仍使用 CreateProcessA、GetEnvironmentStringsA;只依赖进程 ACP 会让这个约定隐含在 manifest 和 OS 版本里。这个重构可以分阶段做,不必阻塞第 1 步的止血。
  3. 按实际工具链验证下游,而非要求所有第三方工具统一补 manifest。 先检查 mcpp 固定使用的 Ninja(例如 -t wincodepage),再分别测试编译器驱动、链接器、资源编译器和项目声明的 host tool/action。第三方可执行文件的代码页不会因为 mcpp 的 manifest 自动改变;如果某一环不能消费 Unicode 路径,应点名该环和失败的路径,而不是宣称整个构建已受支持,也不宜静默修改第三方 exe。

建议验收

  • Windows CI 测试先确认 GetACP() != 65001,否则该回归用例不构成证据;在含 🧪 的工作目录运行 mcpp --version 和 mcpp build --configure-only,均应正常退出并有预期输出。
  • 在相同目录构建最小 build.mcpp 项目,再测试含非 ACP 字符的成员目录和源文件名;验证 Ninja 构建文件、CDB 与子进程收到的路径没有乱码。至少对一条固定的 Windows 工具链实测端到端成功;其他工具链若有边界,应给出分阶段诊断。
  • 保留 Windows: 进程 ACP 之外的路径,mcpp 只能跳过而不能构建 #518 的“跳过不可窄化路径时必须报告”行为,作为旧系统或未支持的下游工具的退路;只有完整构建链通过后,才把验收描述为“支持非 ACP 路径”。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions