Commit Graph
97 Commits
Author SHA1 Message Date
TermiNexus 90a74e4e2c fix(tpv): 支持 PEP 701 同引号嵌套 f-string 并记录解析错误位置
- lexer.vp: _read_string 增加 f-string {} 深度跟踪,跳过表达式块内嵌套字符串字面量(含 {{/}} 转义、跨行报错)
- parser.vp: _parse_fstring 表达式扫描同步跳过块内嵌套字符串,三条 error_count 路径补 _record_parse_err(消除'第 0 行 0 列'不可读错误)
2026-08-28 12:50:38 +08:00
TermiNexus bc017d0a61 feat(tpc): 解析错误记录具体 token 位置(消除'第 0 行 0 列'不可读错误) 2026-08-28 12:25:38 +08:00
TermiNexus 60dbdfe8d2 fix(tpc): 方法调用虚分派——变量与模块短名同名时不误入模块函数路径(base.kind 折叠根因) 2026-08-28 10:23:26 +08:00
TermiNexus 63bc435723 feat(tpc): 注解支持 C 风格指针后缀 T*(int* → int | t.CPtr 多级展开) 2026-08-28 08:01:03 +08:00
TermiNexus 0230385891 feat(tpc): 新增单目 * / & 运算符(Deref/AddrOf)AST 节点与 LLVM 翻译 2026-08-28 07:34:58 +08:00
TermiNexus e376b949c9 fix(memhub): 移除 free 记录前标记校验——合并重分配误报(与 w0/w1 同类)
下溢写误报实锤:1024B free 块 hdr=0x0、同 ptr 仅一条 F 记录、前标记被写零——块合并进更大块后新分配用户区覆盖旧记录前标记区而旧块头仍为 0,前标记校验原理性不可靠(SlotsBugTest 1024B 块误报例)。

移除 free 记录全部校验,只保留 active 记录前/后标记校验(存活块独占,header LSB=1 不会合并,可靠)。
2026-08-25 17:21:27 +08:00
TermiNexus c9ccea4014 feat(memhub): 下溢写打印增强——块头/记录index/上下文/同ptr记录
SlotsBugTest 越过 can 问题后新信号:free 块前标记(block+8..9)被写零(前标记区是安全区,子块边界2^n>=32永不落此,free-list写只在block+0..7)→ 真实下溢/UAF写。

增强打印:hdr 块头值(判断 free-list 状态)、记录 index、±3 上下文记录、同 ptr 记录(F/A 标注),一次运行定位写入者。
2026-08-25 17:17:29 +08:00
TermiNexus 7c7629852a perf(memhub): detection 采样探测,O(n²) 降为 O(n²/256)
每次 alloc 全表扫描(分配重叠 + _det_probe)是 O(n) ,2M 次 alloc = O(n²),detection 模式过慢。

改为每 MEMBUDDY_DET_PROBE_PERIOD(256) 次 alloc 采样扫描一次;记录追加保持 O(1)。损坏是持久性的,不依赖即时扫描,检测能力不损失。
2026-08-25 16:21:34 +08:00
TermiNexus b777d7c925 fix(memhub): 移除 free 记录 0xCD 完整性校验,消除 buddy 自写误报
free 记录 w0/w1 校验验证 free 后用户区 0xCD 完整,但 buddy 分配器 free 后会把 next 指针/子块头合法写进 free 块(free 块用户区即管理区),0xCD 必然被破坏 → 持续误报(SlotsBugTest 4352B 块首 8B=0x400000000、前标记完好的误报例)。

只保留可靠的前标记校验(子块边界 2^n>=32 对齐永不落在 block+8)。0xCD 填充保留。探测器可推进到 Phase2 用 is_alive 抓真实 KwEntry cargs 读取型 UAF。
2026-08-25 16:16:02 +08:00
TermiNexus 0f6ebb9065 fix(memhub): detection 记录表随 reset_to/reset 截断
reset_to/reset 只把块归还 free list、从不清理 _det_records,导致 reset 后旧记录仍标 active:下一轮 alloc 复用同一块被误报为分配重叠/越界写(SlotsBugTest 7B buf + 72B Token 误报根因),探测器在 Phase1 扫描就 exit(1),永远走不到 Phase2 的真实 UAF 检查。

修复:reset_to(mark) 同步截断 _det_count=mark(与 chk_depth 等长,每次 alloc 各追加一条、free 只置标志不删),reset() 置 _det_count=0。
2026-08-25 16:05:21 +08:00
TermiNexus 74ed6f2dbc feat(memhub): 分配重叠即时检测
SlotsBugTest 崩溃实锤:同一块被重复分配(记录表同 ptr 两条,[353]sz=7 与 [10298]sz=72)——7B 字符串缓冲与 72B Token 重叠,Token 初始化覆盖 buf 导致越界写,KwEntry cargs 只写 0/40 根因。

根因指向 MemBuddy free list 损坏(active 块混入 free list)。新增检测:每次 alloc 前将新块地址与 active 记录比对,命中即打印两个 size 并 exit(1),在第一次重叠处拦截,便于回溯具体分配调用。
2026-08-25 16:01:07 +08:00
TermiNexus 49feb6a2b4 feat(memhub): [DET] 越界写追加同ptr记录检测 - 扫描记录表找同一 ptr 的多条记录,验证 alloc 重叠(Token 72B 与字符串 buf 7B 共用块 → 互相覆盖),定位 size=7 块被当 Token 写的根因 2026-08-25 15:57:45 +08:00
TermiNexus d3a84c25e0 feat(memhub): [DET] 越界写追加记录表上下文 - 打印越界块前后各3条 {ptr,size},推断分配阶段(如 lexer/parser 小结构),配合越界区数据定位 size=7 块写入者 2026-08-25 15:53:44 +08:00
TermiNexus 878840a081 feat(memhub): [DET] 越界写追加打印越界区24字节 - 判断写入者写多长/方向(0x00=写穿 0xCD=未写 其它=写入值),定位 size=7 块 {10,1} 越界写源头 2026-08-25 15:51:24 +08:00
TermiNexus e48f2104ff feat(memhub): [DET] 越界写打印块内容前16字节 - 定位 size=7 块被越界写的写入者(扫描 includes 阶段,后标记被写 0x0000) 2026-08-25 15:47:04 +08:00
TermiNexus fe98b5048e fix(memhub): __init__ 显式初始化 detection 字段防默认值失效 - TPC 类字段默认值对 CDefine 常量可能不生效,detection_size=垃圾 → malloc(垃圾) 1-byte 记录区 → 扩容 realloc double-free(ASAN 捕获);显式赋值 detection_size/MEMBUDDY_DET_RECORD_SIZE + _det_arena/_det_records/_det_count/_det_cap 2026-08-25 15:43:54 +08:00
TermiNexus 40f10f6348 fix(memhub): detection 记录表满时 realloc 扩容 - 原 32MB/16B=2M 条满后新 alloc 无记录,is_alive 误报读取悬空(hdr=0x5 活跃块不在记录表);改为 stdlib.realloc 翻倍扩容(对齐 chk_stack),保证 is_alive/_det_probe 全程覆盖 2026-08-25 15:39:09 +08:00
TermiNexus fefc1e8343 feat(memhub): 读取侧存活校验 is_alive - 补 detection 写入检测盲区:struct_ctor 读 cargs 前校验 cl.args 是否在记录表 active 记录中,不在即 [DET] 读取悬空 打印 cargs 值并终止;拦截 use-after-free 读取(SlotsBugTest KwEntry cargs=cl.args 悬空根因),detection==0 时 is_alive 恒返回 1 不拦截 2026-08-25 15:31:39 +08:00
TermiNexus 1de7c8d2ca chore(tpc): 移除全部临时 DBG 日志 - VDBG(ExprGenMixin)/CTORDBG(CallGenCtor)/LISTDBG(_list)/ALLOCDBG+set/get_debug_log+set/get_alloc_src(memhub)/CLDBG+[DEPDBG](CallGenMixin)/--enable-debug-log(main)/set_alloc_src(HandlesTranslator);保留 detection 机制(前后 0xCDCD 标记+记录表探测)与 MEMBUDDY_FILL_GUARD 守卫 2026-08-25 15:17:51 +08:00
TermiNexus 769ffda04f feat(memhub): detection 补前标记探测(对称拦截下溢写) - active 记录验证返回ptr-2 处 0xCDCD,free 记录同样验证前标记+用户区 0xCD;与后标记上溢检测、free 填 0xCD 的 UAF 写入检测构成完整三方覆盖 2026-08-25 15:12:48 +08:00
TermiNexus 91120ae00a feat(memhub): detection 增强 - free 后用户区填 0xCD + 记录保留并置 free 标志,探测时对仍 free 的块验证 0xCD 完整(首末 8 字节),被写穿即 [DET] UAF 写入 报警终止 - 拦截 use-after-free 写入(如 SlotsBugTest KwEntry cargs 块 free 后被部分覆盖),与后标记越界写检测互补;块被重新 alloc 后块头变奇数自动跳过旧 free 记录防误报 2026-08-25 15:02:14 +08:00
TermiNexus c559c0f2d6 feat(memhub): MemBuddy 分配检测机制(detection 开关) - alloc 布局改为 [0xCDCD][size][0xCDCD](实际多 4 字节,返回指针后移 2 字节,free/realloc 前移 2 字节回收);每次 alloc 记录 {返回ptr,size} 到独立 32MB 记录区(stdlib.malloc,默认 detection_size=32MB),随后探测全部存活块后标记——被破坏即越界写,汇报 ptr/size 并终止;free 时移除对应记录防块复用误报。定位 SlotsBugTest KwEntry cargs '存活块被部分覆盖' 的写入者(ASAN/Valgrind 对自研池透明,此机制补齐池内越界写检测盲区)。MemBuddy(arena, size, detection=1) 开启,默认 False 2026-08-25 14:56:04 +08:00
TermiNexus 3100bb9343 feat(memhub,list,llvmlite): 0xCD 分配守卫、诊断开关与 INT64_MIN 常量修复 - memhub.vp alloc 填充 0xCD 哨兵 + set_debug_log/get_debug_log + ALLOCDBG 分配者记录; _list.vp __init__/append 诊断; llvmlite i64 INT64_MIN 输出无符号位模式(LLVM 拒绝 -9223372036854775808 字面量)。定位 SlotsBugTest KwEntry cargs use-after-free 与常量 dump 错误 2026-08-25 13:19:08 +08:00
TermiNexus c3a43dfe76 refactor(includes): 标准库 extern 软关键字语法迁移 + _append_cstr O(1) 追加缓存
- posix/stdio 等 19 文件: def ... -> T|t.State: pass 改写为 extern def ... -> T
- llvmlite/__builder.vp: _append_cstr 加写入位置缓存(_g_last_dst/_g_last_pos,缓冲切换/重置自动回退 strlen,防 O(n^2))
2026-08-24 23:31:12 +08:00
TermiNexus 58594d4cf7 refactor(coro): Coroutine 改 @t.NoVTable,去掉无用 vtable(纯句柄语义) 2026-08-22 01:35:04 +08:00
TermiNexus 7d147c55e1 fix(mcp): 编译默认启用 --asan,tpv_build 支持 asan 参数
- tpc_build/tpc_run_test/tpv_build/tpv_compile_project 的 asan 默认 true
- tpv_build 新增 asan 参数(编译器自身 ASan 插桩,崩溃时可输出报告定位)
- tpv_bootstrap Phase A 对齐 tpv_build 加 --asan
- includes/coro.vp: 裸 null 改 t.CPtr(0)(TPV 兼容,M1 遗留未提交)
2026-08-21 23:02:16 +08:00
TermiNexus 8ce08493e8 feat(coro): M7——try/finally、异常消息、自定义异常类、帧池复用
- try/finally(无 except):正常/异常路径都执行 fbody,异常时 finally 后
  重新传播(done+br exit);finally 内暂不支持 await
- 异常消息:帧加 msg 槽(i8*,index 4),raise X(msg) 存消息,await 传播,
  coro_exception_msg 查询
- raise 支持自定义异常类(exception_registry 码),多 except 匹配子类码
- 帧池复用:per-type free-list 全局池,create 弹池/空则 malloc,coro_destroy
  回池(帧头部存 next),避免反复 malloc/free
- 修复 ast.walk 传 list 崩溃(finalbody/For body)
- CoroTest 验证:finally 执行、MyError exc=100 msg=boom msg、3 次循环池复用
2026-08-21 14:46:21 +08:00
TermiNexus 411e0bb774 feat(coro): M4——异常传播(帧 exc 槽 + raise + await 传播)+ gather 并发调度
- 帧布局加固定 exc 槽(i32,0=无异常),协程内 raise 存异常码并终止
- await 子协程后检测异常并传播到父帧(父协程带异常终止,状态机短路)
- return await x:await 值直接存父帧 ret 槽(挂起前),修复 child_ret 跨块
  dominate 错误;挂起不再写 ret=0(避免覆盖返回值)
- coro.coro_gather(帧...):并发推进全部协程到完成(含 coro_sleep 轮询),
  返回完成数
- coro.vp 追加 coro_exception/coro_gather 占位
- CoroTest 验证:异常传播 exc=42;gather=2 r1=2 r2=3
2026-08-21 14:26:19 +08:00
TermiNexus 3acf24c7d0 feat(coro): M3——For 内 await、coro_sleep 挂起、coro_destroy 释放帧
- For 内 await:range 迭代变换为 While(__f_idx_N/__f_len_N 帧槽),复用协程版 While
  就地挂起/恢复;For 迭代目标进帧槽跨挂起存活;仅支持 range 1/2 参数
- coro_sleep(ms):帧加 __coro_wake_us(i64)唤醒槽,挂起后 coro_run 轮询
  GetTickCount64,未到点 Sleep(1) 续轮询,到点自动恢复
- coro_destroy(帧):coro.coro_destroy 内联翻译为 free 释放帧内存
- coro.vp 追加 coro_sleep/coro_destroy 占位;CoroTest 用例覆盖
  for+await/sleep/destroy(期望 coro result = 15)
2026-08-21 14:17:27 +08:00
TermiNexus 13a8f6c1b6 feat(coro): 语言内协程 M1——async def + await + coro_run 状态机
TPC 新增协程生成器 AsyncFunctionHandle(lib/core/Handles/HandlesAsyncFunctions.py):
async def 编译为帧结构体 {state, done, ret, 局部变量槽} + create_<name>()(malloc
分配)+ resume_<name>()(switch 状态机,0=SUSPEND/1=DONE)。await 按顶层赋值
切分函数体:创建子帧 -> resume -> 取子帧 ret -> 存父帧槽 -> 父挂起(state 前进);
普通调用 async 函数生成 create(返回帧指针);coro.coro_run 在调用点内联翻译为
resume 循环。vast parser 已支持语法;新增 includes/coro.vp(Coroutine + 占位
运行时)与 Test/CoroTest(期望输出 coro result = 14)。

M1 限制:async 无参数、返回 i32/int;协程体仅顶层 AnnAssign/Assign/Expr/Return;
await 仅顶层赋值形式、子协程假设一次完成(无嵌套挂起);coro_run 依赖本模块
先赋值的协程变量。M2 将支持参数/嵌套 await/控制流。
2026-08-21 12:36:00 +08:00
TermiNexus 51c0e026f4 fix(includes): 链式 GSList.append 改局部变量写法,避免方法解析错位写穿内存
链式 func.Params.append() / func.Blocks.append() / block.Lines.append() 会被编译器解析成 LinkedNode.append 且 this 前移 sizeof(LinkedNode)(兄弟 Mixin 兜底误匹配),写穿 GSList 容器前 48 字节破坏数据结构 → LLvmLiteTest Test 3 崩溃(AddParam/CreateBlock/build_add 后链表损坏,PrintFunction/RenumberSSA 遍历垃圾指针)。

改为局部变量 + 类型参数写法(对齐 function_move_block_to_end 既有正确模式)。
2026-08-20 16:45:19 +08:00
TermiNexus f2cdbdc70f fix(exprlen): 剥离 sha1 前缀修复 len() 分派失效
class_members/class_member_element_class 的 key 为裸类名,而 _CurrentCpythonObjectClass 可能带 sha1 前缀导致 gate miss 落到 strlen(stdint.vp 0xC0000005 根因)。同时按字段静态类型沿 MRO 分派 list.__len__,并移除排查期诊断 printf。
2026-08-20 10:28:29 +08:00
TermiNexus e83c06041a fix(ast): 解析器支持括号内行首运算符跨行续接
and/or 与 binop/比较链循环此前在检查运算符前不跳 Nl:
A and B 换行后再 and C(ThreadingTest check 多行 and 链)停在 Nl 上
循环退出,上层把续行运算符当非法 token 报 SyntaxError。每轮循环先
_skip_nl 再查运算符(对齐 vast 实现),支持 (a\n + b)、(a < b\n < c)
等行首运算符续行。
2026-08-19 06:52:20 +08:00
TermiNexus 73e5eea3f0 fix(llvmlite): create_block 块名与参数名冲突去重
LLVM 中块标签 entry 即值 percent-entry,与参数 percent-entry 重名导致 llc
unable to create block named entry(CallGenCall._field_byte_offset 的 entry
参数根因)。create_block 创建块时扫描函数参数值名(剥离百分号前缀),
冲突则追加 .1/.2 后缀,覆盖全部 7 处入口块创建点。
2026-08-19 05:54:11 +08:00
TermiNexus 915054495f fix(ast): 补齐 exprs 字段访问辅助函数 re-export
5cda173 只补了 attribute_get_attr,TypeGen 还以 ast.<helper> 调用
attribute_get_value/name_get_id/constant_get_str_val/binop_get_left/
binop_get_right(均定义在 ast.exprs)→ 同样触发跨模块返回类型解析
fail-fast。一次性全部补入 from .exprs import 导出列表。
2026-08-19 05:26:26 +08:00
TermiNexus 5cda173a5e fix(ast): re-export attribute_get_attr 修复跨模块返回类型解析失败
TPV TypeGenCType/TypeGenResolve 以 ast.attribute_get_attr(at) 调用,但 ast
包 from .exprs import (...) 未 re-export 该函数(定义在 ast.exprs)→ 跨模块
函数返回类型解析在 ast 包 text.ll 找不到定义 → fail-fast "返回类型无法
精确获取"。按既有 re-export 惯例(如 get_parse_err_line)补入导出列表。
2026-08-19 05:18:41 +08:00
TermiNexus a2378e6878 chore(ast): Attribute.__init__ 加构造断点,定位 stdint.vp attr 垃圾来源 2026-08-18 09:25:36 +08:00
TermiNexus 802377e9ab feat(ast): 加 Name/Attribute/Constant/BinOp 字段访问器,绕开跨模块 stub 字段访问陷阱 2026-08-18 08:59:10 +08:00
TermiNexus 4f95867209 fix(llvmlite): PrintModule param_scan 改用访问器绕开 stub 字段访问陷阱
printf.fmt Param 创建后 next=0(正常)、dump_ir 诊断访问器读 next=0,
但 PrintModule 直接访问 param_scan.Next 遍历超限死循环——同一指针两次
读取结果不同,指向跨模块 stub 字段访问生成错误 GEP/静默跳过
(param_scan 永不更新 → 死循环)。param_scan 遍历改用 param_get_next/
param_get_ty(__function.vp 完整类型内读取),并打印首节点 param/next
供对比验证。
2026-08-18 08:26:38 +08:00
TermiNexus 37e6dd1863 feat(llvmlite): 加 module_get_func_head 跨模块访问器,供 dump 诊断遍历函数链 2026-08-18 08:17:51 +08:00
TermiNexus 1805790336 fix(tpv): vpi 参数数上限哨兵 + declare 链遍历哨兵,定位 builtins.vp dump 卡死根因
dump 步数哨兵已定位卡死链路为 printf 的 Params 链异常。新增:
1. VpiReader _inject_function_declare/_inject_method_declare 参数数上限
   128(fail-fast):vpi tree 深层节点被覆盖损坏时 args_list.__len__()
   返回垃圾大数 → add_param 海量次 → Params 链超长,dump 误报成环
2. CallGenBase._ensure_method_declare FuncHead/Params 遍历步数上限
   (防 translate 期间死循环)
3. dump 哨兵报错增强打印 Params.Count,区分真成环与海量节点
2026-08-18 08:10:02 +08:00
TermiNexus f1db31b645 fix(llvmlite): dump 路径链表遍历加步数上限哨兵,把 IR 成环卡死变确定性报错
builtins.vp 翻译后 dump_ir 卡死(IR 链表 Next 被越界写破坏成环,
遍历无限挂起)。PrintModule/FunctionPrint/RenumberSSA/_scan_type_
for_cross_module_refs 的全部链表遍历(funcs/globals/named types/
params/blocks/lines/struct fields)加 IR_DUMP_CHAIN_LIMIT=100000
步数上限,命中即打印链路名并 exit(1),对齐 memhub.self_check
max_steps 的 fail-fast 哲学。
2026-08-18 07:59:39 +08:00
TermiNexus 6b9186848b fix(llvmlite): _type_str 增加 IR-FAIL 校验护栏,防 LLVMType 悬空生成垃圾 IR
LLVMType 类型对象可能被 MemBuddy 覆盖/悬空(跨遍 reset 回收后 pool 内存复用),TypePrint 输出首字符变为垃圾(如 't')或为空。现在 _type_str 对输出做首字符合法性校验,非法即打印 [IR-FAIL] + 类型地址并 exit(1)(fail-fast),防止生成 bitcast i8* null t 类垃圾 IR 导致 llc 报 expected 'to' after cast value 后难以定位根因。
2026-08-17 20:13:13 +08:00
TermiNexus 5d93692baa feat(vast/ast): 新增 export 软关键字声明 CExport 函数(等价 t.CExport)
允许 4 种语法(配不配 def 都一样):export def A(...) / export A(...),
与 extern 对称。返回注解改写为 <原类型> | t.CExport,复用既有 CExport
路径(符号名裸名、不加模块 SHA1 头);无 body 形式消费本行 NewLine。
TPC 侧 vast:_ParseExportDef + Unparser 还原(Export=True);
TPV 侧 includes/ast:Keyword.Export + FLAG_IS_EXPORT=16(追加末尾)+
_is_funcdef_kw/_parse_funcdef 支持。
2026-08-17 12:12:32 +08:00
TermiNexus 451e7a0391 fix(ast/parser): extern 无 body 形式消费本行 NewLine,修复 Phase1a-pre 7 文件扫描失败
extern def A(...) -> T(无 ': pass')解析完返回时 cur 停在 NewLine token,
模块级/类体语句循环只 _skip_nl(Nl)不跳 NewLine,下一轮把 NewLine 当
表达式解析(_parse_atom error_count++)→ parse_tokens 返回 None →
Phase1a-pre 报 7 个文件扫描失败(w32 7 个 extern 文件全挂的根因)。
2026-08-17 11:57:01 +08:00
TermiNexus a641c7c8da test(w32): 204 个 t.State 声明函数改用 extern 语法
- win32base/console/file/memory/process/sync/winsock2 七个模块
- def X(...) -> T | t.State: pass → extern def X(...) -> T: pass
- 转换后 vast AST dump 与原声明完全一致(extern 改写 returns 为
  <原类型> | t.State,语义等价),用于 extern 关键字编译测试
2026-08-17 10:49:39 +08:00
TermiNexus ce568e10b7 feat(vast/ast): 新增 extern 软关键字声明 FFI 函数(等价 t.State)
TPC 侧 vast:
- extern [def] A(...) [-> T] [: pass] 四种语法解析为 FunctionDef
- 返回注解改写为 <原类型> | t.State,复用 TPC 的 IsState 外部函数路径
- 设 Extern 标记,Unparser 还原 extern 语法(round-trip 一致)

TPV 侧 includes/ast(自举前端):
- Keyword.Extern 枚举与 intern,_is_funcdef_kw 软判定
  (extern def / extern Name+'( 或 '[')
- _parse_funcdef 支持无冒号声明、FLAG_IS_EXTERN 标记、
  returns 改写为 <原类型> | t.State(vpi 含 State → 定义端裸名 + 不生成函数体)
2026-08-17 10:41:44 +08:00
TermiNexus a7bbd68507 fix(parser/lexer): 支持括号内行首 or/and、类基类跨行、CRLF 反斜杠续行(追加69/70/71) 2026-08-16 11:19:16 +08:00
TermiNexus 5e6a80c9f6 refactor(zlib): 裸 stdlib/string 函数调用改为 namespace 限定形式
free/malloc/calloc/realloc→stdlib.*, memcpy/memset/strncpy→string.*;
修复 pyzlib.vp L177 free 未定义且未导入; zhuff.vp 补 import string;
方法形态(self.pool.free/self.free/def free)不受影响
2026-08-16 07:32:07 +08:00
TermiNexus 396e0a54be fix(SysLibTest): CDefine 大整数全链路 64 位化 + Win32 结构体 ULONG→DWORD
- maxsize=9223372036854775807 曾全链路 32 位截断成 4294967295:
  StubGen/Converter 与 register_cdefine_constant 改 %lld、lookup 改
  atoll、extract_cdefine_int_value/_lookup_cross_module_cdefine 改
  CInt64T,新增 _const_int_for_cdefine(超 0xFFFFFFFF 才升 i64,
  0xFFFFFFFF 保持 i32 -1 语义)
- subprocess stdout 为空根因 STARTUPINFOA/PROCESS_INFORMATION/
  MEMORY_BASIC_INFORMATION ULONG 字段(i64 占 8 字节)布局错位致
  CreateProcess 读不到 STARTF_USESTDHANDLES,改 DWORD 对齐 Windows 布局
- 移除 syslibtest_impl.vp 调试 DBG 标记
2026-08-15 13:11:25 +08:00