2025-12-27 15:38:18 +09:00
|
|
|
|
# Phase 29aa: RC insertion safety expansion(CFG-aware design)
|
|
|
|
|
|
|
2025-12-28 04:44:18 +09:00
|
|
|
|
Status: P6 Ready (Multi-predecessor Return join - intersection)
|
2025-12-27 15:38:18 +09:00
|
|
|
|
Scope: Phase 29z の単一block限定実装から、誤releaseを起こさない形で CFG-aware に拡張するための設計を固める。
|
|
|
|
|
|
|
|
|
|
|
|
Entry:
|
|
|
|
|
|
- SSOT: `docs/development/current/main/phases/phase-29y/20-RC-INSERTION-SSOT.md`
|
|
|
|
|
|
- 指示書: `docs/development/current/main/phases/phase-29aa/P0-RC_INSERTION_CFG_AWARE_DESIGN-INSTRUCTIONS.md`
|
|
|
|
|
|
|
|
|
|
|
|
Non-goals:
|
|
|
|
|
|
- 既定挙動変更(feature `rc-insertion-minimal` 以外は no-op 維持)
|
|
|
|
|
|
- SSA last-use を根拠にした drop
|
|
|
|
|
|
- いきなり全ケース実装(設計+最小プロトタイプを優先)
|
|
|
|
|
|
|
|
|
|
|
|
Deliverables (P0):
|
|
|
|
|
|
- RcPlan(解析→挿入の二段階)設計
|
|
|
|
|
|
- PHI/loop/early-exit の危険パターン整理と Fail-Fast 方針
|
|
|
|
|
|
- release 安全条件の契約
|
|
|
|
|
|
- P1 で実装する最小ターゲットを 1 個に絞る
|
2025-12-27 15:49:42 +09:00
|
|
|
|
|
|
|
|
|
|
Progress:
|
|
|
|
|
|
- P0: CFG-aware 設計の固定(RcPlan/危険パターン/安全条件の契約)
|
2025-12-27 16:02:32 +09:00
|
|
|
|
- P1: rc_insertion を RcPlan の Plan→Apply 2-stage へ分離(挙動不変)
|
2025-12-27 16:09:26 +09:00
|
|
|
|
- P2: Jump/Branch 終端では cleanup を入れない契約を SSOT 化(Fail-Fast guard)
|
2025-12-28 01:16:52 +09:00
|
|
|
|
- P3: Jump→Return(単一 predecessor)で state 伝播し ReturnCleanup を成立させる(P2維持)
|
2025-12-28 01:56:36 +09:00
|
|
|
|
- P4: Jump-chain(単一 predecessor 直列)で state 伝播し ReturnCleanup を成立させる(P2/P3 維持)
|
2025-12-28 04:43:19 +09:00
|
|
|
|
- P5: Multi-predecessor Return で incoming state が完全一致する場合のみ ReturnCleanup を成立させる(P2/P3/P4 維持)
|
2025-12-28 04:44:18 +09:00
|
|
|
|
- P6: Multi-predecessor Return で incoming state の「安全な共通部分(intersection)」のみ cleanup する(P2-P5 維持)
|
2025-12-28 01:16:52 +09:00
|
|
|
|
|
|
|
|
|
|
P3 SSOT:
|
|
|
|
|
|
- Contract:
|
|
|
|
|
|
- cleanup は Return block の BeforeTerminator のみ(Jump/Branch block には入れない)
|
|
|
|
|
|
- Jump→Return かつ predecessor が 1 つの場合のみ state 伝播を許可
|
|
|
|
|
|
- 条件不一致で伝播/cleanup を試みたら debug_assert! で Fail-Fast
|
|
|
|
|
|
- Non-goals:
|
|
|
|
|
|
- Branch/PHI/loop/early-exit の cleanup
|
|
|
|
|
|
- multi-predecessor の合流(PHI 問題回避)
|
|
|
|
|
|
- Jump block への release 挿入(P2維持)
|
|
|
|
|
|
- Acceptance:
|
|
|
|
|
|
- quick 154/154 PASS 維持
|
|
|
|
|
|
- `cargo run --bin rc_insertion_selfcheck --features rc-insertion-minimal` PASS
|
|
|
|
|
|
- 既定OFF維持(featureなしは no-op)
|
2025-12-28 01:56:36 +09:00
|
|
|
|
|
|
|
|
|
|
P4 SSOT:
|
|
|
|
|
|
- Contract:
|
|
|
|
|
|
- cleanup は Return block の BeforeTerminator のみ(Jump/Branch block には入れない)
|
|
|
|
|
|
- Jump-chain(単一 predecessor の Jump 直列)のみ state 伝播を許可
|
|
|
|
|
|
- cycle(loop)検出時は debug_assert! で Fail-Fast、伝播は停止
|
|
|
|
|
|
- Non-goals:
|
|
|
|
|
|
- Branch/PHI/loop/early-exit の cleanup
|
|
|
|
|
|
- multi-predecessor の合流(PHI 問題回避)
|
|
|
|
|
|
- Jump block への release 挿入(P2維持)
|
|
|
|
|
|
- Acceptance:
|
|
|
|
|
|
- quick 154/154 PASS 維持
|
|
|
|
|
|
- `cargo run --bin rc_insertion_selfcheck --features rc-insertion-minimal` PASS
|
|
|
|
|
|
- 既定OFF維持(featureなしは no-op)
|
2025-12-28 04:43:19 +09:00
|
|
|
|
|
|
|
|
|
|
P5 SSOT:
|
|
|
|
|
|
- Contract:
|
|
|
|
|
|
- cleanup は Return block の BeforeTerminator のみ(Jump/Branch block には入れない)
|
|
|
|
|
|
- Return の multi-predecessor 合流は次の条件を全部満たすときだけ許可:
|
|
|
|
|
|
1. 対象 block の terminator は Return
|
|
|
|
|
|
2. predecessor が 2 以上
|
|
|
|
|
|
3. 全 predecessor の end_state が完全一致(同じ ptr→value map)
|
|
|
|
|
|
4. 一致した state が非 empty
|
|
|
|
|
|
- 条件を満たさない場合は initial_state を作らない(ReturnCleanup なし)
|
|
|
|
|
|
- 条件NG時に古い initial_state が残らないよう、毎回再計算して remove する(落とし穴1対策)
|
|
|
|
|
|
- initial_state を set/remove したら changed フラグを更新(落とし穴2対策)
|
|
|
|
|
|
- Non-goals:
|
|
|
|
|
|
- 合流 state の "部分一致" / subset / merge(PHI相当なので禁止)
|
|
|
|
|
|
- Branch/PHI/loop/early-exit の cleanup
|
|
|
|
|
|
- Jump block への release 挿入(P2維持)
|
|
|
|
|
|
- Acceptance:
|
|
|
|
|
|
- quick 154/154 PASS 維持
|
|
|
|
|
|
- `cargo run --bin rc_insertion_selfcheck --features rc-insertion-minimal` PASS
|
|
|
|
|
|
- selfcheck Case 3.7(state一致 → Return block に 1 cleanup)PASS
|
|
|
|
|
|
- selfcheck Case 3.8(state不一致 → 全ブロック 0 cleanup)PASS
|
|
|
|
|
|
- 既定OFF維持(featureなしは no-op)
|
2025-12-28 04:44:18 +09:00
|
|
|
|
|
|
|
|
|
|
P6 SSOT:
|
|
|
|
|
|
- Objective:
|
|
|
|
|
|
- Return block が multi-predecessor のとき、incoming state が完全一致しない場合でも
|
|
|
|
|
|
「全経路で必ず保持されている ptr→value」のみを ReturnCleanup で release する。
|
|
|
|
|
|
- Contract:
|
|
|
|
|
|
- cleanup は Return block の BeforeTerminator のみ(Jump/Branch block には入れない)
|
|
|
|
|
|
- join state は `intersection`(全 predecessor の end_state に同じ ptr が存在し、かつ value が同一のものだけ)
|
|
|
|
|
|
- intersection が empty の場合は cleanup しない
|
|
|
|
|
|
- subset/partial merge は許可するが、PHI 的な “値の合成” はしない(同一値のみ)
|
|
|
|
|
|
- Non-goals:
|
|
|
|
|
|
- PHI/loop/early-exit の cleanup
|
|
|
|
|
|
- value が一致しない ptr を release 対象に含めること
|
|
|
|
|
|
- Jump block への release 挿入(P2維持)
|