From 3f3e3d58981dfc426eee39085d340789d842a226 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 19 Aug 2026 21:50:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(phase2):=20=5Frun=5Fcmd=5Fwait=20=E6=B8=85?= =?UTF-8?q?=E9=9B=B6=20STARTUPINFOA=20=E7=AD=89=E7=BB=93=E6=9E=84=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TPV 的 T() 构造仅 alloca 不 memset(无 __init__ 时只 InitStructDefaults, extern 结构体无默认值记录 → no-op)。_run_cmd_wait 的 si 只设 cb, dwFlags 等 15 个字段为栈垃圾:多线程并发调用时垃圾值随机,dwFlags 垃圾位令 CreateProcessA 使用垃圾句柄作子进程 stdio → 子进程行为不定 /父进程线程崩溃(ClassArrayTest e5fb worker 崩、edd8 正常的概率崩溃 根因,70c8810 引入 _run_cmd_wait 时即存在)。si/sa/pi 全部显式清零。 --- App/lib/core/BuildPipeline.vp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/App/lib/core/BuildPipeline.vp b/App/lib/core/BuildPipeline.vp index 0fdd0da..4d299c1 100644 --- a/App/lib/core/BuildPipeline.vp +++ b/App/lib/core/BuildPipeline.vp @@ -527,6 +527,13 @@ def _run_cmd_wait(cmd: str) -> int: sa: w32.win32base.SECURITY_ATTRIBUTES = w32.win32base.SECURITY_ATTRIBUTES() si: win32process.STARTUPINFOA = win32process.STARTUPINFOA() pi: win32process.PROCESS_INFORMATION = win32process.PROCESS_INFORMATION() + # T() 构造仅 alloca 不 memset:STARTUPINFOA 未设字段(dwFlags 等)全为 + # 栈垃圾,多线程并发调用时垃圾随机 → dwFlags 垃圾位让 CreateProcessA + # 用垃圾句柄作子进程 stdio → 子进程行为不定/父进程线程崩溃(ClassArrayTest + # e5fb worker 崩溃、edd8 正常的原因)。si/sa/pi 全部显式清零。 + string.memset(t.CPtr(c.Addr(si)), 0, win32process.STARTUPINFOA.__sizeof__()) + string.memset(t.CPtr(c.Addr(sa)), 0, w32.win32base.SECURITY_ATTRIBUTES.__sizeof__()) + string.memset(t.CPtr(c.Addr(pi)), 0, win32process.PROCESS_INFORMATION.__sizeof__()) sa.nLength = w32.win32base.SECURITY_ATTRIBUTES.__sizeof__() sa.lpSecurityDescriptor = t.CPtr(0) sa.bInheritHandle = 1