docs(_Type): 标记窄化截断诊断完成(问题 8),状态更新为问题 2/4/8 已完成
This commit is contained in:
1 parent
90a74e4e2c
commit
3ff0db2953
1 file changed
+84
@@ -0,0 +1,84 @@
|
||||
# TPV 类型系统问题清单
|
||||
|
||||
> 记录日期:2026-08-28
|
||||
> 范围:TransPyV\App\lib\core\Gen\Type\* + GenTypes.vp + StructGenMixin.vp + Class\ClassGenEnum.vp + Expr\ExprGenCdef.vp
|
||||
> 状态:问题 2/4/8 已完成,问题 1 部分完成,其余待办
|
||||
|
||||
## 问题总览(按影响排序)
|
||||
|
||||
### 1. 静默退化不统一(影响最大)
|
||||
同一类型解析失败,在不同上下文产生三种不同结果:
|
||||
- 函数返回类型 → 静默回退 `i32`(FuncGenDef.vp L110-114)
|
||||
- 模块级变量/函数参数 → 静默降级 `i32`(ClassGenDef.vp L226-228)
|
||||
- 联合 `X | t.CPtr` 裸名未注册 → 回退 `Ptr(i8)`(TypeGenResolve.vp L1574-1597)
|
||||
- 泛型 T 污染 → `return None`(TypeGenResolve.vp L1267-1268,注释自称 fail-fast 实为退化)
|
||||
|
||||
静默退化点不落日志 → 运行时数据损坏(ListTest/DictTest/BuddyTest 根因)而非编译期报错。
|
||||
**决策**:编译期报错,不退化,直接报错(fail-fast)。
|
||||
|
||||
> **状态:部分完成** ✅
|
||||
> - ✅ 函数返回类型:FuncGenDef.vp L113-122 有返回注解但解析失败 → `fatal_error`(无注解函数保留 i32 默认)
|
||||
> - ✅ 泛型 T 污染:TypeGenResolve.vp L1258-1276 改为 `fatal_error`;污染检测用 `_str_contains_ident`(token 边界匹配,修复 strstr 把 `AST|t.CPtr` 中 'T' 误判为参数名的误杀)
|
||||
> - ⏳ 联合 `X|t.CPtr` 退化 `Ptr(i8)`:**保留**(前向引用 + 多遍收敛设计,直接 fail-fast 破坏自举);建议后续"Phase B 收敛后校验"
|
||||
> - ⏳ 模块级变量/参数静默降级 `i32`:未改(参与 Phase A 多遍重译,需评估 _deps_pending 交互)
|
||||
|
||||
### 2. sext/zext 不一致
|
||||
- `coerce_to_type` 整数扩展默认 **sext**(ExprGenBase.vp L422)
|
||||
- `should_zext_widen` 认为 i8 几乎总是无符号走 **zext**(ExprGenOps.vp L180-181)
|
||||
- MatchGenMixin.vp L745-752 各自查符号性
|
||||
→ 无符号类型(CUInt32T 等)赋值/传参被符号扩展;同一"窄→宽"在赋值路径与比较路径产生相反结果。
|
||||
**决策**:统一 zext/sext 为单一符号性判定函数。
|
||||
|
||||
> **状态:已完成** ✅
|
||||
> - ✅ ExprGenBase.vp L417-426 `coerce_to_type` 窄→宽接入 `_zext_or_sext_val`(i1/i8 默认 zext、`_node_type_unsigned` 无符号类型名 zext、否则 sext)
|
||||
> - ✅ 新增 `_zext_or_sext_val` helper(ExprGenBase.vp L457-478)
|
||||
|
||||
### 3. 联合类型信息丢失
|
||||
`X | t.CPtr` 若 X 未注册(前向引用/Phase A 依赖未就绪)→ 字段/变量固化为 `Ptr(i8)`,GEP 步长/load 宽度全错。
|
||||
正确性依赖 AnnotClassName 影子类型系统补救(脆弱,Subscript 场景会丢类名)。
|
||||
|
||||
> **状态:待办** ⏳
|
||||
|
||||
### 4. REnum 别名表指针比较契约
|
||||
`class_name` 用 CSizeT **指针值**比较(ClassGenEnum.vp L978-984),注册指针与查找指针不统一即失效。
|
||||
"LLVMType 字段 Pointee 未找到"四次依旧的根因;靠 `_update_renum_alias_class_ptr` 补救,契约脆弱。
|
||||
建议改 sha1+类名字符串键。
|
||||
|
||||
> **状态:已完成** ✅
|
||||
> - ✅ ClassGenEnum.vp 别名表去指针化:`class_name` 槽位改 perm_pool 字符串拷贝,3 个 lookup 改 strcmp 内容比较
|
||||
> - ✅ 删除 `_update_renum_alias_class_ptr` 及调用点
|
||||
|
||||
### 5. C 语义偏差
|
||||
- `_Bool` = i8 vs `CBool` = i1(TypeGenResolve.vp L723 vs L534)
|
||||
- `BOOL` = i32
|
||||
- `INTPTR` = Ptr(i32)(应为 i64 指针宽整数)
|
||||
|
||||
> **状态:待办** ⏳(注:`_Bool`=i8 / `BOOL`=i32 可能是有意的 C ABI 兼容,需先确认;`INTPTR`=Ptr(i32) 确为 bug 应改 i64)
|
||||
|
||||
### 6. CNeedPtr/CAutoPtr 检查未落地
|
||||
注释要求"非指针实参应在调用点报错",实际无检查(TypeGenResolve.vp L506-508),静默降级 i32 导致指针截断。
|
||||
|
||||
> **状态:待办** ⏳
|
||||
|
||||
### 7. 泛型特化名分裂
|
||||
跨模块一侧写 `list[ast.AST | t.CPtr]`、另一侧写 `list[AST | t.CPtr]` → 两个特化名 → undefined symbol。
|
||||
靠 `_norm_type_arg_name` SHA1 规范化修复。
|
||||
|
||||
> **状态:待办** ⏳(SHA1 规范化已缓解,跨模块仍可能不一致)
|
||||
|
||||
### 8. 窄化截断无诊断
|
||||
宽→窄直接 `trunc` 静默丢位(ExprGenBase.vp L423),`buf[idx] = 0x1FF` 类写入静默截断。
|
||||
|
||||
> **状态:已完成** ✅
|
||||
> - ✅ ExprGenBase.vp `coerce_to_type` 窄化点(L419-432)加常量溢出诊断:编译期常量正溢出目标位宽无符号范围 → `fatal_error`(OverflowError);负常量按模 2^bits 语义放行(-1 → 0xFF 合法);非常量运行时窄化保留 trunc(值域可能安全,无法静态判定)
|
||||
|
||||
## 历史缺陷附录
|
||||
|
||||
- 指针参数 alloca 退化为 i32(VarGenMixin.vp L382-384,FuncTest 根因)
|
||||
- 裸类形参退化为 i32(ClassGenBase.vp L774-780)
|
||||
- 返回类型字符串误判:struct 字面量 `{i8*, i16}` 内含 * 被当 i8*(CallGenBase.vp L829-833)
|
||||
- strstr 跨模块同名类劫持:sched.Thread 被 vthreading.Thread 顶掉(StructGenMixin.vp L768-791)
|
||||
- 字段/注解类名 pool 指针跨文件悬空(StructGenMixin.vp L370-378)
|
||||
- `_strappend` 越界存疑(TypeGenErr.vp L396)
|
||||
- `_get_annotation_field_size` 缺类型白名单,未知类型按 8 字节(ClassGenEnum.vp L593-594)
|
||||
- `infer_expr_type` 参数 bits 仅识别 8/16/64 三档,32 位静默落 i32(TypeGenErr.vp L295-300)
|
||||
Reference in new issue
Block a user