# ChatGPT進捗報告と残存問題 (2025-12-03) **最終更新**: 2025-12-03 **Commit**: 054645416 **ステータス**: 🟡 部分的緩和、根本原因は未解決 --- ## 📊 実施された変更(ChatGPT作業) ### 1. SuperSlab Registry Fallback ✅ 防御的対策 **場所**: `core/hakmem_super_registry.h` **変更内容**: ```c // ハッシュマップでミスした場合、レガシーテーブルをプローブ if (ss == NULL) { // 全lg_sizeをループしてレジストリテーブルから検索 for (int lg = SUPERSLAB_LG_MIN; lg <= SUPERSLAB_LG_MAX; lg++) { // linear probing with SUPER_MAX_PROBE } } ``` **評価**: - ✅ **効果**: 初期化中のNULL返却を防ぐ - ⚠️ **懸念**: 登録バグを隠す可能性(なぜハッシュマップにない?) - 📈 **コスト**: +10-30サイクル(コールドパスのみ) **根治 or 対症療法?**: **対症療法** - レジストリ不整合の根本原因は未解決 --- ### 2. TLS SLL Push時の検証 ✅ リスト汚染防止 **場所**: `core/box/tls_sll_box.h` **変更内容**: ```c // SuperSlab lookup 失敗時にpushを拒否 if (!ss) { fprintf(stderr, "[TLS_SLL_PUSH_NO_SS] cls=%d base=%p\n", ...); return false; // pushを拒否 } // class_idx ミスマッチ検出時もpushを拒否 if (meta_cls != class_idx) { fprintf(stderr, "[TLS_SLL_PUSH_META_MISMATCH] ...\n"); return false; // pushを拒否 } ``` **評価**: - ✅ **効果**: 不正なポインタによるリスト汚染を早期ブロック - ✅ **安全性**: フリーリスト破損を防ぐ - 📈 **コスト**: +5-10サイクル/push(許容範囲) **根治 or 対症療法?**: **根治寄り** - 早期検出で二次被害を防ぐ --- ### 3. SuperSlab Allocation クラス指定修正 ✅ 根治 **場所**: `core/superslab_allocate.c` **変更内容**: ```c // 以前: ダミー class=8 を渡してた → OOB sp_internal_allocate_superslab(lg, 8 /* dummy */); // 修正後: 実際のclass_idxを渡す sp_internal_allocate_superslab(lg, class_idx); ``` **評価**: - ✅ **効果**: class=8 によるOOBアクセスを根絶 - ✅ **構造**: 正しいメタデータが登録される - 📈 **コスト**: 0(既存パラメータの修正のみ) **根治 or 対症療法?**: **✅ 根治** - 構造的バグの修正 --- ### 4. デバッグ出力追加 ✅ 診断ツール **場所**: 複数ファイル **変更内容**: - 最初256回のpush/popをトレース - 最初4回のミスマッチをログ出力 - SuperSlab登録状態を出力 **評価**: - ✅ **効果**: 問題の可視化 - ✅ **オーバーヘッド**: 初回のみ(本番影響なし) **根治 or 対症療法?**: **診断ツール** - 修正ではない --- ### 5. TLS Hint Box 削除 ⏳ 一時的撤退 **場所**: `core/box/ss_tls_hint_box.{c,h}` **変更内容**: - Phase 1最適化を一旦削除 - 安定性優先のため **評価**: - ✅ **効果**: 調査対象を減らす - ⚠️ **トレードオフ**: Phase 1成果を失う **根治 or 対症療法?**: **戦略的撤退** - 問題切り分けのため --- ## 🔴 残存する問題(CRITICAL) ### 問題の症状 ``` [TLS_SLL_HDR_RESET] cls=1 base=0x... got=0x31 expect=0xa1 Segmentation fault (exit code 139) ``` **発生タイミング**: sh8bench実行後 ~60秒 **頻度**: 100%再現(60秒後) **影響**: 全ての構成に影響(共通コードパス) --- ### 技術的詳細 #### 1. ポインタオフセット異常 ``` 期待: クラス1のベースポインタ (16Bストライド境界) 実際: 期待値 + 16B (次のブロックの境界) 差分: +16バイト = クラス1のストライド1個分 ``` **これが意味すること**: - ポインタが**隣のブロック**を指してる - = 本来のブロックではない - = Use-After-Free または ポインタ演算エラー #### 2. SuperSlab Lookup 失敗 ```c SuperSlab* ss = hak_super_lookup(ptr); // → NULL ``` **これが意味すること**: - そのポインタは**割り当てられてない領域** - または**既に解放済み** - または**ポインタ演算が間違ってる** #### 3. ヘッダー破損 ``` 期待: 0xa1 (0xa0 MAGIC | class_idx=1) 実際: 0x31 (ASCIIの '1' またはユーザーデータ) ``` **これが意味すること**: - ヘッダー位置に**ユーザーデータが存在** - = ヘッダーが書かれてない - または ヘッダーが上書きされた - または ポインタが間違った位置を指してる --- ## 🔍 根本原因の候補(6パターン) ### パターンA: ポインタ演算の二重適用 ⭐⭐⭐ ```c // 疑わしいパターン: void* user = base + 16; // +16 (正しい) // ... 後で ... void* wrong = user + 16; // 再度 +16 (誤り) ← ★これ? ``` **チェック箇所**: - `ptr_conversion_box.h` の `ptr_user_to_base()` - Magazine ⇔ TLS SLL の変換パス - Refill/Spill/Drain の全経路 ### パターンB: Magazine Spill での型変換漏れ ⭐⭐ ```c // commit f3f75ba3d で修正済みだが... void* p = mag->items[i].ptr; // これはUSER? BASE? tls_sll_push(class_idx, p); // もし間違った型なら +16 ずれる ``` **チェック箇所**: - `hakmem_tiny_refill.inc.h` (refill経路) - Magazine drain経路 - Magazine → TLS SLL の全パス ### パターンC: Headerless モードの干渉 ⭐⭐ ```c // Headerless OFF なのに、どこかで ON のコードが動いてる? #if HAKMEM_TINY_HEADERLESS return base; // offset 0 #else return base + 1; // offset 1 #endif // もし混在してたら... // Push時: offset 1 で計算 → base + 1 // Pop時: offset 0 で計算 → base ← ズレる ``` **チェック箇所**: - Makefile の `-DHAKMEM_TINY_HEADERLESS=0` が全ファイルに適用されてるか - 条件コンパイルの境界 - `tiny_layout_box.h` の `tiny_user_offset()` の全呼び出し元 ### パターンD: Use-After-Free ⭐ ```c // どこかで解放済みポインタを再利用してる? free(p1); // p1 を解放 // ... 後で ... void* p2 = alloc(); // p1 と同じアドレスを再割り当て free(p1); // ★ Double-Free! ``` **チェック箇所**: - Magazine の重複エントリ - TLS SLL の循環参照 - Freelist の破損 ### パターンE: Adjacent Block Overflow ⭐ ```c // 隣接ブロックからのオーバーフロー char* block1 = alloc(15); // クラス1 (16B) strcpy(block1, "0123456789ABCDEF!"); // 17バイト書き込み ← ★オーバーフロー // → block2 のヘッダーを破壊 ``` **チェック箇所**: - sh8bench のメモリアクセスパターン - Boundary check の有無 ### パターンF: Atomic Fence 欠如 ⭐ ```c // ヘッダー書き込みと push の順序が逆転? *hdr = magic; // ヘッダー書き込み tls_sll_push(...); // push // CPU/コンパイラが並び替え: tls_sll_push(...); // ★ 先に実行 *hdr = magic; // 後で実行 ← 遅すぎる ``` **チェック箇所**: - ヘッダー書き込み直後に `atomic_thread_fence()` があるか - Free path の順序保証 --- ## 📋 次のChatGPTタスク(優先順位順) ### Task A: ポインタ演算の完全監査 ⭐⭐⭐ **目的**: パターンA/B/Cを特定 **手順**: 1. `ptr_conversion_box.h` の全使用箇所をリスト化 2. Magazine ⇔ TLS SLL の変換パス全てを追跡 3. 2重オフセット適用がないか確認 4. Headerless フラグの一貫性確認 **期待成果**: 「どこで +16 が余分に適用されたか」を特定 --- ### Task B: [TLS_SLL_HDR_RESET] 時の詳細ログ追加 ⭐⭐⭐ **目的**: 16バイトずれの直接原因を特定 **実装**: ```c // tls_sll_box.h の HDR_RESET 検出時: fprintf(stderr, "[TLS_SLL_HDR_RESET_DETAIL]\n" " class_idx: %d\n" " base_ptr: %p\n" " base_ptr_expected: %p\n" " offset_delta: %+ld\n" " came_from: %s\n" " allocation_trace: %s\n", class_idx, raw_base, raw_base - 16, // 期待値(-16したもの) 16, where, get_alloc_trace(raw_base)); ``` **期待成果**: 「そのポインタがどこから来たか」を特定 --- ### Task C: Headerless フラグの実行時確認 ⭐⭐ **目的**: パターンCを検証 **実装**: ```c // tiny_layout_box.h に追加: static inline void verify_headerless_mode(void) { static int once = 0; if (!once) { once = 1; fprintf(stderr, "[HEADERLESS_MODE_CHECK]\n"); #if HAKMEM_TINY_HEADERLESS fprintf(stderr, " HAKMEM_TINY_HEADERLESS=1 (ON)\n"); #else fprintf(stderr, " HAKMEM_TINY_HEADERLESS=0 (OFF)\n"); #endif fprintf(stderr, " tiny_user_offset(1)=%zu\n", tiny_user_offset(1)); } } // hakmem.c の init で呼び出す ``` **期待成果**: ビルドとランタイムの整合性確認 --- ## 🎯 評価サマリー | カテゴリ | 評価 | 説明 | |---------|------|------| | **根治的修正** | ✅ 40% | SuperSlab allocation class修正、TLS SLL検証 | | **防御的対策** | ⚠️ 40% | Registry fallback、push validation | | **診断ツール** | ✅ 20% | デバッグ出力、トレース | | **根本原因** | ❌ 未解決 | 16バイトずれの源泉が不明 | | **パフォーマンス** | ✅ 良好 | < 2% オーバーヘッド | --- ## ✅ 良い点 1. **SuperSlab allocation class修正** - 構造的バグを根治 2. **TLS SLL検証** - リスト汚染を早期ブロック 3. **デバッグ出力** - 問題の可視化に貢献 4. **戦略的撤退** - Phase 1削除で調査対象を絞った --- ## ⚠️ 懸念点 1. **Registry fallback は対症療法** - なぜハッシュマップにない? 2. **根本原因は未解決** - 16バイトずれの源泉が不明 3. **60秒後再発** - 累積的な問題が残存 4. **Phase 1成果を失った** - TLS Hint Box削除 --- ## 📌 次のステップ(明確な指示) **ChatGPTへの指示**: ``` 良い進捗だけど、根本原因が残ってる。 問題: - ポインタが16バイトずれてる(クラス1 → クラス2境界) - 60秒後に再発(累積的) - SuperSlab lookup失敗 次のタスク(優先順位順): A. ポインタ演算の完全監査 ⭐⭐⭐ - Magazine ⇔ TLS SLL の全変換パスを追跡 - 2重オフセット適用がないか確認 - Headerless フラグの一貫性確認 B. [TLS_SLL_HDR_RESET] 時の詳細ログ追加 ⭐⭐⭐ - 期待値 vs 実際値 - ポインタの来歴(どこから?) - 割り当てトレース C. Headerless フラグの実行時確認 ⭐⭐ - ビルドとランタイムの整合性確認 期待成果: - 「いつ、どこで +16 が余分に適用されたか」を特定 - そのコードを修正(1-3行) ``` --- ## 📖 関連ドキュメント | ドキュメント | 目的 | |------------|------| | `CHATGPT_HANDOFF_TLS_DIAGNOSIS.md` | 7ステップ診断手順 | | `TLS_SLL_HEADER_CORRUPTION_DIAGNOSIS.md` | 6パターン詳細 (1,150行) | | `STATUS_2025_12_03_CURRENT.md` | プロジェクト全体ステータス | --- **結論**: 部分的に前進したが、**根本原因(16バイトずれ)は未解決**。次のタスクA-Cで特定が期待される。 --- *作成: Claude Code (2025-12-03)* *Commit: 054645416*