fix(tpv): 窄化截断加常量溢出诊断(_Type.md 问题 8)
- coerce_to_type 宽→窄 trunc 前检测编译期常量正溢出目标位宽无符号 范围 → fatal_error(OverflowError),消除 buf[idx] = 0x1FF 类静默截断 - 负常量按模 2^bits 语义放行(-1 → 0xFF 合法);非常量运行时窄化保留 trunc(值域可能安全,无法静态判定)
This commit is contained in:
1 parent
4748915472
commit
4415f1f38b
1 file changed
+13
@@ -416,6 +416,19 @@ class ExprGenBase:
|
||||
if self._zext_or_sext_val(pool, val, node) != 0:
|
||||
return llvmlite.build_zext(builder, val, target_ty)
|
||||
return llvmlite.build_sext(builder, val, target_ty)
|
||||
# 窄化截断诊断(_Type.md 问题 8):宽→窄 trunc 静默丢位。
|
||||
# 编译期已知常量且正溢出目标位宽无符号范围 → fail-fast(确定性数据
|
||||
# 损坏,如 buf[idx] = 0x1FF 写入 i8 槽位被静默截断)。负常量按模
|
||||
# 2^bits 语义放行(-1 → 0xFF 合法);非常量运行时窄化保留 trunc
|
||||
# (值域可能安全,无法静态判定)。
|
||||
if val.IsConst == 1 and val.IntVal > 0:
|
||||
target_max_u: t.CUInt64T = (t.CUInt64T(1) << target_bits) - 1
|
||||
if t.CUInt64T(val.IntVal) > target_max_u:
|
||||
max_print: t.CInt64T = t.CInt64T(target_max_u)
|
||||
self.Gen.TypeGenErr.fatal_error(
|
||||
node,
|
||||
f"窄化截断溢出:常量 {val.IntVal} 超出目标类型 {target_bits} 位范围 [0, {max_print}],赋值将被静默截断",
|
||||
"OverflowError")
|
||||
return llvmlite.build_trunc(builder, val, target_ty)
|
||||
# 浮点转换
|
||||
val_fbits: int = self.get_llvm_float_bits(val.Ty)
|
||||
|
||||
Reference in new issue
Block a user