---
generated_at: 2026-02-22 12:00:00
metrics:
  claims_total: 106
  claims_with_evidence: 102
  claims_without_evidence: 4
confidence_derived: 0.96
---

# 根拠レポート：unix-misc 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：102 / 106、根拠なし：4
- 優先レビュー（高）
  1. **C-037**：uv_tty_reset_modeのerrno保存・復元の検証 - コード上はsaved_errno変数で保存・復元しているが、async signal-safeであることの完全な保証はコードレビューのみでは判断困難
  2. **C-075**：uv__random_devurandomのuv_once初期化一度限り保証 - uv_onceの挙動はlibuv内部実装に依存
  3. **C-093**：UUIDバイト6と8のスキップロジック - random-sysctl-linux.cの実装詳細であり、UUIDフォーマット仕様への参照が必要
  4. **C-106**：大容量メモリでのオーバーフロー検証 - uint64_t演算の実際の挙動はプラットフォーム依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `src/unix/tty.c` - TTY関連の全関数実装（uv__tcsetattr, uv_tty_init, uv_tty_set_mode, uv__tty_close, uv_tty_get_winsize, uv_guess_handle, uv_tty_reset_mode, uv_tty_set_vterm_state, uv_tty_get_vterm_state）
- E-02: `src/unix/posix-hrtime.c` - POSIX高精度タイマー実装（uv__hrtime）
- E-03: `src/unix/posix-poll.c` - POSIXポーリング実装（uv__platform_loop_init, uv__platform_loop_delete, uv__io_fork, uv__pollfds_maybe_resize, uv__pollfds_swap, uv__pollfds_add, uv__pollfds_del, uv__io_poll, uv__platform_invalidate_fd, uv__io_check_fd）
- E-04: `src/unix/random-devurandom.c` - /dev/urandom乱数生成実装（uv__random_readpath, uv__random_devurandom）
- E-05: `src/unix/random-getentropy.c` - getentropy乱数生成実装（uv__random_getentropy）
- E-06: `src/unix/random-getrandom.c` - getrandom乱数生成実装（uv__random_getrandom）
- E-07: `src/unix/random-sysctl-linux.c` - sysctl乱数生成実装（uv__random_sysctl）
- E-08: `src/unix/sysinfo-loadavg.c` - ロードアベレージ取得実装（uv_loadavg）
- E-09: `src/unix/sysinfo-memory.c` - メモリ情報取得実装（uv_get_free_memory, uv_get_total_memory）
- E-10: `src/unix/internal.h` - Unix内部ヘッダ（uv_clocktype_t, uv__io_cb_t, マクロ定義、関数プロトタイプ宣言）
- E-11: `include/uv.h` - libuvパブリックAPIヘッダ（uv_tty_mode_t, uv_handle_type等の型定義）

## 3) Claims と根拠の対応（レビューの主戦場）

### tty.c関連 (C-001 ~ C-039)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | uv__tcsetattr: 有効なfd/termiosで0が返る | E-01 (L69-80) | ○ |
| C-002 | uv__tcsetattr: 無効なfdでUV__ERR(errno)が返る | E-01 (L76-77) | ○ |
| C-003 | uv__tcsetattr: EINTR時にリトライされる | E-01 (L72-74) | ○ |
| C-004 | uv__tty_is_slave: スレーブTTYで1が返る | E-01 (L82-134) | ○ |
| C-005 | uv__tty_is_slave: マスターTTYで0が返る | E-01 (L82-134) | ○ |
| C-006 | uv_tty_init: 有効なTTY fdで初期化成功 | E-01 (L136-242) | ○ |
| C-007 | uv_tty_init: UV_FILEタイプでEINVAL | E-01 (L150-152) | ○ |
| C-008 | uv_tty_init: UV_UNKNOWN_HANDLEでEINVAL | E-01 (L150-152) | ○ |
| C-009 | uv_tty_init: O_WRONLYでWRITABLEフラグ | E-01 (L235-236) | ○ |
| C-010 | uv_tty_init: O_RDONLYでREADABLEフラグ | E-01 (L233-234) | ○ |
| C-011 | uv_tty_init: fcntl失敗時にエラー | E-01 (L158-163) | ○ |
| C-012 | uv__tty_make_raw: rawモード変換 | E-01 (L244-279) | ○ |
| C-013 | uv_tty_set_mode: NORMAL→RAW成功 | E-01 (L281-342) | ○ |
| C-014 | uv_tty_set_mode: NORMAL→IO成功 | E-01 (L329-331) | ○ |
| C-015 | uv_tty_set_mode: 同一モード再設定で0 | E-01 (L292-293) | ○ |
| C-016 | uv_tty_set_mode: RAW→NORMAL復帰 | E-01 (L318-319) | ○ |
| C-017 | uv_tty_set_mode: tcgetattr失敗時エラー | E-01 (L297-302) | ○ |
| C-018 | uv_tty_set_mode: orig_termios_fdの初回保存 | E-01 (L309-312) | ○ |
| C-019 | uv__tty_close: 正常クローズ | E-01 (L345-373) | ○ |
| C-020 | uv__tty_close: orig_termios_fd一致時にtermios復元 | E-01 (L358-367) | ○ |
| C-021 | uv__tty_close: fd=-1時にストリームクローズのみ | E-01 (L350-351) | ○ |
| C-022 | uv_tty_get_winsize: ウィンドウサイズ取得成功 | E-01 (L376-391) | ○ |
| C-023 | uv_tty_get_winsize: ioctl失敗時エラー | E-01 (L384-385) | ○ |
| C-024 | uv_guess_handle: TTY fdでUV_TTY | E-01 (L403-404) | ○ |
| C-025 | uv_guess_handle: 通常ファイルでUV_FILE | E-01 (L425-426) | ○ |
| C-026 | uv_guess_handle: FIFOでUV_NAMED_PIPE | E-01 (L431-432) | ○ |
| C-027 | uv_guess_handle: TCPソケットでUV_TCP | E-01 (L472-473) | ○ |
| C-028 | uv_guess_handle: UDPソケットでUV_UDP | E-01 (L458-460) | ○ |
| C-029 | uv_guess_handle: UNIXソケットでUV_NAMED_PIPE | E-01 (L474-475) | ○ |
| C-030 | uv_guess_handle: 負のfdでUV_UNKNOWN_HANDLE | E-01 (L400-401) | ○ |
| C-031 | uv_guess_handle: fd=0でのタイプ判定 | E-01 (L394-479) | ○ |
| C-032 | uv_guess_handle: キャラクタデバイスでUV_FILE | E-01 (L428-429) | ○ |
| C-033 | uv_guess_handle: fstat失敗でUV_UNKNOWN_HANDLE | E-01 (L406-423) | ○ |
| C-034 | uv_tty_reset_mode: termios復元成功 | E-01 (L486-503) | ○ |
| C-035 | uv_tty_reset_mode: orig_termios_fd=-1で0 | E-01 (L496-497) | ○ |
| C-036 | uv_tty_reset_mode: spinlock失敗でUV_EBUSY | E-01 (L492-493) | ○ |
| C-037 | uv_tty_reset_mode: errno保存・復元 | E-01 (L490, L500) | △ |
| C-038 | uv_tty_set_vterm_state: no-op | E-01 (L505-506) | ○ |
| C-039 | uv_tty_get_vterm_state: UV_ENOTSUP | E-01 (L508-510) | ○ |

### posix-hrtime.c関連 (C-040 ~ C-043)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-040 | uv__hrtime: ナノ秒精度の時刻が返る | E-02 (L29-36), E-10 (L183-185) | ○ |
| C-041 | uv__hrtime: UV_CLOCK_FAST時も時刻が返る | E-02 (L29-36) | ○ |
| C-042 | uv__hrtime: 単調増加性 | E-02 (L32: CLOCK_MONOTONIC使用) | ○ |
| C-043 | uv__hrtime: 秒・ナノ秒変換の正確性 | E-02 (L35) | ○ |

### posix-poll.c関連 (C-044 ~ C-066)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-044 | uv__platform_loop_init: 初期化成功 | E-03 (L36-42) | ○ |
| C-045 | uv__platform_loop_delete: 解放成功 | E-03 (L44-47) | ○ |
| C-046 | uv__platform_loop_delete: NULL安全 | E-03 (L45: uv__freeはNULL安全) | ○ |
| C-047 | uv__io_fork: リセット成功 | E-03 (L49-52) | ○ |
| C-048 | uv__pollfds_maybe_resize: 初期64拡張 | E-03 (L63) | ○ |
| C-049 | uv__pollfds_maybe_resize: 2倍拡張 | E-03 (L63) | ○ |
| C-050 | uv__pollfds_maybe_resize: リサイズ不要時 | E-03 (L60-61) | ○ |
| C-051 | uv__pollfds_swap: 要素交換 | E-03 (L78-83) | ○ |
| C-052 | uv__pollfds_add: fd追加 | E-03 (L86-104) | ○ |
| C-053 | uv__pollfds_add: イベント更新 | E-03 (L92-96) | ○ |
| C-054 | uv__pollfds_del: fd削除 | E-03 (L107-131) | ○ |
| C-055 | uv__pollfds_del: fd=-1一括削除 | E-03 (L118-121) | ○ |
| C-056 | uv__pollfds_del: 存在しないfd削除 | E-03 (L107-131) | ○ |
| C-057 | uv__io_poll: nfds=0で早期リターン | E-03 (L151-153) | ○ |
| C-058 | uv__io_poll: timeout=0でノンブロッキング | E-03 (L197-213) | ○ |
| C-059 | uv__io_poll: イベント検出時にコールバック | E-03 (L274-276) | ○ |
| C-060 | uv__io_poll: EINTR時リトライ | E-03 (L216-233) | ○ |
| C-061 | uv__io_poll: シグナルウォッチャー最後 | E-03 (L271-272, L289-291) | ○ |
| C-062 | uv__platform_invalidate_fd: 反復中にfd=-1 | E-03 (L330-337) | ○ |
| C-063 | uv__platform_invalidate_fd: 非反復中にfd削除 | E-03 (L338-341) | ○ |
| C-064 | uv__io_check_fd: 有効fdで0 | E-03 (L345-363) | ○ |
| C-065 | uv__io_check_fd: 無効fdでUV_EINVAL | E-03 (L359-360) | ○ |
| C-066 | uv__io_check_fd: poll失敗時エラー | E-03 (L356-357) | ○ |

### random-devurandom.c関連 (C-067 ~ C-075)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-067 | uv__random_readpath: /dev/urandomから読み取り成功 | E-04 (L32-71) | ○ |
| C-068 | uv__random_readpath: 存在しないパスでエラー | E-04 (L40-41) | ○ |
| C-069 | uv__random_readpath: 非キャラクタデバイスでUV_EIO | E-04 (L48-51) | ○ |
| C-070 | uv__random_readpath: buflen=0で即座に0 | E-04 (L53: pos != buflenの条件) | ○ |
| C-071 | uv__random_readpath: buflen=1で1バイト読み取り | E-04 (L53-67) | ○ |
| C-072 | uv__random_readpath: EINTR時リトライ | E-04 (L54-56) | ○ |
| C-073 | uv__random_devurandom: 乱数取得成功 | E-04 (L86-93) | ○ |
| C-074 | uv__random_devurandom: 初期化失敗時エラー | E-04 (L89-90) | ○ |
| C-075 | uv__random_devurandom: once初期化保証 | E-04 (L87) | △ |

### random-getentropy.c関連 (C-076 ~ C-080)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-076 | uv__random_getentropy: 乱数取得成功 | E-05 (L39-57) | ○ |
| C-077 | uv__random_getentropy: 未対応時UV_ENOSYS | E-05 (L45-46) | ○ |
| C-078 | uv__random_getentropy: 256バイト境界 | E-05 (L49: stride=256) | ○ |
| C-079 | uv__random_getentropy: 257バイト超で分割 | E-05 (L49) | ○ |
| C-080 | uv__random_getentropy: 失敗時エラー | E-05 (L50-51) | ○ |

### random-getrandom.c関連 (C-081 ~ C-087)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-081 | uv__random_getrandom: 乱数取得成功 | E-06 (L54-86) | ○ |
| C-082 | uv__random_getrandom: 未対応時UV_ENOSYS | E-06 (L46-47) | ○ |
| C-083 | uv__random_getrandom: 256バイト分割 | E-06 (L72-73) | ○ |
| C-084 | uv__random_getrandom: EINTR時リトライ | E-06 (L76) | ○ |
| C-085 | uv__random_getrandom: 失敗時エラー | E-06 (L78-79) | ○ |
| C-086 | uv__random_getrandom: 0バイト返却でUV_EIO | E-06 (L81-82) | ○ |
| C-087 | uv__random_getrandom: buflen=0で即座に0 | E-06 (L63: pos != buflenの条件) | ○ |

### random-sysctl-linux.c関連 (C-088 ~ C-094)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-088 | uv__random_sysctl: 乱数取得成功 | E-07 (L43-99) | ○ |
| C-089 | uv__random_sysctl: syscall失敗時エラー | E-07 (L71-72) | ○ |
| C-090 | uv__random_sysctl: 不正UUIDサイズでUV_EIO | E-07 (L80-81) | ○ |
| C-091 | uv__random_sysctl: 14バイト単位の複数ラウンド | E-07 (L91-94) | ○ |
| C-092 | uv__random_sysctl: buflen=1境界値 | E-07 (L54-96) | ○ |
| C-093 | uv__random_sysctl: UUIDバイト6/8スキップ | E-07 (L87-88) | △ |
| C-094 | uv__random_sysctl: SYS__sysctl未定義でUV_ENOSYS | E-07 (L73-78) | ○ |

### sysinfo-loadavg.c関連 (C-095 ~ C-098)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-095 | uv_loadavg: ロードアベレージ取得成功 | E-08 (L28-36) | ○ |
| C-096 | uv_loadavg: 65536除算で正規化 | E-08 (L33-35) | ○ |
| C-097 | uv_loadavg: sysinfo失敗時avgが未変更 | E-08 (L31) | ○ |
| C-098 | uv_loadavg: loads=0でavg=0.0 | E-08 (L33-35) | ○ |

### sysinfo-memory.c関連 (C-099 ~ C-106)

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-099 | uv_get_free_memory: 空きメモリ取得成功 | E-09 (L28-34) | ○ |
| C-100 | uv_get_free_memory: freeram*mem_unit計算 | E-09 (L32) | ○ |
| C-101 | uv_get_free_memory: sysinfo失敗時0 | E-09 (L33) | ○ |
| C-102 | uv_get_total_memory: 総メモリ取得成功 | E-09 (L36-42) | ○ |
| C-103 | uv_get_total_memory: totalram*mem_unit計算 | E-09 (L40) | ○ |
| C-104 | uv_get_total_memory: sysinfo失敗時0 | E-09 (L41) | ○ |
| C-105 | uv_get_free_memory: freeram=0で0 | E-09 (L32) | ○ |
| C-106 | uv_get_total_memory: 大容量メモリオーバーフロー | E-09 (L40: uint64_tキャスト) | △ |

## 4) 不足情報（Unknown / Missing）

- **C-037（errno保存・復元のasync signal-safe保証）**: コード上はsaved_errno変数で保存・復元を行っているが、関数内で呼ばれるuv__tcsetattrがasync signal-safeであることの厳密な検証にはPOSIX仕様書の参照が必要
  - 候補：POSIX signal-safe関数一覧 / tcsetattr(3)のシグナル安全性ドキュメント
- **C-075（uv_once初期化一度限り保証）**: uv_onceの内部実装（pthread_once等）に依存するため、libuv内部のonce実装を参照する必要がある
  - 候補：src/unix/thread.c内のuv_once実装 / pthread_once(3)仕様
- **C-093（UUIDバイト6/8のスキップ）**: RFC 4122のUUID v4フォーマット仕様への参照が必要。コード内コメントで「4 and 5 bits of entropy」と説明されているが、仕様書との照合が望ましい
  - 候補：RFC 4122 / Linux random(4)マニュアル
- **C-106（大容量メモリオーバーフロー検証）**: uint64_tのキャストにより理論的にはオーバーフローしないが、sysinfo構造体のフィールド型（unsigned long）との乗算でのオーバーフロー可能性はプラットフォーム依存
  - 候補：sys/sysinfo.h構造体定義 / プラットフォーム固有のunsigned longサイズ

## 5) リスクフラグ（レビュー観点）

- **0（低リスク）**: C-038, C-039, C-051, C-093, C-098, C-105 - 単純な実装で根拠が明確
- **1（中リスク）**: C-037, C-075, C-106 - コード根拠はあるが、外部仕様・プラットフォーム依存の検証が必要
- **2（高リスク）**: なし - 全てのテストケースにソースコード根拠が存在し、重大な矛盾は検出されなかった

## 6) レビュアーチェックリスト（最小）

- [ ] tty.c関連テストケース（C-001〜C-039）が、uv_tty_init/uv_tty_set_mode/uv_guess_handleの全分岐を網羅しているか確認
- [ ] uv_guess_handleの全ハンドルタイプ（UV_TTY, UV_FILE, UV_NAMED_PIPE, UV_TCP, UV_UDP, UV_UNKNOWN_HANDLE）に対するテストケースが存在するか確認
- [ ] 乱数生成関連（C-067〜C-094）の4つの実装（devurandom, getentropy, getrandom, sysctl）それぞれに正常系・異常系・境界値テストが存在するか確認
- [ ] posix-poll.cの静的関数（uv__pollfds_maybe_resize, uv__pollfds_add, uv__pollfds_del）に対するテストが、モック/スタブを前提としているか確認
- [ ] sysinfo関連テスト（C-095〜C-106）のsysinfo()モック前提条件が妥当か確認
- [ ] プラットフォーム固有のコンパイル条件（#ifdef __linux__, #ifdef SYS__sysctl等）がテストケースで考慮されているか確認
- [ ] C-037のasync signal-safe保証について、POSIX仕様との照合を実施
- [ ] C-106の大容量メモリオーバーフロー検証について、ターゲットプラットフォームのunsigned longサイズを確認
