---
generated_at: 2026-02-22 12:00:00
metrics:
  claims_total: 183
  claims_with_evidence: 179
  claims_without_evidence: 4
confidence_derived: 0.98
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.98**
  - 根拠あり：179 / 183、根拠なし：4
- 優先レビュー（高）
  1. **C-053（mrb_hal_io_flock EINTRリトライ）**：EINTR発生をテストで再現する具体的方法がソースコードからは特定困難
  2. **C-162（sigalrm_handler）**：staticシグナルハンドラの直接テスト方法がソースコードからは不明
  3. **C-169（clock_gettime失敗フォールバック）**：clock_gettime失敗をテストで再現する具体的方法がソースからは不明
  4. **C-176（timer_callback CRITICAL_SECTION）**：staticコールバック関数の直接テスト方法がソースからは不明

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

- E-01: `mrbgems/hal-posix-dir/src/dir_hal.c` - POSIX ディレクトリHAL実装（194行）
- E-02: `mrbgems/hal-win-dir/src/dir_hal.c` - Windows ディレクトリHAL実装（250行）
- E-03: `mrbgems/hal-posix-io/src/io_hal.c` - POSIX I/O HAL実装（603行）
- E-04: `mrbgems/hal-win-io/src/io_hal.c` - Windows I/O HAL実装（647行）
- E-05: `mrbgems/hal-posix-socket/src/socket_hal.c` - POSIX ソケットHAL実装（159行）
- E-06: `mrbgems/hal-win-socket/src/socket_hal.c` - Windows ソケットHAL実装（178行）
- E-07: `mrbgems/hal-posix-task/src/task_hal.c` - POSIX タスクHAL実装（253行）
- E-08: `mrbgems/hal-win-task/src/task_hal.c` - Windows タスクHAL実装（188行）
- E-09: `docs/code-to-docs/単体テストケース一覧/plan.md` - テスト計画（HALモジュール定義）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | mrb_hal_dir_open: 存在するディレクトリを開ける | E-01 L32-43 opendir()呼び出し | ○ |
| C-002 | mrb_hal_dir_open: 存在しないディレクトリでNULL | E-01 L36-38 NULL返却 | ○ |
| C-003 | mrb_hal_dir_close: 正常クローズ | E-01 L45-51 closedir()+mrb_free() | ○ |
| C-004 | mrb_hal_dir_read: エントリ読み取り | E-01 L53-59 readdir() | ○ |
| C-005 | mrb_hal_dir_read: 末尾でNULL | E-01 L58 dp==NULLチェック | ○ |
| C-006 | mrb_hal_dir_rewind: 先頭に戻る | E-01 L61-66 rewinddir() | ○ |
| C-007 | mrb_hal_dir_seek: 正常シーク（非Android） | E-01 L80-84 seekdir() | ○ |
| C-008 | mrb_hal_dir_seek: Android環境でENOSYS | E-01 L75-79 #if defined(__ANDROID__) | ○ |
| C-009 | mrb_hal_dir_tell: 位置取得（非Android） | E-01 L95-98 telldir() | ○ |
| C-010 | mrb_hal_dir_tell: Android環境でENOSYS | E-01 L90-94 #if defined(__ANDROID__) | ○ |
| C-011 | mrb_hal_dir_mkdir: ディレクトリ作成 | E-01 L105-110 mkdir() | ○ |
| C-012 | mrb_hal_dir_mkdir: 既存ディレクトリで失敗 | E-01 L109 mkdir()のエラー | ○ |
| C-013 | mrb_hal_dir_rmdir: 空ディレクトリ削除 | E-01 L112-117 rmdir() | ○ |
| C-014 | mrb_hal_dir_rmdir: 空でないディレクトリで失敗 | E-01 L116 rmdir()のエラー | ○ |
| C-015 | mrb_hal_dir_chdir: ディレクトリ変更 | E-01 L119-124 chdir() | ○ |
| C-016 | mrb_hal_dir_chdir: 存在しないパスで失敗 | E-01 L123 chdir()のエラー | ○ |
| C-017 | mrb_hal_dir_getcwd: パス取得 | E-01 L127-131 getcwd() | ○ |
| C-018 | mrb_hal_dir_getcwd: バッファ不足で失敗 | E-01 L130 getcwd()のNULL返却 | ○ |
| C-019 | mrb_hal_dir_chroot: 正常chroot | E-01 L141-144 chroot() | ○ |
| C-020 | mrb_hal_dir_chroot: Android/MSDOSでENOSYS | E-01 L136-140 #if defined条件分岐 | ○ |
| C-021 | mrb_hal_dir_is_directory: ディレクトリで1 | E-01 L148-157 stat()+S_ISDIR | ○ |
| C-022 | mrb_hal_dir_is_directory: ファイルで0 | E-01 L153 S_ISDIR判定 | ○ |
| C-023 | mrb_hal_dir_is_directory: 不在パスで0 | E-01 L153 stat失敗時 | ○ |
| C-024 | mrb_hal_dir_init: 初期化完了 | E-01 L163-168 空実装 | ○ |
| C-025 | mrb_hal_dir_final: 終了処理完了 | E-01 L170-175 空実装 | ○ |
| C-026 | Win dir_open: 存在するディレクトリ | E-02 L38-62 _findfirst API | ○ |
| C-027 | Win dir_open: スラッシュ末尾のsuffix | E-02 L46 suffix条件分岐 | ○ |
| C-028 | Win dir_open: バックスラッシュ末尾のsuffix | E-02 L46 suffix条件分岐 | ○ |
| C-029 | Win dir_open: 存在しないディレクトリ | E-02 L53-58 _findfirst失敗+メモリ解放 | ○ |
| C-030 | Win dir_close: 正常クローズ | E-02 L64-82 _findclose+mrb_free | ○ |
| C-031 | Win dir_close: 無効ハンドルでEBADF | E-02 L76-79 errno=EBADF設定 | ○ |
| C-032 | Win dir_read: 初回でfirst==1 | E-02 L94-98 firstフラグ | ○ |
| C-033 | Win dir_read: 2回目以降で_findnext | E-02 L100-106 _findnext | ○ |
| C-034 | Win dir_read: 無効ハンドルでNULL+EBADF | E-02 L89-92 handle==-1チェック | ○ |
| C-035 | Win dir_rewind: close+reopen | E-02 L109-122 _findclose+_findfirst | ○ |
| C-036 | Win dir_rewind: 無効ハンドルでEBADF | E-02 L113-116 handle==-1チェック | ○ |
| C-037 | Win dir_seek: 常に-1+ENOSYS | E-02 L128-135 未サポート | ○ |
| C-038 | Win dir_tell: 常に-1+ENOSYS | E-02 L137-144 未サポート | ○ |
| C-039 | Win dir_mkdir: _mkdir使用 | E-02 L150-156 _mkdir | ○ |
| C-040 | Win dir_chroot: 常に-1+ENOSYS | E-02 L179-186 未サポート | ○ |
| C-041 | Win dir_is_directory: _stat判定 | E-02 L188-198 _stat+_S_IFDIR | ○ |
| C-042 | convert_stat: POSIX stat変換 | E-03 L41-92 全フィールド変換 | ○ |
| C-043 | mrb_hal_io_stat: ファイルstat取得 | E-03 L98-109 stat() | ○ |
| C-044 | mrb_hal_io_stat: 不在ファイルで-1 | E-03 L104 stat失敗 | ○ |
| C-045 | mrb_hal_io_fstat: fd stat取得 | E-03 L111-122 fstat() | ○ |
| C-046 | mrb_hal_io_fstat: 無効fdで-1 | E-03 L117 fstat失敗 | ○ |
| C-047 | mrb_hal_io_lstat: シンボリックリンクstat | E-03 L124-135 lstat() | ○ |
| C-048 | mrb_hal_io_chmod: パーミッション変更 | E-03 L137-142 chmod() | ○ |
| C-049 | mrb_hal_io_umask: umask設定 | E-03 L144-159 umask() | ○ |
| C-050 | mrb_hal_io_umask: mask<0で照会のみ | E-03 L150-154 if(mask<0)分岐 | ○ |
| C-051 | mrb_hal_io_ftruncate: ファイル切り詰め | E-03 L161-166 ftruncate() | ○ |
| C-052 | mrb_hal_io_flock: ロック取得 | E-03 L168-180 flock()+EINTRリトライ | ○ |
| C-053 | mrb_hal_io_flock: EINTRリトライ | E-03 L173-176 while+EINTR | △ |
| C-054 | mrb_hal_io_unlink: ファイル削除 | E-03 L182-187 unlink() | ○ |
| C-055 | mrb_hal_io_rename: ファイルリネーム | E-03 L189-194 rename() | ○ |
| C-056 | mrb_hal_io_symlink: シンボリックリンク作成 | E-03 L196-201 symlink() | ○ |
| C-057 | mrb_hal_io_readlink: リンク先読み取り | E-03 L203-211 readlink() | ○ |
| C-058 | mrb_hal_io_realpath: パス解決 | E-03 L213-218 realpath() | ○ |
| C-059 | mrb_hal_io_realpath: 不在パスでNULL | E-03 L217 realpath失敗 | ○ |
| C-060 | mrb_hal_io_getcwd: パス取得 | E-03 L220-225 getcwd() | ○ |
| C-061 | mrb_hal_io_getenv: 環境変数取得 | E-03 L227-232 getenv() | ○ |
| C-062 | mrb_hal_io_getenv: 不在変数でNULL | E-03 L231 getenv()のNULL | ○ |
| C-063 | mrb_hal_io_gethome: NULL usernameでHOME取得 | E-03 L239-246 getenv("HOME") | ○ |
| C-064 | mrb_hal_io_gethome: 空文字列でHOME取得 | E-03 L239 条件分岐 | ○ |
| C-065 | mrb_hal_io_gethome: 指定ユーザーのHOME | E-03 L248-254 getpwnam() | ○ |
| C-066 | mrb_hal_io_gethome: 不在ユーザーでNULL | E-03 L250-253 getpwnam失敗 | ○ |
| C-067 | mrb_hal_io_gethome: HOME未設定でNULL | E-03 L242-245 getenv失敗 | ○ |
| C-068 | mrb_hal_io_open: ファイルオープン | E-03 L264-286 open()+FD_CLOEXEC | ○ |
| C-069 | mrb_hal_io_open: fd>2でFD_CLOEXEC設定 | E-03 L276-283 fcntl(FD_CLOEXEC) | ○ |
| C-070 | mrb_hal_io_open: 不在ファイルで-1 | E-03 L271-273 open失敗 | ○ |
| C-071 | mrb_hal_io_close: fdクローズ | E-03 L288-293 close() | ○ |
| C-072 | mrb_hal_io_read: データ読み取り | E-03 L295-303 read() | ○ |
| C-073 | mrb_hal_io_read: count=0で0返却 | E-03 L301 read動作仕様 | ○ |
| C-074 | mrb_hal_io_write: データ書き込み | E-03 L305-313 write() | ○ |
| C-075 | mrb_hal_io_lseek: SEEK_SET | E-03 L315-334 switch MRB_IO_SEEK_SET | ○ |
| C-076 | mrb_hal_io_lseek: SEEK_CUR | E-03 L325 MRB_IO_SEEK_CUR | ○ |
| C-077 | mrb_hal_io_lseek: SEEK_END | E-03 L326 MRB_IO_SEEK_END | ○ |
| C-078 | mrb_hal_io_lseek: 無効whenceでEINVAL | E-03 L327-330 default分岐 | ○ |
| C-079 | mrb_hal_io_dup: fd複製 | E-03 L336-358 dup()+FD_CLOEXEC | ○ |
| C-080 | mrb_hal_io_dup: 無効fdで-1 | E-03 L343-345 dup失敗 | ○ |
| C-081 | mrb_hal_io_fcntl: fcntl実行 | E-03 L360-365 fcntl() | ○ |
| C-082 | mrb_hal_io_isatty: 端末で1 | E-03 L367-372 isatty() | ○ |
| C-083 | mrb_hal_io_isatty: 通常ファイルで0 | E-03 L371 isatty()=0 | ○ |
| C-084 | mrb_hal_io_pipe: パイプ作成 | E-03 L374-396 pipe()+FD_CLOEXEC | ○ |
| C-085 | mrb_hal_io_spawn_process: プロセス生成 | E-03 L402-464 fork()+execl() | ○ |
| C-086 | mrb_hal_io_spawn_process: I/Oリダイレクト | E-03 L429-445 dup2() | ○ |
| C-087 | mrb_hal_io_spawn_process: 空コマンドでENOENT | E-03 L415-418 空文字チェック | ○ |
| C-088 | mrb_hal_io_spawn_process: 空白のみコマンド | E-03 L411-413 空白スキップ | ○ |
| C-089 | mrb_hal_io_waitpid: 子プロセス待機 | E-03 L466-483 waitpid() | ○ |
| C-090 | mrb_hal_io_waitpid: status==NULL | E-03 L478-480 NULLチェック | ○ |
| C-091 | mrb_hal_io_fdset_alloc: 割り当て | E-03 L493-499 mrb_malloc+FD_ZERO | ○ |
| C-092 | mrb_hal_io_fdset_free: 解放 | E-03 L501-507 mrb_free | ○ |
| C-093 | mrb_hal_io_fdset_free: NULLガード | E-03 L504 if(fdset) | ○ |
| C-094 | mrb_hal_io_fdset_set: fd追加 | E-03 L519-529 FD_SET | ○ |
| C-095 | mrb_hal_io_fdset_set: 負のfdで例外 | E-03 L522-524 fd<0チェック | ○ |
| C-096 | mrb_hal_io_fdset_set: FD_SETSIZE以上で例外 | E-03 L522 fd>=FD_SETSIZEチェック | ○ |
| C-097 | mrb_hal_io_fdset_isset: 設定済みfd検出 | E-03 L531-543 FD_ISSET | ○ |
| C-098 | mrb_hal_io_fdset_isset: 未設定fdで0 | E-03 L540 FD_ISSET=0 | ○ |
| C-099 | mrb_hal_io_fdset_isset: NULLで0 | E-03 L541-542 NULLチェック | ○ |
| C-100 | mrb_hal_io_select: I/O多重化 | E-03 L545-566 select() | ○ |
| C-101 | mrb_hal_io_select: タイムアウト | E-03 L559-563 timeval変換 | ○ |
| C-102 | mrb_hal_io_select: NULLタイムアウト | E-03 L555-563 tv=NULL分岐 | ○ |
| C-103 | Win convert_stat: _stat64変換 | E-04 L34-50 全フィールド変換 | ○ |
| C-104 | set_errno_from_win_error: FILE_NOT_FOUND | E-04 L57-59 switchケース | ○ |
| C-105 | set_errno_from_win_error: ACCESS_DENIED | E-04 L60-62 switchケース | ○ |
| C-106 | set_errno_from_win_error: 未知エラー | E-04 L73-75 defaultケース | ○ |
| C-107 | Win lstat==stat | E-04 L109-114 mrb_hal_io_stat呼び出し | ○ |
| C-108 | Win flock: 排他ロック | E-04 L148-184 LockFileEx | ○ |
| C-109 | Win flock: ロック解除 | E-04 L163-168 UnlockFileEx | ○ |
| C-110 | Win flock: 無効ハンドル | E-04 L155-159 INVALID_HANDLE_VALUE | ○ |
| C-111 | Win symlink: E_NOTIMP_ERROR | E-04 L200-208 mrb_raise | ○ |
| C-112 | Win readlink: E_NOTIMP_ERROR | E-04 L210-219 mrb_raise | ○ |
| C-113 | Win realpath: GetFullPathName | E-04 L221-233 GetFullPathName | ○ |
| C-114 | Win realpath: 失敗時NULL | E-04 L228-231 ret==0チェック | ○ |
| C-115 | Win fcntl: 常に-1+ENOSYS | E-04 L369-379 未サポート | ○ |
| C-116 | Win open: _O_BINARYフラグ | E-04 L282-300 _open+_O_BINARY | ○ |
| C-117 | Win pipe: _pipe使用 | E-04 L388-404 _pipe(4096, _O_BINARY) | ○ |
| C-118 | Win spawn_process: CreateProcess | E-04 L410-486 CreateProcess | ○ |
| C-119 | Win spawn_process: 空コマンド | E-04 L425-432 空白チェック | ○ |
| C-120 | Win waitpid: WaitForSingleObject | E-04 L488-526 WaitForSingleObject | ○ |
| C-121 | Win waitpid: ノンブロッキング | E-04 L502-503 WAIT_TIMEOUT | ○ |
| C-122 | Win gethome: USERPROFILE | E-04 L261-262 getenv("USERPROFILE") | ○ |
| C-123 | Win gethome: HOMEDRIVE+HOMEPATH | E-04 L263-269 フォールバック | ○ |
| C-124 | Win gethome: 他ユーザーでENOSYS | E-04 L255-259 未サポート | ○ |
| C-125 | Win gethome: 全未設定でENOENT | E-04 L270-272 errno=ENOENT | ○ |
| C-126 | Win fdset_set: fd_countチェック | E-04 L565-567 FD_SETSIZEチェック | ○ |
| C-127 | Win select: nfds不使用 | E-04 L598+606 select(0, ...) | ○ |
| C-128 | Win io_init: WSAStartup | E-04 L613-620 WSAStartup | ○ |
| C-129 | Win io_final: WSACleanup | E-04 L622-628 WSACleanup | ○ |
| C-130 | POSIX socket_init: 空実装 | E-05 L31-36 void実装 | ○ |
| C-131 | POSIX socket_set_nonblock: ノンブロッキング設定 | E-05 L49-71 fcntl+O_NONBLOCK | ○ |
| C-132 | POSIX socket_set_nonblock: 解除 | E-05 L63 flags &= ~O_NONBLOCK | ○ |
| C-133 | POSIX socket_set_nonblock: 無効fdで-1 | E-05 L55-57 fcntl失敗 | ○ |
| C-134 | POSIX inet_ntop: IPv4変換 | E-05 L77-81 inet_ntop() | ○ |
| C-135 | POSIX inet_ntop: IPv6変換 | E-05 L80 inet_ntop(AF_INET6) | ○ |
| C-136 | POSIX inet_pton: IPv4変換 | E-05 L83-87 inet_pton() | ○ |
| C-137 | POSIX inet_pton: 不正アドレス | E-05 L86 inet_pton戻り値 | ○ |
| C-138 | POSIX sockaddr_un: 構築 | E-05 L93-117 sockaddr_un構築 | ○ |
| C-139 | POSIX sockaddr_un: パス長超過 | E-05 L98-102 mrb_raisef | ○ |
| C-140 | POSIX socketpair: ペア作成 | E-05 L119-124 socketpair() | ○ |
| C-141 | POSIX unix_path: パス抽出 | E-05 L126-140 sun_path抽出 | ○ |
| C-142 | POSIX unix_path: 非AF_UNIXで例外 | E-05 L131-133 sa_familyチェック | ○ |
| C-143 | POSIX unix_path: 短socklenで空文字列 | E-05 L135-137 socklenチェック | ○ |
| C-144 | Win socket_init: WSAStartup | E-06 L31-38 WSAStartup | ○ |
| C-145 | Win socket_init: WSAStartup失敗 | E-06 L35-37 mrb_raise | ○ |
| C-146 | Win socket_final: WSACleanup | E-06 L40-45 WSACleanup | ○ |
| C-147 | Win socket_set_nonblock: ioctlsocket | E-06 L51-61 ioctlsocket(FIONBIO) | ○ |
| C-148 | Win socket_set_nonblock: 失敗時-1 | E-06 L57-59 NO_ERRORチェック | ○ |
| C-149 | Win inet_ntop: IPv4 getnameinfo | E-06 L68-78 getnameinfo | ○ |
| C-150 | Win inet_ntop: IPv6 getnameinfo | E-06 L80-90 getnameinfo(AF_INET6) | ○ |
| C-151 | Win inet_ntop: 未知AFでNULL | E-06 L91 return NULL | ○ |
| C-152 | Win inet_pton: getaddrinfo | E-06 L94-122 getaddrinfo | ○ |
| C-153 | Win inet_pton: 不正アドレスで0 | E-06 L101-102 getaddrinfo失敗 | ○ |
| C-154 | Win sockaddr_un: NotImplementedError | E-06 L128-136 mrb_raise | ○ |
| C-155 | Win socketpair: -1+ENOSYS | E-06 L138-149 未サポート | ○ |
| C-156 | Win unix_path: NotImplementedError | E-06 L151-159 mrb_raise | ○ |
| C-157 | POSIX task_init: スケジューラ初期化 | E-07 L56-119 タスクキュー初期化+タイマー | ○ |
| C-158 | POSIX task_init: 初回VMでタイマー開始 | E-07 L101-113 sigaction+setitimer | ○ |
| C-159 | POSIX task_init: 2つ目のVMでタイマー非再設定 | E-07 L101 vm_count==1条件 | ○ |
| C-160 | POSIX task_init: 重複登録防止 | E-07 L81-86 既存VMチェック | ○ |
| C-161 | POSIX task_init: VM上限超過 | E-07 L90-95 MRB_TASK_MAX_VMS | ○ |
| C-162 | sigalrm_handler: 全VM tick | E-07 L38-49 mrb_tick呼び出し | △ |
| C-163 | mrb_task_enable_irq: SIG_UNBLOCK | E-07 L122-127 sigprocmask | ○ |
| C-164 | mrb_task_disable_irq: SIG_BLOCK | E-07 L129-135 sigprocmask | ○ |
| C-165 | mrb_hal_task_idle_cpu: usleep | E-07 L137-143 usleep() | ○ |
| C-166 | mrb_hal_task_sleep_us: 高精度スリープ | E-07 L145-194 clock_gettime+nanosleep | ○ |
| C-167 | mrb_hal_task_sleep_us: usec=0で即時 | E-07 L177 elapsed>=target | ○ |
| C-168 | mrb_hal_task_sleep_us: usec<0で即時 | E-07 L154-156 if(usec<0)return | ○ |
| C-169 | mrb_hal_task_sleep_us: clock_gettime失敗フォールバック | E-07 L159-163 usleepフォールバック | △ |
| C-170 | mrb_hal_task_final: VM削除 | E-07 L196-234 vm_list操作 | ○ |
| C-171 | mrb_hal_task_final: 最後のVMでタイマー停止 | E-07 L220-226 setitimerリセット | ○ |
| C-172 | mrb_hal_task_final: 複数VM時の部分削除 | E-07 L207-217 vm_list shift | ○ |
| C-173 | Win task_init: MMタイマー初期化 | E-08 L45-103 timeSetEvent | ○ |
| C-174 | Win task_init: InterlockedIncrement | E-08 L84 アトミック操作 | ○ |
| C-175 | Win task_init: VM上限超過 | E-08 L77-82 MRB_TASK_MAX_VMS | ○ |
| C-176 | timer_callback: CRITICAL_SECTION使用 | E-08 L25-39 EnterCriticalSection | △ |
| C-177 | Win enable_irq: LeaveCriticalSection | E-08 L105-109 LeaveCriticalSection | ○ |
| C-178 | Win disable_irq: EnterCriticalSection | E-08 L111-115 EnterCriticalSection | ○ |
| C-179 | Win task_idle_cpu: Sleep | E-08 L117-123 Sleep() | ○ |
| C-180 | Win task_sleep_us: ms変換Sleep | E-08 L125-134 Sleep(usec/1000) | ○ |
| C-181 | Win task_sleep_us: usec<0チェック | E-08 L131 if(usec>=0)条件 | ○ |
| C-182 | Win task_final: VM削除 | E-08 L137-169 InterlockedDecrement | ○ |
| C-183 | Win task_final: 最終VMクリーンアップ | E-08 L157-165 timeKillEvent+DeleteCS | △ |

## 4) 不足情報（Unknown / Missing）
- **C-053**: EINTRリトライの直接テストには、flock()呼び出し中にシグナルを発生させる仕組みが必要。ソースコードからはEINTRチェックのロジックは確認できるが、テスト実行環境で再現する方法は推測に基づく
  - 候補：シグナル送信タイミング制御 / flock()のモック / alarm()による割り込み生成
- **C-162**: sigalrm_handlerはstatic関数であり、直接テストするにはSIGALRMを送信してmrb_tickの呼び出しを間接的に検証する必要がある
  - 候補：kill(getpid(), SIGALRM) / setitimer経由の間接テスト / 関数ポインタの公開
- **C-169**: clock_gettime失敗を再現するにはシステムコールのモックまたはLD_PRELOADなどの手法が必要
  - 候補：LD_PRELOADによるclock_gettimeフック / テスト用ラッパー / 条件コンパイルによる切り替え
- **C-176/C-183**: timer_callbackはstatic関数であり、Windows MM Timerから呼ばれるコールバック。直接テストにはタイマーを動作させてmrb_tickの呼び出しを間接的に検証する必要がある。また、最終VMクリーンアップのDeleteCriticalSection呼び出し後の状態検証は困難
  - 候補：タイマー動作を介した間接テスト / コールバック関数ポインタの公開 / CRITICAL_SECTIONのステート検証

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**: ディレクトリ操作HAL（POSIX/Windows）- 標準API呼び出しのラッパーであり、テストケースとソースコードの対応関係が明確
- **0（低リスク）**: ファイルI/O操作HAL - 基本的なPOSIX/Win32 API呼び出しのラッパー
- **0（低リスク）**: ソケットHAL - inet_ntop/inet_ptonなどの標準的なネットワークAPI
- **1（中リスク）**: プロセス生成（spawn_process/waitpid）- fork/execl/CreateProcessの複雑なリダイレクト処理があり、テスト実行環境に依存する部分がある
- **1（中リスク）**: タスクスケジューラHAL - シグナルハンドラ/マルチメディアタイマーのコールバック、マルチVM管理など、テストで再現が困難な非同期処理を含む
- **0（低リスク）**: Windows未サポート機能（symlink/readlink/sockaddr_un等）- 常にエラーを返す実装であり、テストケースの正確性が高い

## 6) レビュアーチェックリスト（最小）
- [ ] POSIX版とWindows版で同一HALインターフェースの関数が全て網羅されているか確認
- [ ] プラットフォーム固有の条件分岐（#if defined(__ANDROID__)、#ifndef __EMSCRIPTEN__等）のテストケースが存在するか確認
- [ ] Windows未サポート機能（symlink/readlink/sockaddr_un/socketpair/chroot等）のエラー系テストケースが存在するか確認
- [ ] static関数（convert_stat/set_errno_from_win_error/sigalrm_handler/timer_callback）のテスト戦略が適切か確認
- [ ] I/O多重化（select/fdset）のテストケースが両プラットフォームでカバーされているか確認
- [ ] タスクスケジューラの複数VM管理（登録/解除/上限）のテストケースが十分か確認
- [ ] mrb_hal_io_spawn_processのI/Oリダイレクトとプロセス管理のテストケースが両プラットフォームでカバーされているか確認
