Skip to content

批8: bool←int 静默面收口——自测计数惯用式 171 处改签名 helper + 「台账 bool 桶归零」入 CI - #128

Merged
dslsdzc merged 1 commit into
developfrom
feature/b8-bool-sig
Sep 18, 2026
Merged

dslsdzc merged 1 commit into
developfrom
feature/b8-bool-sig

Conversation

@dslsdzc

@dslsdzc dslsdzc commented Sep 18, 2026

Copy link
Copy Markdown
Owner

摘要(批 8 · bool←int 静默面第一刀)

自测/桥接的计数惯用式 fails = fails + ts_check(name, <谓词>, 1):ts_check 形参声明 int,而第二实参
本就是 bool 表达式 ⇒ 靠 bool 隐式当 int(0/1) 参与 != 而「恰好正确」。S1P 台账把这类点读作
形参 int ← 实参 bool(p_ti=0 / a_ti=2)。它不是错值,是靠隐式转换活着的接缝:收口后(bool 不再当 int)
这批点会整片翻面,而失效信号是「自测数不准」而非编译错误 ⇒ 静默类,故先收。

改法:新增签名 helper ts_check_b(name, got: bool, want: bool) -> int(type_selftest.cr)与
ps_check_b(purity_selftest.cr),返回 int 以保持 fails = fails + … 惯用式不变;
171 处按「第二实参为括号包裹的 bool 表达式」逐处改写(type 166 + purity 5)。不引入新语法,与 2(a) 内置批无关。

台账(oracle = 被修对象自身输出,不是文本扫描)

CORE_S1P=1 ./build/corec check src/compiler/main.cr | grep -E '^991[78] '

时点 总点 桶
改前 239 bool 桶 171
改后 68 bool 桶 0 · 残桶 = string↔int(46 点 0←0 + 22 点 2←3,归 S2 路线 1 单独批)

逐处留痕

docs/superpowers/plans/2026-09-18-bool171-sites.tsv:171 行(file/line/helper/case-name/第二实参/第三实参),
案名去重后仍 171(无重复无遗漏),数据行 sha256 = 6dfee7aa93cdb7e5664da60e89fc515adb40654ed13b042b3ad7efa7b8366e10;
第三实参 true 170 处 · false 1 处(负断言 iface.compare_is_live,改前形 ..., 0),语义逐字对齐)。

判据

  1. 零行为变化(逐字节):selftest-types 421 行(415/415,rc=0)· selftest-purity 28 行(26/26,rc=0)
    与改前基线 逐字节相同(cmp 无差异)。
    ⚠ 取数陷阱已留痕:首轮比较因 fish noclobber 未真跑(重定向失败 ⇒ 比的是旧文件 ⇒ 假 IDENTICAL),
    改 >| 并核 rc/行数后重跑才有效。
  2. 突变自证(两条,均断言命中目标):回退 1 处改写(t1.var_seq_elem_invariant)⇒ 台账 69 · bool 1
    (含源行片段 @@ tt_atom(AK_SEQUENCE, -1, tt_cons( ⇒ 读数活着);同突变态跑套件 ⇒ 恰 1 项红
    (selfsource_bool_bucket_zero),其余全绿 ⇒ 检测特异。
  3. 入 CI(selfhost-tests 挂点,tests/selfhost/test_s1p_liveness.py):
    • ⓪ 正则自检:5 条合成行钉 HIT 形状(含可选 @@ 后缀 + 行首锚定 + 缺字段负例)——防「格式漂了 ⇒ 0 命中 ⇒ 探针假死」(本档在 CI 上正是这样红过一次);
    • ⑦ 自源台账:先断言台账非空(否则 bool 桶=0 与「打点没装」不可区分),再断言 bool 桶为 0。
  4. 本地四 job 全绿:check(^error[ = 0)· bootstrap-tests · selfhost-tests · suite 均 rc=0;
    ELF canary 5/5 PASS(f1137275…/28854 等锁定值未动 ⇒ 发射面零泄漏)。

版本位

不动 CIR_CACHE_VER:无「已接受程序 IR 变化」(只改编译器自身两个自测文件的调用形态 + 多一个 helper);
两文件自身 AST 变 ⇒ 其 .cir 条目 miss 重建,其余条目语义等价 ⇒ 命中无害,身份闸仍兜底。

落纸事实(口径边界)

  • 「bool 桶归零」的覆盖面 = 非字面量实参面(S1P 对字面量多态主动跳过,套件护栏③钉住 f(3) 零打点);
  • 方法调用面不在本点(套件 METHOD_GAP 腿钉住:s.m(b) 异型 0 打点;该不可达分支不得当死码删);
  • 台账归零 ≠ 语义正确:残桶 68 点(string↔int)未修,S2 路线 1 须逐点给语义依据。
  • 记录文件:docs/superpowers/plans/2026-09-18-bool-signature-alignment.md

⚠ 堆叠顺序

本分支的 base = db649d17(#127 的头)。请先合 #127,再合本 PR(#127 未合时本 PR 的 diff 会一并显示 #127 的内容)。

…ol 桶归零」入 CI

【形态】`fails = fails + ts_check(name, <谓词>, 1)`:`ts_check` 形参声明 int,而第二实参**本就是 bool 表达式** ⇒
靠 bool 隐式当 int(0/1) 参与 `!=` 而「恰好正确」(S1P 台账的 `形参 int ← 实参 bool`,p_ti=0/a_ti=2)。
不是错值,是靠隐式转换活着的接缝——收口后(bool 不再当 int)这批点会整片翻面,且失效信号是「自测数不准」= 静默类。

【改法】新增签名 helper `ts_check_b(name, got: bool, want: bool) -> int`(`type_selftest.cr`)与
`ps_check_b`(`purity_selftest.cr`),返回 int 以**保持 `fails = fails + …` 惯用式不变**(累加值不变);
171 处按「第二实参为括号包裹的 bool 表达式」逐处改写(type 166 + purity 5)。

【台账(oracle = 被修对象自身输出,非文本扫描)】`CORE_S1P=1 ./build/corec check src/compiler/main.cr`:
改前 **239** 点(bool 桶 **171**)⇒ 改后 **68** 点(bool 桶 **0**;残桶 = string↔int:46 点 `0←0` + 22 点 `2←3`,
归 S2 路线 1 单独批,本批不动)。

【逐处留痕】`docs/superpowers/plans/2026-09-18-bool171-sites.tsv`:171 行(file/line/helper/case-name/第二实参/第三实参),
案名去重后仍 171(无重复、无遗漏),数据行 sha256 = 6dfee7aa93cdb7e5664da60e89fc515adb40654ed13b042b3ad7efa7b8366e10;
第三实参 true 170 处 · false 1 处(负断言 `iface.compare_is_live`,改前形 `..., 0)`,语义逐字对齐)。

【零行为变化】`selftest-types` 421 行(415/415,rc=0)与 `selftest-purity` 28 行(26/26,rc=0)运行输出与改前基线
**逐字节相同**(cmp 无差异)。⚠ 取数陷阱已留痕:首轮比较因 fish noclobber 未真跑(重定向失败 ⇒ 比的是旧文件 ⇒ 假 IDENTICAL),
改 `>|` 并核 rc/行数后重跑才有效。

【判据入 CI(selfhost-tests)】`tests/selfhost/test_s1p_liveness.py` 新增:
① **⓪ 正则自检**:5 条合成行钉 `HIT` 形状(含可选 ` @@ ` 源行片段 + 行首锚定 + 缺字段负例)——防「格式漂了 ⇒
0 命中 ⇒ 探针假死」(本档在 CI 上正是这样红过一次);
② **⑦ 自源台账**:**先断言台账非空**(否则 `bool 桶=0` 与「打点没装」不可区分),再断言 bool 桶为 0。
实测 PASS 16s(nice);突变态 rc=1 且**恰 1 项红**(`selfsource_bool_bucket_zero`)⇒ 检测特异。

【突变自证(两条,均断言命中目标)】回退 1 处改写(`t1.var_seq_elem_invariant`,已断言改到该行)⇒
台账 69 · bool 1(含源行片段 `@@ tt_atom(AK_SEQUENCE, -1, tt_cons(`,证明读数活着);同突变态跑套件 ⇒ 仅判据⑦红。

【版本位 / 缓存面】不动 `CIR_CACHE_VER`:无「已接受程序 IR 变化」(只有编译器自身两个自测文件的调用形态 + 多一个 helper);
两文件自身 AST 变 ⇒ 其 `.cir` 条目 miss 重建,其余条目语义等价 ⇒ 命中无害,身份闸仍兜底。

【落纸事实】「bool 桶归零」的覆盖面 = **非字面量实参面**(S1P 对字面量多态主动跳过,套件护栏③钉住);
方法调用面不在本点(套件 `METHOD_GAP` 腿钉住,不可达分支不得当死码删);**台账归零 ≠ 语义正确**(残桶 68 未修)。
记录:`docs/superpowers/plans/2026-09-18-bool-signature-alignment.md`。

判据:check/bootstrap-tests/selfhost-tests/suite 四 job 本地全绿 ·
`CI_JOB_NAME=check` 的 `^error[` = 0 · 台账 68/bool 0 · selftest 双档逐字节同基线 · 突变自证红得特异。
@dslsdzc
dslsdzc force-pushed the feature/b8-bool-sig branch from cf971c4 to 48dd2c0 Compare September 18, 2026 12:21
@dslsdzc
dslsdzc merged commit ec8ef5e into develop Sep 18, 2026
4 checks passed
@dslsdzc
dslsdzc deleted the feature/b8-bool-sig branch September 18, 2026 12:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant