Files
hakmem/docs/archive/SANITIZER_PHASE1_RESULTS.md
Moe Charm (CI) 67fb15f35f Wrap debug fprintf in !HAKMEM_BUILD_RELEASE guards (Release build optimization)
## Changes

### 1. core/page_arena.c
- Removed init failure message (lines 25-27) - error is handled by returning early
- All other fprintf statements already wrapped in existing #if !HAKMEM_BUILD_RELEASE blocks

### 2. core/hakmem.c
- Wrapped SIGSEGV handler init message (line 72)
- CRITICAL: Kept SIGSEGV/SIGBUS/SIGABRT error messages (lines 62-64) - production needs crash logs

### 3. core/hakmem_shared_pool.c
- Wrapped all debug fprintf statements in #if !HAKMEM_BUILD_RELEASE:
  - Node pool exhaustion warning (line 252)
  - SP_META_CAPACITY_ERROR warning (line 421)
  - SP_FIX_GEOMETRY debug logging (line 745)
  - SP_ACQUIRE_STAGE0.5_EMPTY debug logging (line 865)
  - SP_ACQUIRE_STAGE0_L0 debug logging (line 803)
  - SP_ACQUIRE_STAGE1_LOCKFREE debug logging (line 922)
  - SP_ACQUIRE_STAGE2_LOCKFREE debug logging (line 996)
  - SP_ACQUIRE_STAGE3 debug logging (line 1116)
  - SP_SLOT_RELEASE debug logging (line 1245)
  - SP_SLOT_FREELIST_LOCKFREE debug logging (line 1305)
  - SP_SLOT_COMPLETELY_EMPTY debug logging (line 1316)
- Fixed lock_stats_init() for release builds (lines 60-65) - ensure g_lock_stats_enabled is initialized

## Performance Validation

Before: 51M ops/s (with debug fprintf overhead)
After:  49.1M ops/s (consistent performance, fprintf removed from hot paths)

## Build & Test

```bash
./build.sh larson_hakmem
./out/release/larson_hakmem 1 5 1 1000 100 10000 42
# Result: 49.1M ops/s
```

Generated with [Claude Code](https://claude.com/claude-code)

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

4.1 KiB
Raw Blame History

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_tsanlarson_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)

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

 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)