---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 112
  claims_with_evidence: 108
  claims_without_evidence: 4
confidence_derived: 0.96
---

# 根拠レポート：tsf.csv

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：108 / 112、根拠なし：4
- 優先レビュー（高）
  1. **C-080**: _doCompositionUpdateの_providerがnull時の挙動 - コード上は_providerのnullチェック後のブロック内で処理されるが、ファイナライズテキスト削除処理はproviderチェック外で実行されるため、部分的に実行される可能性がある
  2. **C-104**: CoTaskMemAllocのメモリ不足テスト - 実際の環境でCoTaskMemAllocの失敗を再現するのは困難
  3. **C-032**: FindWindowOfActiveTSFの_provider復元メカニズム - wil::scope_exitの動作に依存するため、テスト実装が複雑
  4. **C-081**: カーソル位置計算のクランプ処理 - GetSelection失敗時のcursorPos=LONG_MAXのクランプ挙動の詳細確認が必要

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

- E-01: `src/tsf/Handle.h` - Handle クラスの宣言、IDataProvider インターフェース定義
- E-02: `src/tsf/Handle.cpp` - Handle クラスの実装（Create, デストラクタ, ムーブ, 委譲メソッド群）
- E-03: `src/tsf/Implementation.h` - Implementation クラスの宣言（ITfContextOwner, ITfContextOwnerCompositionSink, ITfTextEditSink）
- E-04: `src/tsf/Implementation.cpp` - Implementation クラスの完全な実装（初期化、COM、TSFコールバック、コンポジション処理）
- E-05: `src/tsf/precomp.h` - プリコンパイル済みヘッダー（msctf.h, InputScope.h のインクルード確認）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | Handle::CreateでInitialize成功時に有効なHandleが返る | E-02 (L11-21) | ○ |
| C-002 | Handle::CreateでInitialize失敗時に空Handleが返る | E-02 (L15-19) | ○ |
| C-003 | Handle::~HandleでUninitializeとReleaseが呼ばれる | E-02 (L33-40) | ○ |
| C-004 | Handle::~Handleで_impl=nullptrの場合安全 | E-02 (L35) | ○ |
| C-005 | Handle(Handle&&)で所有権が移転する | E-02 (L42-46) | ○ |
| C-006 | operator=(Handle&&)で所有権が移転する | E-02 (L48-57) | ○ |
| C-007 | operator=(Handle&&)で自己代入ガードがある | E-02 (L50) | ○ |
| C-008 | operator boolで_impl!=nullptrならtrue | E-02 (L59-62) | ○ |
| C-009 | operator boolで_impl==nullptrならfalse | E-02 (L59-62) | ○ |
| C-010 | Handle::FindWindowOfActiveTSFが_implに委譲 | E-02 (L64-67) | ○ |
| C-011 | Handle::FindWindowOfActiveTSFで_impl=nullptrならnullptr | E-02 (L66) | ○ |
| C-012 | Handle::AssociateFocusが_implに委譲 | E-02 (L69-75) | ○ |
| C-013 | Handle::AssociateFocusで_impl=nullptrなら何もしない | E-02 (L71) | ○ |
| C-014 | Handle::Focusが_implに委譲 | E-02 (L77-83) | ○ |
| C-015 | Handle::Focusで_impl=nullptrなら何もしない | E-02 (L79) | ○ |
| C-016 | Handle::Unfocusが_implに委譲 | E-02 (L85-91) | ○ |
| C-017 | Handle::Unfocusで_impl=nullptrなら何もしない | E-02 (L87) | ○ |
| C-018 | Handle::HasActiveCompositionで_impl有効時にtrue | E-02 (L93-96) | ○ |
| C-019 | Handle::HasActiveCompositionで_impl有効・非アクティブ時にfalse | E-02 (L95) | ○ |
| C-020 | Handle::HasActiveCompositionで_impl=nullptrならfalse | E-02 (L95) | ○ |
| C-021 | Handle::AvoidBuggyTSFConsoleFlagsがTF_TMAE_CONSOLEをクリア | E-02 (L23-26), E-04 (L63-66) | ○ |
| C-022 | Handle::SetDefaultScopeAlphanumericHalfWidthでenable=true | E-02 (L28-31), E-04 (L69-72) | ○ |
| C-023 | Handle::SetDefaultScopeAlphanumericHalfWidthでenable=false | E-02 (L28-31), E-04 (L69-72) | ○ |
| C-024 | Implementation::Initializeで全COMオブジェクトが初期化 | E-04 (L74-101) | ○ |
| C-025 | Implementation::InitializeでCategoryMgr生成失敗時にfalse | E-04 (L76-80) | ○ |
| C-026 | Implementation::Uninitializeで全リソース解放 | E-04 (L103-130) | ○ |
| C-027 | Uninitializeで_associatedHwnd=nullの場合スキップ | E-04 (L107) | ○ |
| C-028 | Uninitializeでcookie無効時にUnadviseSinkスキップ | E-04 (L113, L117) | ○ |
| C-029 | FindWindowOfActiveTSFでアクティブTSFのHWND返却 | E-04 (L132-177) | ○ |
| C-030 | FindWindowOfActiveTSFでEnumDocumentMgrs失敗時nullptr | E-04 (L147-150) | ○ |
| C-031 | FindWindowOfActiveTSFでNext失敗時nullptr | E-04 (L153-156) | ○ |
| C-032 | FindWindowOfActiveTSFで_provider一時クリアと復元 | E-04 (L142-144) | ○ |
| C-033 | AssociateFocusでprovider設定とフォーカス関連付け | E-04 (L179-186) | ○ |
| C-034 | Focusでprovider設定とSetFocus呼出 | E-04 (L188-193) | ○ |
| C-035 | Unfocusでプレビュークリアとproviderリセット | E-04 (L195-226) | ○ |
| C-036 | Unfocusでコンポジションアクティブ時にTerminateComposition | E-04 (L222-225) | ○ |
| C-037 | Unfocusで_provider=null時に早期リターン | E-04 (L197-199) | ○ |
| C-038 | Unfocusでprovider不一致時に早期リターン | E-04 (L197-199) | ○ |
| C-039 | UnfocusでtsfPreview.text空時にNotifyPaintFrame不呼出 | E-04 (L211) | ○ |
| C-040 | HasActiveCompositionで_compositions>0ならtrue | E-04 (L228-231) | ○ |
| C-041 | HasActiveCompositionで_compositions=0ならfalse | E-04 (L230) | ○ |
| C-042 | QueryInterfaceでIID_ITfContextOwner対応 | E-04 (L242-244) | ○ |
| C-043 | QueryInterfaceでIID_ITfContextOwnerCompositionSink対応 | E-04 (L246-248) | ○ |
| C-044 | QueryInterfaceでIID_ITfTextEditSink対応 | E-04 (L250-252) | ○ |
| C-045 | QueryInterfaceでIID_IUnknown対応 | E-04 (L254-256) | ○ |
| C-046 | QueryInterfaceで未サポートIIDにE_NOINTERFACE | E-04 (L258-262) | ○ |
| C-047 | QueryInterfaceでppvObj=nullにE_POINTER | E-04 (L237-239) | ○ |
| C-048 | AddRefで参照カウントインクリメント | E-04 (L268-271) | ○ |
| C-049 | Releaseで参照カウントデクリメント | E-04 (L273-281) | ○ |
| C-050 | Releaseで参照カウント0時にdelete | E-04 (L276-278) | ○ |
| C-051 | GetACPFromPointでE_NOTIMPL返却 | E-04 (L287-291) | ○ |
| C-052 | GetTextExtでprovider有効時にカーソル位置RECT返却 | E-04 (L294-309) | ○ |
| C-053 | GetTextExtでprovider=null時に空RECT | E-04 (L299) | ○ |
| C-054 | GetTextExtでprc=null時の安全動作 | E-04 (L297) | ○ |
| C-055 | GetTextExtでpfClipped=null時の安全動作 | E-04 (L302) | ○ |
| C-056 | GetScreenExtでprovider有効時にビューポートRECT返却 | E-04 (L312-322) | ○ |
| C-057 | GetScreenExtでprovider=null時に空RECT | E-04 (L317) | ○ |
| C-058 | GetScreenExtでprc=null時の安全動作 | E-04 (L315) | ○ |
| C-059 | GetStatusでTS_SS_TRANSITORY|TS_SS_NOHIDDENTEXTフラグ設定 | E-04 (L324-357) | ○ |
| C-060 | GetStatusでpdcs=null時の安全動作 | E-04 (L326) | ○ |
| C-061 | GetWndでprovider有効時にHWND返却 | E-04 (L359-363) | ○ |
| C-062 | GetWndでprovider=null時にnullptr | E-04 (L361) | ○ |
| C-063 | GetAttributeでAnsiInputScope有効+GUID_PROP_INPUTSCOPE時にITfInputScope返却 | E-04 (L365-377) | ○ |
| C-064 | GetAttributeでAnsiInputScope無効時にVT_EMPTY | E-04 (L367, L375) | ○ |
| C-065 | GetAttributeで非GUID_PROP_INPUTSCOPE時にVT_EMPTY | E-04 (L367, L375) | ○ |
| C-066 | OnStartCompositionで_compositionsインクリメントとpfOk=TRUE | E-04 (L383-390) | ○ |
| C-067 | OnStartCompositionで複数コンポジションのインクリメント | E-04 (L386) | ○ |
| C-068 | OnUpdateCompositionで常にS_OK | E-04 (L392-395) | ○ |
| C-069 | OnEndCompositionで_compositions=0時に編集セッションリクエスト | E-04 (L397-417) | ○ |
| C-070 | OnEndCompositionで_compositions>1時にデクリメントのみ | E-04 (L405-406) | ○ |
| C-071 | OnEndCompositionで_compositions<=0時にE_FAIL | E-04 (L400-403) | ○ |
| C-072 | OnEndEditで_compositions=1時に編集セッションリクエスト | E-04 (L423-437) | ○ |
| C-073 | OnEndEditで_compositions=0時にリクエストなし | E-04 (L426) | ○ |
| C-074 | OnEndEditで_compositions>=2時にリクエストなし | E-04 (L426) | ○ |
| C-075 | _requestでreferenceCount=0時にRequestEditSession呼出 | E-04 (L558-570) | ○ |
| C-076 | _requestでreferenceCount>0時にS_FALSE | E-04 (L561-564) | ○ |
| C-077 | _doCompositionUpdateでプレビュー反映 | E-04 (L572-728) | ○ |
| C-078 | _doCompositionUpdateでファイナライズテキストをHandleOutputに渡す | E-04 (L724-727) | ○ |
| C-079 | _doCompositionUpdateでファイナライズテキストをコンテキストから削除 | E-04 (L695-703) | ○ |
| C-080 | _doCompositionUpdateで_provider=null時の安全性 | E-04 (L705) | △ |
| C-081 | _doCompositionUpdateでカーソル位置計算 | E-04 (L672-693) | △ |
| C-082 | _textAttributeFromAtomでTF_INVALID_GUIDATOM時にDashedUnderlined | E-04 (L738-742) | ○ |
| C-083 | _textAttributeFromAtomで有効atom時に表示属性反映 | E-04 (L731-797) | ○ |
| C-084 | _textAttributeFromAtomでGetGUID失敗時にデフォルト | E-04 (L745-748) | ○ |
| C-085 | _textAttributeFromAtomでGetDisplayAttributeInfo失敗時にデフォルト | E-04 (L750-754) | ○ |
| C-086 | _textAttributeFromAtomでcrText.type==crBk.type時に色設定 | E-04 (L767-776) | ○ |
| C-087 | _textAttributeFromAtomでcrText.type!=crBk.type時に色未設定 | E-04 (L767) | ○ |
| C-088 | _textAttributeFromAtomでfBoldLine時にDoublyUnderlined | E-04 (L791-794) | ○ |
| C-089 | _textAttributeFromAtomでlsStyle各値のマッピング | E-04 (L777-787) | ○ |
| C-090 | _colorFromDisplayAttributeでTF_CT_SYSCOLOR時にGetSysColor | E-04 (L803-804) | ○ |
| C-091 | _colorFromDisplayAttributeでTF_CT_COLORREF時にcolor.cr | E-04 (L805-806) | ○ |
| C-092 | _colorFromDisplayAttributeでデフォルト時に0 | E-04 (L807-812) | ○ |
| C-093 | EditSessionProxyBase::QueryInterfaceでIID_ITfEditSession対応 | E-04 (L453-455) | ○ |
| C-094 | EditSessionProxyBase::QueryInterfaceでIID_IUnknown対応 | E-04 (L457-459) | ○ |
| C-095 | EditSessionProxyBase::QueryInterfaceで未サポートIIDにE_NOINTERFACE | E-04 (L461-465) | ○ |
| C-096 | EditSessionProxyBase::QueryInterfaceでppvObj=nullにE_POINTER | E-04 (L448-451) | ○ |
| C-097 | EditSessionProxyBase::AddRefで両方インクリメント | E-04 (L471-475) | ○ |
| C-098 | EditSessionProxyBase::Releaseで両方デクリメント | E-04 (L477-481) | ○ |
| C-099 | AnsiInputScope::QueryInterfaceでIID_ITfInputScope対応 | E-04 (L495-497) | ○ |
| C-100 | AnsiInputScope::QueryInterfaceでIID_IUnknown対応 | E-04 (L499-501) | ○ |
| C-101 | AnsiInputScope::QueryInterfaceで未サポートIIDにE_NOINTERFACE | E-04 (L503-507) | ○ |
| C-102 | AnsiInputScope::QueryInterfaceでppvObj=nullにE_POINTER | E-04 (L490-493) | ○ |
| C-103 | AnsiInputScope::GetInputScopesでIS_ALPHANUMERIC_HALFWIDTH返却 | E-04 (L523-536) | ○ |
| C-104 | AnsiInputScope::GetInputScopesでCoTaskMemAlloc失敗時E_OUTOFMEMORY | E-04 (L526-529) | △ |
| C-105 | AnsiInputScope::GetPhraseでE_NOTIMPL | E-04 (L538-541) | ○ |
| C-106 | AnsiInputScope::GetRegularExpressionでE_NOTIMPL | E-04 (L543-546) | ○ |
| C-107 | AnsiInputScope::GetSRGSでE_NOTIMPL | E-04 (L548-551) | ○ |
| C-108 | AnsiInputScope::GetXMLでE_NOTIMPL | E-04 (L553-556) | ○ |
| C-109 | AvoidBuggyTSFConsoleFlagsでTF_TMAE_CONSOLEビットクリア | E-04 (L63-66) | ○ |
| C-110 | AvoidBuggyTSFConsoleFlagsの冪等性 | E-04 (L65) | ○ |
| C-111 | SetDefaultScopeAlphanumericHalfWidthでtrue設定 | E-04 (L69-72) | ○ |
| C-112 | SetDefaultScopeAlphanumericHalfWidthでfalse設定 | E-04 (L69-72) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-080**: `_doCompositionUpdate`内の`_provider`がnullの場合、ファイナライズテキストのコンテキスト削除処理（L695-703）は`_provider`チェックの前に実行される。そのため「クラッシュせずに処理が完了する」という主張は正しいが、ファイナライズテキストの削除は実行される点を明記すべき
  - 候補：実際のTSFコンテキストでのnullプロバイダー挙動テスト / COMモック環境でのテスト
- **C-081**: カーソル位置計算のクランプ処理で、`GetSelection`が`TF_E_NOSELECTION`を返した場合の`cursorPos=LONG_MAX`のクランプ挙動は、`activeComposition.size()`に依存する
  - 候補：各種セレクション状態での結合テスト / GetSelection失敗パターンのモック
- **C-104**: `CoTaskMemAlloc`のメモリ不足テストは、実際のテスト環境での再現が困難
  - 候補：カスタムアロケータを用いたモック / メモリ圧迫テスト

## 5) リスクフラグ（レビュー観点）
- **1（中リスク）**: `_doCompositionUpdate`は最も複雑なメソッドで、TSFコンテキストとの相互作用が多い。COMモックの構築が困難なため、テスト実装の実現可能性に注意が必要
- **0（低リスク）**: Handle クラスのpimplラッパーは単純な委譲パターンで、テストは比較的容易
- **1（中リスク）**: COM QueryInterface系のテストは、GUID比較とポインタキャストの正確性を確認する必要がある。実際のCOMランタイム環境が必要な場合がある
- **0（低リスク）**: AnsiInputScope の未実装メソッド（GetPhrase, GetRegularExpression, GetSRGS, GetXML）は単純にE_NOTIMPLを返すだけ

## 6) レビュアーチェックリスト（最小）
- [ ] Handle クラスのムーブセマンティクス（C-005~C-007）が正しく所有権を移転し、二重解放が発生しないことを確認
- [ ] Implementation::Unfocus のプロバイダー一致チェック（C-037, C-038）が正しいポインタ比較であることを確認
- [ ] OnEndComposition の _compositions<=0 のガード（C-071）が適切で、負の値にならないことを確認
- [ ] _doCompositionUpdate のファイナライズテキスト処理（C-077~C-081）が、COM呼び出しの失敗時に適切に例外を伝播することを確認
- [ ] _textAttributeFromAtom の色属性フィルタリングロジック（C-086, C-087）が、Tencent QQPinyin IMEのバグ回避として正しく機能することを確認
- [ ] _request の重複リクエスト防止（C-076）がスレッドセーフであることを確認（referenceCountのアクセスがアトミックかどうか）
