---
generated_at: 2026-02-22 12:00:00
metrics:
  claims_total: 207
  claims_with_evidence: 199
  claims_without_evidence: 8
confidence_derived: 0.96
---

# 根拠レポート：mruby-bin-debugger 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：199 / 207、根拠なし：8
- 優先レビュー（高）
  1. **UT-DBG-077〜080（mrb_debug_eval）**：式評価の具体的な期待結果はランタイム依存であり、正確な戻り値の形式はソースコードからの推測に基づく
  2. **UT-DBG-189〜197（mrb_code_fetch_hook）**：内部フック関数であり、テスト条件の構築が複雑。irep/pc/regs等の前提条件の詳細がソースコードの静的解析のみでは不十分
  3. **UT-DBG-198〜201（check_method_breakpoint）**：OP_SEND/OP_SUPER命令のデコード結果に依存し、具体的な入力値の記述がVM内部状態に依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h` - デバッガのヘッダファイル（構造体定義、列挙型、関数プロトタイプ）
- E-02: `mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c` - デバッガ本体（main, コマンドパーサ, フック関数）
- E-03: `mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h` - ブレークポイントAPI宣言
- E-04: `mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c` - ブレークポイントAPI実装
- E-05: `mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h` - リスト表示API宣言
- E-06: `mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c` - リスト表示API実装
- E-07: `mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h` - 式評価API宣言
- E-08: `mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c` - 式評価API実装
- E-09: `mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h` - 文字列ユーティリティAPI宣言
- E-10: `mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c` - 文字列ユーティリティAPI実装
- E-11: `mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c` - 実行コマンド（run/continue/step/next）
- E-12: `mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c` - ブレークポイントコマンド（break/info/delete/enable/disable）
- E-13: `mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c` - 出力コマンド（print/eval/info locals）
- E-14: `mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c` - その他コマンド（list/help/quit）
- E-15: `mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h` - エラーコード定義
- E-16: `mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h` - 設定定数（MAX_COMMAND_LINE, MAX_BREAKPOINT）

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

### apistring.c（UT-DBG-001〜008）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | mrdb_strndupが指定サイズで文字列を複製する | E-09, E-10 (mrdb_strndup実装: l=mrb_debug_strnlen(s,size), memcpy(d,s,l)) | ○ |
| C-02 | sizeが文字列長より大きい場合にNULL終端まで複製される | E-10 (mrb_debug_strnlen: p=memchr(s,'\0',maxlen), strlen(s)が小さい場合はstrlenの値を返す) | ○ |
| C-03 | size=0で空文字列が返却される | E-10 (l=mrb_debug_strnlen(s,0)=0, d[0]='\0') | ○ |
| C-04 | size=1で1文字のみ複製される | E-10 (l=mrb_debug_strnlen(s,1)=1, memcpy(d,s,1), d[1]='\0') | ○ |
| C-05 | mrdb_strdupが文字列を正しく複製する | E-09, E-10 (z=strlen(s)+1, memcpy(d,s,z)) | ○ |
| C-06 | 空文字列の複製が正しく行われる | E-10 (z=strlen("")+1=1, memcpy) | ○ |
| C-07 | mrb_debug_strnlenが文字列長を正しく計算する | E-10 (memchr(s,'\0',maxlen)) | ○ |
| C-08 | maxlen < strlen(s)でmaxlenが返却される | E-10 (p=NULL時にmaxlenを返す) | ○ |

### apibreak.c（UT-DBG-009〜061）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | mrb_debug_set_break_lineで有効なブレークポイントが設定される | E-03, E-04 (check_file_lineno成功時にbp配列に追加) | ○ |
| C-10 | mrb=NULL時にMRB_DEBUG_INVALID_ARGUMENTが返却される | E-04 (if ((mrb==NULL)\|\|(dbg==NULL)\|\|(file==NULL)) return MRB_DEBUG_INVALID_ARGUMENT) | ○ |
| C-11 | dbg=NULL時にMRB_DEBUG_INVALID_ARGUMENTが返却される | E-04 (同上) | ○ |
| C-12 | file=NULL時にMRB_DEBUG_INVALID_ARGUMENTが返却される | E-04 (同上) | ○ |
| C-13 | bpnum>=MAX_BREAKPOINT時にMRB_DEBUG_BREAK_NUM_OVERが返却される | E-04 (if (dbg->bpnum >= MAX_BREAKPOINT) return MRB_DEBUG_BREAK_NUM_OVER) | ○ |
| C-14 | next_bpno>MAX_BREAKPOINTNO時にMRB_DEBUG_BREAK_NO_OVERが返却される | E-04 (if (dbg->next_bpno > MAX_BREAKPOINTNO) return MRB_DEBUG_BREAK_NO_OVER) | ○ |
| C-15 | 存在しないファイルでMRB_DEBUG_BREAK_INVALID_FILEが返却される | E-04 (check_file_lineno result==0時) | ○ |
| C-16 | 無効な行番号でMRB_DEBUG_BREAK_INVALID_LINENOが返却される | E-04 (result==MRB_DEBUG_BP_FILE_OK時) | ○ |
| C-17 | mrb_debug_set_break_methodでメソッドブレークポイントが設定される | E-04 (class_name=NULL, method_name設定, BPTYPE_METHOD) | ○ |
| C-18 | クラス名付きメソッドブレークポイントが設定される | E-04 (set_class=mrdb_strdup, set_method=mrdb_strdup) | ○ |
| C-19〜C-21 | set_break_methodのNULL/上限チェック | E-04 (引数チェック・上限チェックロジック) | ○ |
| C-22 | mrb_debug_get_breaknumがbpnumを返却する | E-04 (return dbg->bpnum) | ○ |
| C-23 | bpnum=0で0が返却される | E-04 (同上) | ○ |
| C-24 | get_breaknumのNULLチェック | E-04 | ○ |
| C-25〜C-27 | mrb_debug_get_break_allの正常系・境界値・異常系 | E-04 (memcpy, size vs bpnum比較) | ○ |
| C-28〜C-30 | mrb_debug_get_breakの正常系・異常系 | E-04 (get_break_index, bp構造体コピー) | ○ |
| C-31〜C-37 | mrb_debug_delete_break / delete_break_allの正常系・異常系 | E-04 (free_breakpoint, 配列シフト, bpnum--) | ○ |
| C-38〜C-45 | enable_break / disable_breakの正常系・異常系 | E-04 (bp[index].enable = TRUE/FALSE) | ○ |
| C-46〜C-52 | check_breakpoint_line / check_breakpoint_methodの正常系・異常系 | E-04 (ファイル名・行番号比較、メソッド比較ロジック) | ○ |
| C-53〜C-61 | check_lineno / get_break_index / free_breakpointの内部関数 | E-04 (各内部関数の実装) | ○ |

### apilist.c（UT-DBG-062〜076）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-62 | mrb_debug_listで.rbファイルの行が表示される | E-05, E-06 (source_file_new, show_lines) | ○ |
| C-63〜C-68 | mrb_debug_listの異常系（NULL, 拡張子, 行番号範囲） | E-06 (各条件チェック) | ○ |
| C-69〜C-71 | mrb_debug_get_sourceのソースファイル検索 | E-06 (search_path[3]配列による検索) | ○ |
| C-72〜C-76 | build_path / dirnameの内部関数 | E-06 (各内部関数の実装) | ○ |

### apiprint.c（UT-DBG-077〜082）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-77 | mrb_debug_evalで有効な式が評価される | E-07, E-08 (mrb_load_nstring_cxt, mrb_funcall_argv) | △ |
| C-78 | direct_eval=1でメソッド呼び出しとして評価される | E-08 (if (direct_eval) mrb_funcall(mrb,recv,expr,0)) | ○ |
| C-79 | 構文エラー時に例外情報が返却される | E-08 (mrdb_check_syntax後のmrb->excチェック) | ○ |
| C-80 | code_fetch_hookが一時無効化される | E-08 (tmp=mrb->code_fetch_hook; mrb->code_fetch_hook=NULL; ... mrb->code_fetch_hook=tmp) | ○ |
| C-81〜C-82 | mrdb_check_syntaxの正常系・異常系 | E-08 (no_exec=TRUE, capture_errors=TRUE) | ○ |

### cmdrun.c（UT-DBG-083〜091）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-83 | DBG_INIT時にrunでDBG_RUNに遷移する | E-11 (if (dbg->xm==DBG_INIT) dbg->xm=DBG_RUN) | ○ |
| C-84 | DBG_RUN時にrunでリスタートが行われる | E-11 (dbg->xm=DBG_QUIT, DebuggerRestart例外) | ○ |
| C-85 | DBG_PHASE_BEFORE_RUN時にrunでDBG_QUITに遷移する | E-11 (xphase!=DBG_PHASE_RUNNING時はraiseせずreturn) | ○ |
| C-86 | continueでDBG_RUNに遷移する | E-11 (dbg->xm=DBG_RUN) | ○ |
| C-87 | continue NでccntがNに設定される | E-11 (sscanf(mrdb->words[1],"%d",&ccnt); dbg->ccnt=ccnt) | ○ |
| C-88 | continue 0でccnt=1に設定される | E-11 (ccnt>0?ccnt:1) | ○ |
| C-89 | AFTER_RUN時にcontinueでプログラム未実行メッセージ | E-11 (if DBG_PHASE_AFTER_RUN puts "The program is not running.") | ○ |
| C-90 | stepでDBG_STEPに遷移する | E-11 (mrdb->dbg->xm=DBG_STEP) | ○ |
| C-91 | nextでDBG_NEXTに遷移しprvciが設定される | E-11 (dbg->xm=DBG_NEXT; dbg->prvci=mrb->c->ci) | ○ |

### cmdbreak.c（UT-DBG-092〜124）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-92〜C-96 | dbgcmd_breakの正常系・異常系 | E-12 (parse_breakcommand, mrb_debug_set_break_line/method) | ○ |
| C-97〜C-99 | dbgcmd_info_breakの正常系 | E-12 (info_break_all, info_break_select) | ○ |
| C-100〜C-102 | dbgcmd_deleteの正常系・異常系 | E-12 (exe_set_command_all, exe_set_command_select) | ○ |
| C-103〜C-106 | dbgcmd_enable / dbgcmd_disableの正常系 | E-12 (同上パターン) | ○ |
| C-107〜C-124 | check_bptype / parse_breakpoint_no / parse_breakcommandのパース | E-12 (各パース関数の実装) | ○ |

### cmdprint.c（UT-DBG-125〜130）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-125 | dbgcmd_printで式が評価・出力される | E-13 (mrb_debug_eval呼び出し、printf) | ○ |
| C-126 | print_noがインクリメントされる | E-13 (mrdb->print_no++) | ○ |
| C-127 | 引数なしでエラーメッセージ表示 | E-13 (if (mrdb->wcnt<=1) puts("Parameter not specified.")) | ○ |
| C-128 | print_noオーバーフロー時にリセット | E-13 (if (mrdb->print_no==0) mrdb->print_no=1) | ○ |
| C-129 | dbgcmd_evalがdbgcmd_printに委譲する | E-13 (return dbgcmd_print(mrb,mrdb)) | ○ |
| C-130 | dbgcmd_info_localでローカル変数が表示される | E-13 (mrb_debug_eval(mrb,mrdb->dbg,"local_variables",0,NULL,1)) | ○ |

### cmdmisc.c（UT-DBG-131〜156）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-131〜C-134 | dbgcmd_listの正常系 | E-14 (parse_listcmd_args, mrb_debug_get_source, mrb_debug_list) | ○ |
| C-135〜C-138 | dbgcmd_helpの正常系・異常系 | E-14 (show_short_help, show_long_help, get_help_msg) | ○ |
| C-139〜C-142 | dbgcmd_quitの正常系（確認プロンプト含む） | E-14 (switch(dbg->xm), getchar()による確認) | ○ |
| C-143〜C-148 | check_cmd_patternのパターンマッチ | E-14 (ブラケットパース、strncmp) | ○ |
| C-149〜C-153 | parse_listcmd_argsのパース | E-14 (parse_lineno, parse_filename, parse_uint) | ○ |
| C-154〜C-156 | replace_extの拡張子置換 | E-14 (strrchr('.'), strncpy, strcat) | ○ |

### mrdb.c（UT-DBG-157〜207）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-157 | mrb_debug_context_newの初期化 | E-02 (dbg_zero, xm=DBG_INIT, xphase=DBG_PHASE_BEFORE_RUN, next_bpno=1) | ○ |
| C-158〜C-161 | context_get / context_setのシングルトン管理 | E-02 (_debug_context変数管理) | ○ |
| C-162〜C-163 | mrb_debug_context_freeのメモリ解放 | E-02 (mrb_debug_delete_break_all, mrb_free, _debug_context=NULL) | ○ |
| C-164〜C-169 | mrdb_state_new / get / set / freeの管理 | E-02 (_mrdb_state変数管理、commandバッファ確保) | ○ |
| C-170〜C-175 | parse_commandのコマンドパース | E-02 (debug_command_list照合、短縮形、サブコマンド、div処理) | ○ |
| C-176〜C-180 | pick_out_wordの単語抽出 | E-02 (ISBLANK, strpbrk, クォート処理) | ○ |
| C-181〜C-188 | parse_argsのコマンドライン引数パース | E-02 (for loop, -b/-d/--version/--copyright, fopen) | ○ |
| C-189〜C-197 | mrb_code_fetch_hookのフック処理 | E-02 (DBG_INIT/STEP/NEXT/RUN各分岐、break_hook呼出、ccntカウントダウン) | △ |
| C-198〜C-201 | check_method_breakpointのメソッドチェック | E-02 (mrb_decode_insn, OP_SEND/SENDB/SUPER分岐) | △ |
| C-202〜C-203 | mrb_debug_break_hookのコマンドループ | E-02 (while(1) get_and_parse_command, cmd->func) | ○ |
| C-204〜C-207 | print_info_stoppedの停止情報表示 | E-02 (switch(dbg->bm)分岐、各print関数) | ○ |

## 4) 不足情報（Unknown / Missing）
- **mrb_debug_eval（C-77）の具体的な戻り値形式**: 式評価の結果はmruby VMのランタイム状態に依存するため、静的解析のみでは正確な期待結果を記述しきれない。実際のテスト実装時にmruby VMを初期化してランタイムで検証する必要がある。
  - 候補：mrubyランタイムテスト / 統合テスト / 既存のbintest参照
- **mrb_code_fetch_hook（C-189〜C-197）のテスト条件**: フック関数はmruby VMの内部状態（irep, pc, regs, callinfo）に強く依存する。テスト用のirep/pc/regs構造体のモック生成方法が不明。
  - 候補：既存テストハーネス / mrubyテストフレームワーク / テスト用irep生成ユーティリティ
- **check_method_breakpoint（C-198〜C-201）の命令デコード**: OP_SEND/OP_SUPER命令のエンコード形式はmruby VMの内部仕様に依存し、テスト用の命令列の構築方法が不明。
  - 候補：mrubyコンパイラAPI / バイトコード直接構築

## 5) リスクフラグ（レビュー観点）
- **リスク2（高）**: mrb_code_fetch_hookのテストケース（UT-DBG-189〜197）は、VM内部状態への強い依存があり、単体テストとして実装する場合にモック/スタブの設計が複雑になる可能性がある
- **リスク1（中）**: mrb_debug_evalのテストケース（UT-DBG-077〜080）は、mrubyのコンパイル・評価パイプライン全体を必要とするため、単体テストよりも統合テストとして実装する方が適切な可能性がある
- **リスク1（中）**: check_method_breakpoint（UT-DBG-198〜201）は、mrb_decode_insnの結果に依存し、テスト入力の準備が複雑
- **リスク0（低）**: apistring.c / apibreak.cの大部分は独立した関数であり、単体テストとして容易に実装可能

## 6) レビュアーチェックリスト（最小）
- [ ] apibreak.cの全パブリック関数（set/get/delete/enable/disable/check）にNULLチェックのテストケースが含まれているか
- [ ] MAX_BREAKPOINT(5)の上限に関する境界値テストが十分か
- [ ] dbgcmd_run / dbgcmd_continueの状態遷移テスト（DBG_INIT -> DBG_RUN, DBG_RUN -> DBG_QUIT等）が全分岐をカバーしているか
- [ ] parse_commandの短縮コマンドマッチング（b -> break, c -> continue等）のテストケースが十分か
- [ ] mrb_debug_eval / mrdb_check_syntaxのテスト条件が実装可能か（mruby VMの初期化が必要）
- [ ] mrb_code_fetch_hookのテスト条件が実装可能か（VM内部状態のモック/スタブが必要）
- [ ] cmdmisc.cのquitコマンドのインタラクティブ確認プロンプトのテスト方法（stdin/stdoutのリダイレクト）
- [ ] apilist.cのファイル操作（fopen/fclose/fgets）を伴うテストの前提条件（テスト用.rbファイルの準備）
