Files
hakmem/docs/CHATGPT_PROGRESS_AND_ISSUES.md

421 lines
11 KiB
Markdown
Raw Normal View History

# 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*