Files
hakmem/docs/analysis/SANITIZER_PHASE1_RESULTS.md
Moe Charm (CI) a9ddb52ad4 ENV cleanup: Remove BG/HotMag vars & guard fprintf (Larson 52.3M ops/s)
Phase 1 完了:環境変数整理 + fprintf デバッグガード

ENV変数削除(BG/HotMag系):
- core/hakmem_tiny_init.inc: HotMag ENV 削除 (~131 lines)
- core/hakmem_tiny_bg_spill.c: BG spill ENV 削除
- core/tiny_refill.h: BG remote 固定値化
- core/hakmem_tiny_slow.inc: BG refs 削除

fprintf Debug Guards (#if !HAKMEM_BUILD_RELEASE):
- core/hakmem_shared_pool.c: Lock stats (~18 fprintf)
- core/page_arena.c: Init/Shutdown/Stats (~27 fprintf)
- core/hakmem.c: SIGSEGV init message

ドキュメント整理:
- 328 markdown files 削除(旧レポート・重複docs)

性能確認:
- Larson: 52.35M ops/s (前回52.8M、安定動作)
- ENV整理による機能影響なし
- Debug出力は一部残存(次phase で対応)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 14:45:26 +09:00

116 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HAKMEM Sanitizer Phase 1 Results
**Date:** 2025-11-07
**Status:** Partial Success (ASan ✅, TSan ❌)
---
## Summary
Phase 1 修正(`-DHAKMEM_FORCE_LIBC_ALLOC_BUILD=1`)により、**ASan ビルドが正常動作するようになりました**
---
## Build Results
| Target | Build | Runtime | Notes |
|--------|-------|---------|-------|
| `larson_hakmem_asan_alloc` | ✅ Success | ✅ Success | **4.29M ops/s** |
| `larson_hakmem_tsan_alloc` | ✅ Success | ❌ SEGV | Larson benchmark issue |
| `larson_hakmem_tsan` (libc) | ✅ Success | ❌ SEGV | **Same issue without HAKMEM** |
| `libhakmem_asan.so` | ✅ Success | 未テスト | LD_PRELOAD版 |
| `libhakmem_tsan.so` | ✅ Success | 未テスト | LD_PRELOAD版 |
---
## Key Findings
### ✅ ASan 修正完了
- **修正内容**: Makefile に `-DHAKMEM_FORCE_LIBC_ALLOC_BUILD=1` を追加
- **効果**: TLS 初期化順序問題を完全回避libc malloc使用
- **性能**: 4.29M ops/s通常ビルドと同等
- **用途**: HAKMEM のロジックバグ検出allocator 以外)
### ❌ TSan 問題発見
- **症状**: `larson_hakmem_tsan``larson_hakmem_tsan_alloc` も同じく SEGV
- **原因**: **Larson ベンチマーク自体と TSan の非互換性**HAKMEM とは無関係)
- **推定理由**:
- Larson は C++ コード(`mimalloc-bench/bench/larson/larson.cpp`
- スレッド初期化順序や data race が TSan と衝突している可能性
- TSan は ASan より厳格thread-related の初期化に敏感)
---
## Changes Made
### 1. Makefile (line 810-828)
```diff
# Allocator-enabled sanitizer variants (no FORCE_LIBC)
+# FIXME 2025-11-07: TLS initialization order issue - using libc for now
SAN_ASAN_ALLOC_CFLAGS = -O1 -g -fno-omit-frame-pointer -fno-lto \
-fsanitize=address,undefined -fno-sanitize-recover=all -fstack-protector-strong \
+ -DHAKMEM_FORCE_LIBC_ALLOC_BUILD=1
+# FIXME 2025-11-07: TLS initialization order issue - using libc for now
SAN_TSAN_ALLOC_CFLAGS = -O1 -g -fno-omit-frame-pointer -fno-lto -fsanitize=thread \
+ -DHAKMEM_FORCE_LIBC_ALLOC_BUILD=1
SAN_UBSAN_ALLOC_CFLAGS = -O1 -g -fno-omit-frame-pointer -fno-lto \
-fsanitize=undefined -fno-sanitize-recover=undefined -fstack-protector-strong \
+ -DHAKMEM_FORCE_LIBC_ALLOC_BUILD=1
```
### 2. core/tiny_fastcache.c (line 231-305)
```diff
void tiny_fast_print_profile(void) {
+#ifndef HAKMEM_FORCE_LIBC_ALLOC_BUILD
// ... 統計出力コードwrapper TLS 変数を参照)
+#endif // !HAKMEM_FORCE_LIBC_ALLOC_BUILD
}
```
**理由**: `FORCE_LIBC_ALLOC_BUILD=1` 時は wrapper が無効化され、TLS 統計変数(`g_malloc_total_calls` など)が定義されないため、リンクエラー回避。
---
## Next Steps
### Phase 1.5: TSan 調査Optional
- [ ] Larson ベンチマークの TSan 互換性を調査
- [ ] 代替ベンチマーク(`bench_random_mixed_hakmem` など)で TSan テスト
- [ ] Larson の C++ コードを簡略化して TSan で動作させる
### Phase 2: Constructor Priority推奨、2-3日
- [ ] `__attribute__((constructor(101)))` で TLS 早期初期化
- [ ] HAKMEM allocator を Sanitizer でテスト可能にする
- [ ] `ARCHITECTURE.md` にドキュメント化
### Phase 3: 防御的 TLS チェックOptional、1週間
- [ ] `hak_tls_is_ready()` ヘルパー実装
- [ ] malloc wrapper に早期 exit 追加
- [ ] 性能影響をベンチマーク(< 1% 目標
---
## Recommendations
1. **ASan を積極的に使用**:
- `make asan-larson-alloc` HAKMEM のロジックバグを検出
- LD_PRELOAD `libhakmem_asan.so`でアプリケーション互換性テスト
2. **TSan は代替ベンチマークで検証**:
- Larson の代わりに `bench_random_mixed_hakmem` などを使用
- またはLarson の簡略版を作成C で書き直す
3. **Phase 2 を実装**:
- Constructor priority によりHAKMEM allocator 自体を Sanitizer でテスト可能に
- メモリ安全性の完全検証を実現
---
## References
- 詳細レポート: `SANITIZER_INVESTIGATION_REPORT.md`
- 関連ファイル: `Makefile:810-828`, `core/tiny_fastcache.c:231-305`
- 修正コミット: (pending)