docs: define pure method call contract and interprocedural scope (#10) - #23
Closed
mao2009 wants to merge 1 commit into
Closed
docs: define pure method call contract and interprocedural scope (#10)#23mao2009 wants to merge 1 commit into
mao2009 wants to merge 1 commit into
Conversation
Issue #10 に対応し、[PureMethod] の契約を呼び出し先まで含めて一貫して 扱えるようにする。テスト数 128 -> 145。 追加: docs/CALL-CONTRACT.md 呼び出し契約を仕様化した。 [PureMethod] は「シンボルに宣言された契約」であり、実装から推論される 性質ではない。pure method から呼べるのは (1) 静的に解決されたシンボルが [PureMethod] を持つメソッド (2) 既知純粋型のメソッド のみで、それ以外は RT0002 とする。呼び出し先の本体は開かない。 未マークのメソッドは常に非純粋として扱う fail-closed 規則である。 解決規則を表で確定した。契約は「静的に解決されたシンボル」に対して 判定されるため、以下が帰結する (すべて実測で確認): - interface 呼び出しは interface メンバに解決されるため、 実装クラス側の [PureMethod] では契約を満たさない - base 型経由の virtual 呼び出しは base のシンボルに解決されるため、 override 側のみの [PureMethod] は効かない - overload は選択されたオーバーロード単位で判定される - 相互再帰は全参加者が [PureMethod] を持つ必要がある virtual dispatch が健全でないことを明記した。base の virtual に [PureMethod] を付けると base 型経由の呼び出しがすべて許可されるが、 override が純粋である保証はなく、PureSharp は検証しない。 virtual / interface メンバへの [PureMethod] 付与は、全 override で 契約を守る責任を著者が負う表明である。 interprocedural analysis の対象範囲を明示した。 v1.0 の対象は「呼び出し 1 段階のみ」。呼び出し先本体の読解、 未マークメソッドを介した推移的伝播、override の契約遵守検証、 whole-program 解析、delegate 実体の純粋性は対象外とした。 cross-method traversal を行わないことが線形コストの根拠である。 呼び出し契約の対象外を 2 件明記した (いずれも false negative)。 ユーザー定義 property getter は property 参照が I/O 型判定しか 行わないため対象外。コンストラクタは invocation として解析されない ため対象外。 external dependency の扱いを決定した。 外部アセンブリも同じ fail-closed 規則で扱い特別扱いしない。 既知純粋型リストに含まれれば許可、それ以外は RT0002。 却下した代替案とその理由も記載した (外部 IL からの純粋性推論は analyzer 内で決定不能かつ環境依存で再現性がない、既定で信頼するのは fail-open、他ライブラリの [Pure] 属性は意味論が弱く一貫性がない)。 既知純粋型リストは allowlist であり、取りこぼしは過剰報告になるが、 リストへの追加は検出範囲の縮小であり非破壊的変更として minor で 修正可能である。 performance を実測した。 methods=100 / 500 / 2000 に対し analyzer 時間は 186 / 349 / 844 ms、 1 メソッドあたり 1.86 / 0.70 / 0.42 ms。コストは解析対象 operation 数に 対して線形で、超線形な挙動はない。call graph を構築せず呼び出し先本体を 訪問しないことがその理由であり、1 段階契約の実利的な利点である。 同一ソースの baseline compile に対して概ね 0.8-1.1 倍。 測定方法も再現可能な形で記載した。 追加: CallContractTests.cs (17 tests) 上記の解決規則・external dependency・対象外ケースを実測で固定した。 performance guard も含む。厳密な閾値は環境差でフレークになるため 破滅的退行のみを検出する緩い上限 (2000 メソッドで 60 秒) とし、 絶対値は閾値ではなく傾向として文書に記録した。 本 PR は Analyzer の挙動を変更していない。 検出範囲の拡大を伴う項目は Open decisions として 5 件記載した (override の契約検証、属性の継承、property getter、コンストラクタ、 ローカル関数の契約継承)。 更新: docs/DIAGNOSTICS.md, docs/PURITY-SEMANTICS.md CALL-CONTRACT.md への相互参照を追加。 検証結果: - dotnet build: PASS (0 error) - dotnet test --no-build: PASS (145/145、baseline 56 から +89) - git diff --check: PASS Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XB2mDSE67ZDQS9mk5KfAdZ
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Team Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue #10: Define pure method contract and interprocedural analysis
Refs #10
[PureMethod]の契約を呼び出し先まで含めて一貫して扱えるようにします。テスト数 128 → 145。呼び出し契約
pure method から呼べるのは (1) 静的に解決されたシンボルが
[PureMethod]を持つメソッド、(2) 既知純粋型のメソッド — のみ。それ以外はRT0002。呼び出し先の本体は開かず、未マークのメソッドは常に非純粋として扱う fail-closed 規則です。解決規則(すべて実測で確認)
契約は「静的に解決されたシンボル」に対して判定されるため、直感に反する帰結があります。
[PureMethod]の必要箇所base の virtual に
[PureMethod]を付けると base 型経由の呼び出しがすべて許可されますが、override が純粋である保証はなく、PureSharp は検証しません。virtual / interface メンバへの付与は、全 override で契約を守る責任を著者が負う表明です。Interprocedural scope
対象: 呼び出し 1 段階のみ。 対象外は呼び出し先本体の読解 / 未マークメソッド経由の推移的伝播 / override の契約遵守検証 / whole-program 解析 / delegate 実体の純粋性。
cross-method traversal を行わないことが線形コストの根拠です。
呼び出し契約の対象外(false negative)
new T()External dependency の決定
外部アセンブリも同じ fail-closed 規則で扱い、特別扱いしません。 既知純粋型リストに含まれれば許可、それ以外は
RT0002。却下した代替案と理由も記載: 外部 IL からの純粋性推論(analyzer 内で決定不能・環境依存で再現性なし)/ 既定で信頼(fail-open)/ 他ライブラリの
[Pure]属性採用(意味論が弱く一貫性がない)。既知純粋型リストは allowlist なので取りこぼしは過剰報告になりますが、リストへの追加は検出範囲の縮小=非破壊的変更であり minor で修正可能です。
Performance(実測)
線形で、超線形な挙動はありません。call graph を構築せず呼び出し先本体を訪問しないためで、1 段階契約の実利的な利点です。baseline compile 比 0.8–1.1×。
CallContractTestsに再現可能な guard を含めましたが、閾値は環境差でフレークにならないよう十分緩く(2,000 メソッドで 60 秒)、絶対値は閾値ではなく傾向として記録しています。Open decisions として 5 件記載: override の契約検証 / 属性の継承 / property getter / コンストラクタ / ローカル関数の契約継承。
Verification
git diff --check: PASSIssue #10 完了条件
Merge boundary
技術検証を通過しても MERGE CANDIDATE にとどまります。merge には Merge Skill による検証と、この PR / HEAD に対する新しい明示的 human approval が必要です。
🤖 Generated with Claude Code