diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d65c59b5..88e7c5b8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2998,6 +2998,47 @@ jobs: [ "$rc" -eq 1 ] || { echo "FAIL: expected exit 1 (findings), got $rc"; exit 1; } case "$out" in *OWN001*) ;; *) echo "FAIL: the Rust core found no OWN001"; exit 1 ;; esac echo "OK: Rust-default dogfood on ${{ matrix.os }} (own-check.sh)" + # P-037 A1.1 (#304). Both censuses run here because this is the one job that + # already has all three things they need — a .NET SDK for the extractor, a + # built Rust candidate, and a Python for the reference engine. + # + # Linux only, deliberately: both censuses are about the EXTRACTOR's output and + # the two engines' reading of it, neither of which is platform-shaped. The + # Windows leg of this job exists for own-check.ps1, which is a separate + # launcher implementation and is the thing Windows actually tests. + # + # NOT here: the full P-037 verdict/MOS snapshots. The verdict sweep is + # 137 files times two engines and the MOS gate additionally measures the + # independent repository C# tree. They are per-STEP evidence recorded under + # docs/evidence/, not per-push work. The cheap provenance and MOS-reader + # controls below ARE per-push so forgetting or hollowing the heavy gate is red. + - name: P-037 conformance controls + fact-shape census + if: matrix.os == 'ubuntu-latest' + run: | + export OWEN_RUST_CORE="$PWD/rust/target/release/own-cli" + # The four G-V4 / class-3 controls, on both engines against one record. + # Today's record must match; --post-a1 is expected to FAIL until the + # semantic cut lands and is therefore NOT run as a gate here. + python scripts/p037_controls.py --engine both + # The eleven fact shapes. This is the census that exists because the + # 137-file VERDICT corpus reported UNCHANGED for a version of a1 that + # turned six jobs in this very workflow red: verdict coverage is not + # syntax/fact-shape coverage, and one fixture per shape fails by NAME. + python scripts/p037_fact_shapes.py check --engine both + # A2.0: a recorded run remains evidence only while its measured + # implementation closure and exact input blob set stay unchanged. + python tests/test_p037_evidence.py + # Level 2 reads the whole MOS document through the existing common + # P-022 capture envelope. This cheap control pins that returns and + # unresolved fields cannot disappear behind a transfer-only projection. + python scripts/p037_mos_snapshot.py --selftest + # A2.0: the machinery a baseline run stands on, exercised where cargo, + # git and dotnet are real. Both Rust executables are built qualified + # (path from cargo's own compiler-artifact message, digest verified), + # the frozen repo population is derived, materialized from blobs, + # re-hashed and removed again. No baseline is taken here. + python scripts/p037_evidence.py artifacts + python scripts/p037_evidence.py population --source repo --materialize --cleanup # The Windows launcher is a separate implementation, not a wrapper around # the shell one, so the Windows leg has to go through it to mean anything. - name: Own.NET's own tree, through own-check.ps1 on the Rust core diff --git a/.gitignore b/.gitignore index cce242c9..1468cdf9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ __pycache__/ *.py[cod] *.egg-info/ .pytest_cache/ +.mypy_cache/ +# P-037 A2.0: frozen evidence populations, materialized from git blobs +# (scripts/p037_evidence.py); never tracked, never dirty. +.p037-population/ *.ownreport.json # .NET build output (golden_arraypool demo) diff --git a/corpus/p037-shapes/README.md b/corpus/p037-shapes/README.md new file mode 100644 index 00000000..0cbd8029 --- /dev/null +++ b/corpus/p037-shapes/README.md @@ -0,0 +1,34 @@ +# `corpus/p037-shapes` — the FACT-SHAPE census for P-037 A1.1 + +A small, deliberate census of the C# shapes whose **emitted facts** the A1.1 +steps must preserve or must change — not a second verdict corpus. + +## Why this exists + +A1.1-a1 taught the lesson the hard way. The 137-file verdict corpus reported +`UNCHANGED` for a version of a1 that turned six CI jobs red, because it contains +no method that returns its own disposable parameter and the repository's own +tree does. The corpus is labelled for **verdicts**; the A1.1 steps change the +**fact surface**. + +> **verdict coverage ≠ syntax / fact-shape coverage** + +Two hundred more random C# files would not have closed that gap. One fixture per +shape does. Each case here pins what the extractor emits for a shape it is known +to be sensitive to, so a step that changes a shape it did not mean to touch is +caught by name rather than by a CI job failing somewhere downstream. + +## Layout + + /case.cs the minimal program + /expected.json what the facts must look like, and the verdict + +`expected.json` records `facts` (asserted structure of the emitted +`functions[]` record) and `verdict` (the finding codes at warning severity). +A case whose shape belongs to a step that has not landed carries +`"status": "pending_a2"` with the contract it will be held to, and asserts +today's facts meanwhile — so the diff a2 produces is visible per shape instead +of aggregated into a number. + +Checked by `scripts/p037_fact_shapes.py`, which names its engine explicitly +(#262 Stage 3) and runs one extractor invocation per case. diff --git a/corpus/p037-shapes/call-expression-statement/case.cs b/corpus/p037-shapes/call-expression-statement/case.cs new file mode 100644 index 00000000..796a8871 --- /dev/null +++ b/corpus/p037-shapes/call-expression-statement/case.cs @@ -0,0 +1,28 @@ +// A statement-level call. The C# lowering emits a `call` op in exactly ONE +// place and only for `var x = Foo(...)` — a call whose RESULT binds to a local. +// `Inner(s, true);` as a statement produces no `call` node at all, so there is +// nothing for a summary layer to specialise. Without this, F3 cannot be carried +// through the existing summary layer at all. +// +// This is also where a2's zero-semantic-cut risk lives: a real `call` op is +// already semantically active and MOS reads it, so emitting one here can move +// an existing summary before the guarded kernel is anywhere near. The MOS +// collapsed-view diff is what catches that. +using System.IO; + +static class ShapeStatementCall +{ + static void Inner(Stream s, bool keep) + { + if (!keep) + { + s.Dispose(); + } + } + + static void Caller(string path) + { + var r = File.OpenRead(path); + Inner(r, true); + } +} diff --git a/corpus/p037-shapes/call-expression-statement/expected.json b/corpus/p037-shapes/call-expression-statement/expected.json new file mode 100644 index 00000000..22245c56 --- /dev/null +++ b/corpus/p037-shapes/call-expression-statement/expected.json @@ -0,0 +1,33 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "call-expression-statement", + "status": "pending_a2", + "why": "The heart of the a2 gap. The C# lowering emits a `call` op in exactly ONE place and only for `var x = Foo(...)` — a call whose RESULT binds to a local. `Inner(r, true);` as a STATEMENT produces no `call` node, which the recorded facts show: `Caller`'s body is `acquire:r`, `release:r` — the fabricated release — and no call at all. So F3 cannot be carried through the existing summary layer today: there is no node for a guarded summary to specialise.", + "a2_contract": "a2 emits a real `call` op for relevant first-party statement-level calls. This is also where a2's zero-semantic-cut risk lives, and it must be measured rather than hoped: a real `call` op is ALREADY semantically active and MOS reads it, so emitting one here can move an existing summary long before the guarded kernel is anywhere near. A verdict that happens to stay the same is not a pass — an unintended MOS collapsed-view change means a2 began the semantic cut early, and the answer is to isolate it or restage, never to note that the tests are green.", + "measured_at": "464308b", + "facts": { + "ShapeStatementCall.Inner": { + "params": [ + { + "name": "s", + "line": 15 + } + ], + "body": [ + "if:None@17", + "then:release:s@19" + ] + }, + "ShapeStatementCall.Caller": { + "params": null, + "body": [ + "acquire:r@25", + "release:r@26" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/corpus/p037-shapes/extension-receiver/case.cs b/corpus/p037-shapes/extension-receiver/case.cs new file mode 100644 index 00000000..ee7d7013 --- /dev/null +++ b/corpus/p037-shapes/extension-receiver/case.cs @@ -0,0 +1,25 @@ +// A reduced EXTENSION method. Roslyn's reduced symbol drops the `this` +// parameter from `Parameters`, but the summary lives on the UNREDUCED +// declaration where the receiver is parameter 0. a2 must synthesise +// receiver -> declared parameter 0 +// timeout -> declared parameter 1 +// or `CallReleasesReceiver` can never be honestly retired: the guarded +// summaries would be complete except for one old tunnel under the fence. +using System.IO; + +static class ShapeExtensionReceiver +{ + static void WaitForDispose(this Stream self, int timeout) + { + if (timeout >= 0) + { + self.Dispose(); + } + } + + static void Caller(string path) + { + var s = File.OpenRead(path); + s.WaitForDispose(5); + } +} diff --git a/corpus/p037-shapes/extension-receiver/expected.json b/corpus/p037-shapes/extension-receiver/expected.json new file mode 100644 index 00000000..51bfb639 --- /dev/null +++ b/corpus/p037-shapes/extension-receiver/expected.json @@ -0,0 +1,37 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "extension-receiver", + "status": "pending_a2", + "why": "A reduced extension method. Roslyn's reduced symbol drops `this` from Parameters while the summary lives on the UNREDUCED declaration, where the receiver is parameter 0.\n\nTwo things measured here, and the second was a surprise. (1) `CallReleasesReceiver` — the `ConsumesParam` consumer that handles this shape — is reached ONLY from two sites gated on `ThisFieldName(...)`: it is part of the FIELD disposal detector and never runs on a local. (2) Consequently `var s = ...; s.WaitForDispose(5);` is charged OWN001 even when the extension disposes its receiver UNCONDITIONALLY — verified with an unguarded probe, so it is not the guard doing it. That is a pre-existing false positive of exactly the family P-037 addresses (a first-party callee that releases, unrecognised), arriving through the RECEIVER rather than the argument. It is not A1's to fix and is recorded here so it is not mistaken for something A1 caused.", + "a2_contract": "a2 synthesises the receiver binding against the UNREDUCED declaration: receiver -> declared parameter 0, `timeout` -> declared parameter 1. Without it `CallReleasesReceiver` can never be honestly retired — the guarded summaries would be complete except for one old tunnel under the fence, on the field path where nobody is looking.", + "measured_at": "464308b", + "facts": { + "ShapeExtensionReceiver.WaitForDispose": { + "params": [ + { + "name": "self", + "line": 12 + } + ], + "body": [ + "if:None@14", + "then:release:self@16" + ] + }, + "ShapeExtensionReceiver.Caller": { + "params": null, + "body": [ + "acquire:s@22", + "use:s@23" + ] + } + }, + "verdict": { + "rust": [ + "OWN001:warning@22" + ], + "python": [ + "OWN001:warning@22" + ] + } +} diff --git a/corpus/p037-shapes/guard-bool-const-false/case.cs b/corpus/p037-shapes/guard-bool-const-false/case.cs new file mode 100644 index 00000000..b86f3e42 --- /dev/null +++ b/corpus/p037-shapes/guard-bool-const-false/case.cs @@ -0,0 +1,21 @@ +// The same call with `false`. The two constants must be distinguishable in the +// facts: a single "is a constant" bit would collapse the exact distinction the +// cell selection turns on. +using System.IO; + +static class ShapeConstFalse +{ + static void Inner(Stream s, bool keep) + { + if (!keep) + { + s.Dispose(); + } + } + + static void Caller(string path) + { + var r = File.OpenRead(path); + Inner(r, false); + } +} diff --git a/corpus/p037-shapes/guard-bool-const-false/expected.json b/corpus/p037-shapes/guard-bool-const-false/expected.json new file mode 100644 index 00000000..9ee67cca --- /dev/null +++ b/corpus/p037-shapes/guard-bool-const-false/expected.json @@ -0,0 +1,33 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "guard-bool-const-false", + "status": "pending_a2", + "why": "The same call with `false`. Present so the two constants are distinguishable in the facts: a single `is a constant` bit would collapse the exact distinction cell selection turns on, and would do it invisibly.", + "a2_contract": "{\"param\":1,\"kind\":\"bool_const\",\"value\":false}; Rust derives `const-neg`.", + "measured_at": "464308b", + "facts": { + "ShapeConstFalse.Inner": { + "params": [ + { + "name": "s", + "line": 8 + } + ], + "body": [ + "if:None@10", + "then:release:s@12" + ] + }, + "ShapeConstFalse.Caller": { + "params": null, + "body": [ + "acquire:r@18", + "release:r@19" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/corpus/p037-shapes/guard-bool-const-true/case.cs b/corpus/p037-shapes/guard-bool-const-true/case.cs new file mode 100644 index 00000000..fc7d60e5 --- /dev/null +++ b/corpus/p037-shapes/guard-bool-const-true/case.cs @@ -0,0 +1,22 @@ +// `Inner(s, true)`: a BOOL CONSTANT argument. a2 must record it as +// {"param":1,"kind":"bool_const","value":true}; Rust derives `const-pos`. +// The frontend never names const-pos itself — that is an interpretation +// relative to the callee's elected guard, and it belongs to Rust. +using System.IO; + +static class ShapeConstTrue +{ + static void Inner(Stream s, bool keep) + { + if (!keep) + { + s.Dispose(); + } + } + + static void Caller(string path) + { + var r = File.OpenRead(path); + Inner(r, true); + } +} diff --git a/corpus/p037-shapes/guard-bool-const-true/expected.json b/corpus/p037-shapes/guard-bool-const-true/expected.json new file mode 100644 index 00000000..4ac62522 --- /dev/null +++ b/corpus/p037-shapes/guard-bool-const-true/expected.json @@ -0,0 +1,33 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "guard-bool-const-true", + "status": "pending_a2", + "why": "`Inner(r, true)`: the constant that decides the callee's branch. Today it reaches the facts as nothing at all — the statement-level call emits no `call` op, and the fabricated `release` from ConsumesParam stands in its place.", + "a2_contract": "{\"param\":1,\"kind\":\"bool_const\",\"value\":true}. The frontend never writes `const-pos`: that is an interpretation relative to the callee's ELECTED guard and belongs to Rust.", + "measured_at": "464308b", + "facts": { + "ShapeConstTrue.Inner": { + "params": [ + { + "name": "s", + "line": 9 + } + ], + "body": [ + "if:None@11", + "then:release:s@13" + ] + }, + "ShapeConstTrue.Caller": { + "params": null, + "body": [ + "acquire:r@19", + "release:r@20" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/corpus/p037-shapes/guard-forward-bare/case.cs b/corpus/p037-shapes/guard-forward-bare/case.cs new file mode 100644 index 00000000..b438517e --- /dev/null +++ b/corpus/p037-shapes/guard-forward-bare/case.cs @@ -0,0 +1,19 @@ +// A wrapper FORWARDS its own flag unchanged: `Inner(s, keep)`. a2 records +// {"param":1,"kind":"param","source_param":1}; Rust reads the `id` edge. +using System.IO; + +static class ShapeForwardBare +{ + static void Inner(Stream s, bool keep) + { + if (!keep) + { + s.Dispose(); + } + } + + static void Outer(Stream s, bool keep) + { + Inner(s, keep); + } +} diff --git a/corpus/p037-shapes/guard-forward-bare/expected.json b/corpus/p037-shapes/guard-forward-bare/expected.json new file mode 100644 index 00000000..aaf9214c --- /dev/null +++ b/corpus/p037-shapes/guard-forward-bare/expected.json @@ -0,0 +1,37 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "guard-forward-bare", + "status": "pending_a2", + "why": "A wrapper forwarding its own flag unchanged. Today `Outer`'s body shows a fabricated `release` where the forward belongs, so the wrapper enters the summary layer as an unconditional consumer — the may-as-must flattening, now visible INSIDE the summaries rather than only at the call site.", + "a2_contract": "{\"param\":1,\"kind\":\"param\",\"source_param\":1}; Rust reads the `id` edge.", + "measured_at": "464308b", + "facts": { + "ShapeForwardBare.Inner": { + "params": [ + { + "name": "s", + "line": 7 + } + ], + "body": [ + "if:None@9", + "then:release:s@11" + ] + }, + "ShapeForwardBare.Outer": { + "params": [ + { + "name": "s", + "line": 15 + } + ], + "body": [ + "release:s@17" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/corpus/p037-shapes/guard-forward-negated/case.cs b/corpus/p037-shapes/guard-forward-negated/case.cs new file mode 100644 index 00000000..51a8bb7e --- /dev/null +++ b/corpus/p037-shapes/guard-forward-negated/case.cs @@ -0,0 +1,19 @@ +// The wrapper NEGATES the flag: `Inner(s, !stop)`. a2 records the same binding +// plus `"negated": true`; Rust reads the `neg` edge and the cells swap. +using System.IO; + +static class ShapeForwardNegated +{ + static void Inner(Stream s, bool keep) + { + if (!keep) + { + s.Dispose(); + } + } + + static void Outer(Stream s, bool stop) + { + Inner(s, !stop); + } +} diff --git a/corpus/p037-shapes/guard-forward-negated/expected.json b/corpus/p037-shapes/guard-forward-negated/expected.json new file mode 100644 index 00000000..67595f1f --- /dev/null +++ b/corpus/p037-shapes/guard-forward-negated/expected.json @@ -0,0 +1,37 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "guard-forward-negated", + "status": "pending_a2", + "why": "The wrapper negates the flag: `Inner(s, !stop)`. The cells must swap, and the swap has to be derivable from the facts rather than guessed.", + "a2_contract": "{\"param\":1,\"kind\":\"param\",\"source_param\":1,\"negated\":true}; Rust reads the `neg` edge.", + "measured_at": "464308b", + "facts": { + "ShapeForwardNegated.Inner": { + "params": [ + { + "name": "s", + "line": 7 + } + ], + "body": [ + "if:None@9", + "then:release:s@11" + ] + }, + "ShapeForwardNegated.Outer": { + "params": [ + { + "name": "s", + "line": 15 + } + ], + "body": [ + "release:s@17" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/corpus/p037-shapes/guard-mutated/case.cs b/corpus/p037-shapes/guard-mutated/case.cs new file mode 100644 index 00000000..c7b22b65 --- /dev/null +++ b/corpus/p037-shapes/guard-mutated/case.cs @@ -0,0 +1,25 @@ +// The guard parameter is WRITTEN before the branch reads it, so its entry value +// no longer decides the branch. G-V4 fails closed: no eligible guard, therefore +// no guard metadata at all. Absence IS the fail-closed signal — the frontend +// never emits "stable": false, because an old producer, an unstable parameter, +// an unsupported predicate and unknown syntax must all degrade the same way. +using System.IO; + +static class ShapeMutatedGuard +{ + static void Inner(Stream p, bool keep) + { + keep = !keep; + if (!keep) + { + p.Dispose(); + } + } + + static void Caller(string path) + { + var r = File.OpenRead(path); + Inner(r, true); + r.Dispose(); + } +} diff --git a/corpus/p037-shapes/guard-mutated/expected.json b/corpus/p037-shapes/guard-mutated/expected.json new file mode 100644 index 00000000..3e5f14da --- /dev/null +++ b/corpus/p037-shapes/guard-mutated/expected.json @@ -0,0 +1,38 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "guard-mutated", + "status": "pending_a2", + "why": "The guard parameter is WRITTEN before the branch reads it, so its entry value no longer decides anything. Recorded verdict today: a false OWN003 — the same defect the gv4-control-mutated-guard control carries, reproduced here in minimal form and independently of it.", + "a2_contract": "G-V4 fails closed: NOT eligible, therefore NO guard metadata on the `if`. Absence is the signal. The frontend must not emit `\"stable\": false` — an old producer, an unstable parameter, an unsupported predicate and unknown syntax all have to degrade the same way, and one of them will always be `a producer that predates this field`.", + "measured_at": "464308b", + "facts": { + "ShapeMutatedGuard.Inner": { + "params": [ + { + "name": "p", + "line": 10 + } + ], + "body": [ + "if:None@13", + "then:release:p@15" + ] + }, + "ShapeMutatedGuard.Caller": { + "params": null, + "body": [ + "acquire:r@21", + "release:r@22", + "release:r@23" + ] + } + }, + "verdict": { + "rust": [ + "OWN003:warning@21" + ], + "python": [ + "OWN003:warning@21" + ] + } +} diff --git a/corpus/p037-shapes/guard-opaque-expression/case.cs b/corpus/p037-shapes/guard-opaque-expression/case.cs new file mode 100644 index 00000000..ca5a1b70 --- /dev/null +++ b/corpus/p037-shapes/guard-opaque-expression/case.cs @@ -0,0 +1,22 @@ +// The argument is an arbitrary expression. a2 records {"kind":"opaque"} and +// stops. It must NOT serialise `"expr": "n > 0 && !flag"` for Rust to parse +// later: humanity already has one C# front end and does not need a second one +// written by accident inside a summary engine. +using System.IO; + +static class ShapeOpaqueArg +{ + static void Inner(Stream s, bool keep) + { + if (!keep) + { + s.Dispose(); + } + } + + static void Caller(string path, int n, bool flag) + { + var r = File.OpenRead(path); + Inner(r, n > 0 && !flag); + } +} diff --git a/corpus/p037-shapes/guard-opaque-expression/expected.json b/corpus/p037-shapes/guard-opaque-expression/expected.json new file mode 100644 index 00000000..aafe0f2b --- /dev/null +++ b/corpus/p037-shapes/guard-opaque-expression/expected.json @@ -0,0 +1,33 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "guard-opaque-expression", + "status": "pending_a2", + "why": "An arbitrary expression in the guard argument position. The case exists to pin what the frontend must NOT do.", + "a2_contract": "{\"param\":1,\"kind\":\"opaque\"} and nothing else. Specifically NOT `\"expr\": \"n > 0 && !flag\"` for something downstream to parse later: humanity already has one C# front end and does not need a second one growing quietly inside a summary engine.", + "measured_at": "464308b", + "facts": { + "ShapeOpaqueArg.Inner": { + "params": [ + { + "name": "s", + "line": 9 + } + ], + "body": [ + "if:None@11", + "then:release:s@13" + ] + }, + "ShapeOpaqueArg.Caller": { + "params": null, + "body": [ + "acquire:r@19", + "release:r@20" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/corpus/p037-shapes/guard-ref-alias/case.cs b/corpus/p037-shapes/guard-ref-alias/case.cs new file mode 100644 index 00000000..c1bf0372 --- /dev/null +++ b/corpus/p037-shapes/guard-ref-alias/case.cs @@ -0,0 +1,28 @@ +// The guard is handed to a `ref` parameter before the branch reads it, so a +// callee may have changed it. Same G-V4 verdict as a direct write: not +// eligible, no guard metadata. +using System.IO; + +static class ShapeRefAliasGuard +{ + static void Flip(ref bool b) + { + b = !b; + } + + static void Inner(Stream p, bool keep) + { + Flip(ref keep); + if (!keep) + { + p.Dispose(); + } + } + + static void Caller(string path) + { + var r = File.OpenRead(path); + Inner(r, true); + r.Dispose(); + } +} diff --git a/corpus/p037-shapes/guard-ref-alias/expected.json b/corpus/p037-shapes/guard-ref-alias/expected.json new file mode 100644 index 00000000..2ffc7646 --- /dev/null +++ b/corpus/p037-shapes/guard-ref-alias/expected.json @@ -0,0 +1,38 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "guard-ref-alias", + "status": "pending_a2", + "why": "The guard is handed to a `ref` parameter before the branch reads it, so a callee may have changed it. Same G-V4 answer as a direct write, reached by a different route; recorded verdict today is the same false OWN003.", + "a2_contract": "Not eligible, no guard metadata. Identical treatment to a direct write.", + "measured_at": "464308b", + "facts": { + "ShapeRefAliasGuard.Inner": { + "params": [ + { + "name": "p", + "line": 13 + } + ], + "body": [ + "if:None@16", + "then:release:p@18" + ] + }, + "ShapeRefAliasGuard.Caller": { + "params": null, + "body": [ + "acquire:r@24", + "release:r@25", + "release:r@26" + ] + } + }, + "verdict": { + "rust": [ + "OWN003:warning@24" + ], + "python": [ + "OWN003:warning@24" + ] + } +} diff --git a/corpus/p037-shapes/named-arguments-reordered/case.cs b/corpus/p037-shapes/named-arguments-reordered/case.cs new file mode 100644 index 00000000..3ba4c8c8 --- /dev/null +++ b/corpus/p037-shapes/named-arguments-reordered/case.cs @@ -0,0 +1,23 @@ +// The caller names its arguments OUT of declaration order. Today the extractor +// drops every named argument from a call's `args` (`a.NameColon is null`), +// which is defensible for a positional model and fatal for P-037: all four F3 +// fixtures pass their guard by name. a2 must RESOLVE a named argument to its +// declared parameter slot, never keep source order and hope. +using System.IO; + +static class ShapeNamedArgs +{ + static void Inner(Stream resource, bool flag) + { + if (!flag) + { + resource.Dispose(); + } + } + + static void Caller(string path) + { + var s = File.OpenRead(path); + Inner(flag: true, resource: s); + } +} diff --git a/corpus/p037-shapes/named-arguments-reordered/expected.json b/corpus/p037-shapes/named-arguments-reordered/expected.json new file mode 100644 index 00000000..4ef089f2 --- /dev/null +++ b/corpus/p037-shapes/named-arguments-reordered/expected.json @@ -0,0 +1,33 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "named-arguments-reordered", + "status": "pending_a2", + "why": "Today `Inner(flag: true, resource: s)` produces no `call` op at all (statement-level calls emit none), and even where a call IS emitted its `args` drops every named argument (`a.NameColon is null`). The comment there is right that keeping a named argument in SOURCE order would mis-align a positional mapping. The cure is to resolve it, not to discard it.", + "a2_contract": "a2 emits a `call` op here whose `arg_bindings` resolve BY DECLARED PARAMETER INDEX, so this reordered call and a positional `Inner(s, true)` produce the same bindings: param 0 -> {kind: var, name: s}, param 1 -> {kind: bool_const, value: true}. Source order is Roslyn's problem and stops being anyone else's. The legacy `args: string[]` field keeps its current contents and meaning — additive only, so the Python rollback reads an unchanged document.", + "measured_at": "464308b", + "facts": { + "ShapeNamedArgs.Inner": { + "params": [ + { + "name": "resource", + "line": 10 + } + ], + "body": [ + "if:None@12", + "then:release:resource@14" + ] + }, + "ShapeNamedArgs.Caller": { + "params": null, + "body": [ + "acquire:s@20", + "release:s@21" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/corpus/p037-shapes/return-disposable-parameter/case.cs b/corpus/p037-shapes/return-disposable-parameter/case.cs new file mode 100644 index 00000000..f474ccb0 --- /dev/null +++ b/corpus/p037-shapes/return-disposable-parameter/case.cs @@ -0,0 +1,27 @@ +// A1.1-a1 REGRESSION ANCHOR. `Echo` returns its own disposable PARAMETER. +// +// This is the shape that turned six CI jobs red when a1 first put owned +// parameters into the lowering set: `return s` became a fresh-factory return, +// and the core read a fresh return of something it never saw acquired as an +// escaping borrow -> [OWN004] 'parg_N' is a borrow and cannot be returned. +// +// The resource belongs to the CALLER and outlives the call. What the return +// really is, is an ALIAS of the parameter, and OwnIR cannot say that: +// `aliasOf`/`aliased` are reserved in the schema and never emitted. So the +// frontend claims NO owned return here rather than asserting a false kind. +using System.IO; + +static class ShapeReturnParam +{ + static Stream Echo(Stream s) + { + return s; + } + + static void Use(string path) + { + var owned = File.OpenRead(path); + var same = Echo(owned); + same.Dispose(); + } +} diff --git a/corpus/p037-shapes/return-disposable-parameter/expected.json b/corpus/p037-shapes/return-disposable-parameter/expected.json new file mode 100644 index 00000000..089658ed --- /dev/null +++ b/corpus/p037-shapes/return-disposable-parameter/expected.json @@ -0,0 +1,32 @@ +{ + "schema": "p037-fact-shape/1", + "shape": "return-disposable-parameter", + "status": "anchored", + "why": "A1.1-a1 REGRESSION ANCHOR. Putting owned parameters into the lowering set made `return s` lower as a fresh-factory return, and the core read a fresh return of something it never saw acquired as an escaping borrow: [OWN004] 'parg_N' is a borrow and cannot be returned. Six CI jobs, and the 137-file verdict corpus never saw it, because no corpus case returns its own disposable parameter. The recorded facts pin the fix: Echo's `return` carries var=None. What the return really is, is an ALIAS of the parameter; OwnIR reserves `aliasOf`/`aliased` and has never emitted them, so the frontend claims no owned return rather than asserting a false kind. If this record ever shows `return:s`, the alias gap has been filled by accident instead of on purpose.", + "measured_at": "464308b", + "facts": { + "ShapeReturnParam.Echo": { + "params": [ + { + "name": "s", + "line": 16 + } + ], + "body": [ + "use:s@18", + "return:None@18" + ] + }, + "ShapeReturnParam.Use": { + "params": null, + "body": [ + "call:ShapeReturnParam.Echo@24[args=[]]", + "release:same@25" + ] + } + }, + "verdict": { + "rust": [], + "python": [] + } +} diff --git a/docs/evidence/p037-a1-after-python.json b/docs/evidence/p037-a1-after-python.json new file mode 100644 index 00000000..a0c086bd --- /dev/null +++ b/docs/evidence/p037-a1-after-python.json @@ -0,0 +1,1053 @@ +{ + "corpus": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "dirty": false, + "engine": "python", + "files": { + "corpus/di/singleton-captures-scoped-dbcontext/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/di/singleton-captures-scoped-dbcontext/before.cs": { + "exit": 0, + "findings": [ + { + "code": "DI001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/fixtures/systemevents-console/Program.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 43 + }, + { + "code": "OWN001", + "level": "warning", + "line": 54 + }, + { + "code": "OWN001", + "level": "warning", + "line": 77 + } + ] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 38 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 35 + } + ] + }, + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/arraypool-aliased-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-aliased-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/arraypool-double-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-double-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-field-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-field-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 46 + } + ] + }, + "corpus/real-world/arraypool-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 24 + }, + { + "code": "OWN025", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/arraypool-length-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-length-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/arraypool-memory-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-memory-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-span-view-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-span-view-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-use-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-use-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-view-into-field-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-view-into-field-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 41 + } + ] + }, + "corpus/real-world/field-dispose-via-exchange/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-exchange/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/real-world/field-dispose-via-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/field-noop-dispose-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-noop-dispose-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 9 + } + ] + }, + "corpus/real-world/local-dispose-via-using-statement/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/local-dispose-via-using-statement/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-double-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-double-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-owner-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-owner-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-statement-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-statement-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/ownership-handoff-consume/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-consume/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN002", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/real-world/ownership-handoff-use-transitive/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use-transitive/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/real-world/ownership-handoff-use/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 25 + }, + { + "code": "OWN001", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 12 + }, + { + "code": "OWN050", + "level": "note", + "line": 13 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 27 + } + ] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/subscription-self-owned-property/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/subscription-self-owned-property/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/tcplistener-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/using-statement-throw-releases/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/using-statement-throw-releases/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/custom-weak-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/custom-weak-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + }, + "corpus/wpf/field-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/field-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/handler-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/pooled-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/pooled-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 26 + }, + { + "code": "OWN050", + "level": "note", + "line": 27 + } + ] + }, + "corpus/wpf/subscription-disposing-else-branch-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-disposing-else-branch-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-explicit-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-explicit-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/subscription-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/wpf/subscription-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-param-guarded-unregister/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-param-guarded-unregister/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-target-typed-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-target-typed-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 14 + } + ] + }, + "corpus/wpf/subscription-teardown-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-teardown-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/wpf/subscription-uncalled-local-function/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-uncalled-local-function/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 42 + } + ] + }, + "corpus/wpf/subscription-xaml-name-only-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-xaml-name-only-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/wpf/systemevents-region-escape/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 15 + }, + { + "code": "OWN050", + "level": "note", + "line": 16 + } + ] + }, + "corpus/wpf/systemevents-region-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 26 + } + ] + }, + "corpus/wpf/timer-stop-disposing-else-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-disposing-else-branch/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/timer-stop-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/wpf/timer-stop-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/timer-stop-param-guarded/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-param-guarded/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-lambda/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-lambda/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-wrong-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-wrong-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 16 + } + ] + }, + "corpus/wpf/viewmodel-escapes-to-app/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/viewmodel-escapes-to-app/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 14 + } + ] + }, + "corpus/wpf/zombie-viewmodel/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/zombie-viewmodel/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + } + }, + "is_evidence": true, + "schema": "p037-verdict-snapshot/1", + "source_commit": "2de574a48ac819722788b6b303d17d19a60eab0f" +} diff --git a/docs/evidence/p037-a1-after-rust.json b/docs/evidence/p037-a1-after-rust.json new file mode 100644 index 00000000..f36cdfeb --- /dev/null +++ b/docs/evidence/p037-a1-after-rust.json @@ -0,0 +1,1053 @@ +{ + "corpus": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "dirty": false, + "engine": "rust", + "files": { + "corpus/di/singleton-captures-scoped-dbcontext/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/di/singleton-captures-scoped-dbcontext/before.cs": { + "exit": 0, + "findings": [ + { + "code": "DI001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/fixtures/systemevents-console/Program.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 43 + }, + { + "code": "OWN001", + "level": "warning", + "line": 54 + }, + { + "code": "OWN001", + "level": "warning", + "line": 77 + } + ] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 38 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 35 + } + ] + }, + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/arraypool-aliased-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-aliased-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/arraypool-double-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-double-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-field-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-field-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 46 + } + ] + }, + "corpus/real-world/arraypool-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 24 + }, + { + "code": "OWN025", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/arraypool-length-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-length-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/arraypool-memory-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-memory-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-span-view-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-span-view-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-use-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-use-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-view-into-field-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-view-into-field-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 41 + } + ] + }, + "corpus/real-world/field-dispose-via-exchange/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-exchange/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/real-world/field-dispose-via-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/field-noop-dispose-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-noop-dispose-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 9 + } + ] + }, + "corpus/real-world/local-dispose-via-using-statement/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/local-dispose-via-using-statement/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-double-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-double-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-owner-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-owner-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-statement-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-statement-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/ownership-handoff-consume/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-consume/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN002", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/real-world/ownership-handoff-use-transitive/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use-transitive/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/real-world/ownership-handoff-use/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 25 + }, + { + "code": "OWN001", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 12 + }, + { + "code": "OWN050", + "level": "note", + "line": 13 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 27 + } + ] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/subscription-self-owned-property/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/subscription-self-owned-property/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/tcplistener-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/using-statement-throw-releases/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/using-statement-throw-releases/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/custom-weak-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/custom-weak-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + }, + "corpus/wpf/field-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/field-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/handler-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/pooled-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/pooled-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 26 + }, + { + "code": "OWN050", + "level": "note", + "line": 27 + } + ] + }, + "corpus/wpf/subscription-disposing-else-branch-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-disposing-else-branch-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-explicit-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-explicit-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/subscription-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/wpf/subscription-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-param-guarded-unregister/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-param-guarded-unregister/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-target-typed-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-target-typed-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 14 + } + ] + }, + "corpus/wpf/subscription-teardown-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-teardown-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/wpf/subscription-uncalled-local-function/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-uncalled-local-function/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 42 + } + ] + }, + "corpus/wpf/subscription-xaml-name-only-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-xaml-name-only-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/wpf/systemevents-region-escape/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 15 + }, + { + "code": "OWN050", + "level": "note", + "line": 16 + } + ] + }, + "corpus/wpf/systemevents-region-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 26 + } + ] + }, + "corpus/wpf/timer-stop-disposing-else-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-disposing-else-branch/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/timer-stop-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/wpf/timer-stop-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/timer-stop-param-guarded/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-param-guarded/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-lambda/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-lambda/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-wrong-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-wrong-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 16 + } + ] + }, + "corpus/wpf/viewmodel-escapes-to-app/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/viewmodel-escapes-to-app/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 14 + } + ] + }, + "corpus/wpf/zombie-viewmodel/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/zombie-viewmodel/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + } + }, + "is_evidence": true, + "schema": "p037-verdict-snapshot/1", + "source_commit": "2de574a48ac819722788b6b303d17d19a60eab0f" +} diff --git a/docs/evidence/p037-a1-baseline-python.json b/docs/evidence/p037-a1-baseline-python.json new file mode 100644 index 00000000..163a28a8 --- /dev/null +++ b/docs/evidence/p037-a1-baseline-python.json @@ -0,0 +1,1053 @@ +{ + "corpus": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "dirty": false, + "engine": "python", + "files": { + "corpus/di/singleton-captures-scoped-dbcontext/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/di/singleton-captures-scoped-dbcontext/before.cs": { + "exit": 0, + "findings": [ + { + "code": "DI001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/fixtures/systemevents-console/Program.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 43 + }, + { + "code": "OWN001", + "level": "warning", + "line": 54 + }, + { + "code": "OWN001", + "level": "warning", + "line": 77 + } + ] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 38 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 35 + } + ] + }, + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/arraypool-aliased-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-aliased-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/arraypool-double-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-double-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-field-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-field-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 46 + } + ] + }, + "corpus/real-world/arraypool-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 24 + }, + { + "code": "OWN025", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/arraypool-length-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-length-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/arraypool-memory-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-memory-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-span-view-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-span-view-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-use-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-use-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-view-into-field-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-view-into-field-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 41 + } + ] + }, + "corpus/real-world/field-dispose-via-exchange/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-exchange/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/real-world/field-dispose-via-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/field-noop-dispose-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-noop-dispose-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 9 + } + ] + }, + "corpus/real-world/local-dispose-via-using-statement/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/local-dispose-via-using-statement/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-double-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-double-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-owner-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-owner-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-statement-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-statement-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/ownership-handoff-consume/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-consume/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN002", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/real-world/ownership-handoff-use-transitive/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use-transitive/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/real-world/ownership-handoff-use/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 25 + }, + { + "code": "OWN001", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 12 + }, + { + "code": "OWN050", + "level": "note", + "line": 13 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 27 + } + ] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/subscription-self-owned-property/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/subscription-self-owned-property/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/tcplistener-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/using-statement-throw-releases/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/using-statement-throw-releases/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/custom-weak-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/custom-weak-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + }, + "corpus/wpf/field-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/field-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/handler-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/pooled-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/pooled-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 26 + }, + { + "code": "OWN050", + "level": "note", + "line": 27 + } + ] + }, + "corpus/wpf/subscription-disposing-else-branch-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-disposing-else-branch-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-explicit-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-explicit-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/subscription-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/wpf/subscription-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-param-guarded-unregister/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-param-guarded-unregister/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-target-typed-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-target-typed-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 14 + } + ] + }, + "corpus/wpf/subscription-teardown-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-teardown-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/wpf/subscription-uncalled-local-function/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-uncalled-local-function/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 42 + } + ] + }, + "corpus/wpf/subscription-xaml-name-only-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-xaml-name-only-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/wpf/systemevents-region-escape/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 15 + }, + { + "code": "OWN050", + "level": "note", + "line": 16 + } + ] + }, + "corpus/wpf/systemevents-region-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 26 + } + ] + }, + "corpus/wpf/timer-stop-disposing-else-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-disposing-else-branch/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/timer-stop-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/wpf/timer-stop-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/timer-stop-param-guarded/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-param-guarded/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-lambda/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-lambda/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-wrong-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-wrong-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 16 + } + ] + }, + "corpus/wpf/viewmodel-escapes-to-app/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/viewmodel-escapes-to-app/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 14 + } + ] + }, + "corpus/wpf/zombie-viewmodel/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/zombie-viewmodel/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + } + }, + "is_evidence": true, + "schema": "p037-verdict-snapshot/1", + "source_commit": "17e72853b4ee2993f2c23b1244ffaccb8d73a84d" +} diff --git a/docs/evidence/p037-a1-baseline-rust.json b/docs/evidence/p037-a1-baseline-rust.json new file mode 100644 index 00000000..6eac685f --- /dev/null +++ b/docs/evidence/p037-a1-baseline-rust.json @@ -0,0 +1,1053 @@ +{ + "corpus": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "dirty": false, + "engine": "rust", + "files": { + "corpus/di/singleton-captures-scoped-dbcontext/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/di/singleton-captures-scoped-dbcontext/before.cs": { + "exit": 0, + "findings": [ + { + "code": "DI001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/fixtures/systemevents-console/Program.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 43 + }, + { + "code": "OWN001", + "level": "warning", + "line": 54 + }, + { + "code": "OWN001", + "level": "warning", + "line": 77 + } + ] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 38 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 35 + } + ] + }, + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/arraypool-aliased-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-aliased-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/arraypool-double-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-double-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-field-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-field-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 46 + } + ] + }, + "corpus/real-world/arraypool-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 24 + }, + { + "code": "OWN025", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/arraypool-length-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-length-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/arraypool-memory-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-memory-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-span-view-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-span-view-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-use-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-use-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-view-into-field-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-view-into-field-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 41 + } + ] + }, + "corpus/real-world/field-dispose-via-exchange/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-exchange/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/real-world/field-dispose-via-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/field-noop-dispose-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-noop-dispose-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 9 + } + ] + }, + "corpus/real-world/local-dispose-via-using-statement/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/local-dispose-via-using-statement/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-double-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-double-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-owner-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-owner-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-statement-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-statement-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/ownership-handoff-consume/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-consume/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN002", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/real-world/ownership-handoff-use-transitive/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use-transitive/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/real-world/ownership-handoff-use/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 25 + }, + { + "code": "OWN001", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 12 + }, + { + "code": "OWN050", + "level": "note", + "line": 13 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 27 + } + ] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/subscription-self-owned-property/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/subscription-self-owned-property/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/tcplistener-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/using-statement-throw-releases/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/using-statement-throw-releases/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/custom-weak-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/custom-weak-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + }, + "corpus/wpf/field-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/field-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/handler-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/pooled-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/pooled-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 26 + }, + { + "code": "OWN050", + "level": "note", + "line": 27 + } + ] + }, + "corpus/wpf/subscription-disposing-else-branch-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-disposing-else-branch-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-explicit-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-explicit-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/subscription-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/wpf/subscription-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-param-guarded-unregister/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-param-guarded-unregister/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-target-typed-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-target-typed-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 14 + } + ] + }, + "corpus/wpf/subscription-teardown-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-teardown-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/wpf/subscription-uncalled-local-function/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-uncalled-local-function/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 42 + } + ] + }, + "corpus/wpf/subscription-xaml-name-only-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-xaml-name-only-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/wpf/systemevents-region-escape/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 15 + }, + { + "code": "OWN050", + "level": "note", + "line": 16 + } + ] + }, + "corpus/wpf/systemevents-region-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 26 + } + ] + }, + "corpus/wpf/timer-stop-disposing-else-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-disposing-else-branch/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/timer-stop-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/wpf/timer-stop-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/timer-stop-param-guarded/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-param-guarded/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-lambda/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-lambda/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-wrong-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-wrong-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 16 + } + ] + }, + "corpus/wpf/viewmodel-escapes-to-app/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/viewmodel-escapes-to-app/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 14 + } + ] + }, + "corpus/wpf/zombie-viewmodel/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/zombie-viewmodel/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + } + }, + "is_evidence": true, + "schema": "p037-verdict-snapshot/1", + "source_commit": "17e72853b4ee2993f2c23b1244ffaccb8d73a84d" +} diff --git a/docs/evidence/p037-a2-baseline-manifest.md b/docs/evidence/p037-a2-baseline-manifest.md new file mode 100644 index 00000000..f248ffa2 --- /dev/null +++ b/docs/evidence/p037-a2-baseline-manifest.md @@ -0,0 +1,33 @@ +# P-037 A2 baseline manifest + +Terminal-green SHA T: `4a8e6582e10222403cd40adc9e95db7e0228a1c2` + +Four sequential baseline snapshots taken at T in measurement environment +`P037_A2_MEASUREMENT_M1`, each independently `verify`d against T before the +next was taken. + +| artifact | sha256 | +|---|---| +| p037-a2-baseline-mos-repo.json | `bd07e87fee7c5d9607acd3c267fec39424dee1e51662a7bba1e4949c7c5837dd` | +| p037-a2-baseline-mos-corpus.json | `49f788f961b46f7884cde5bb06e2d35525e8ce27731d98bb5588dc550478db0b` | +| p037-a2-baseline-verdict-python.json | `04c2fd6c75493bf90e36ac0c6c8acfbf7e692ab9a20a9d3a5591eb9be5be2d36` | +| p037-a2-baseline-verdict-rust.json | `b9271bf7c4de111d5632a544f8d6d0710a6612aa36f682ea3a2b29dda71ac78e` | + +Execution profile (identical across all four takes, and identical before vs. +after the whole sequence): + +- Python: CPython 3.11.15 (main, Sep 19 2026, 00:18:08) [GCC 16.1.1 20260625] +- .NET SDK: 8.0.425, runtimes: Microsoft.AspNetCore.App 8.0.31, Microsoft.NETCore.App 8.0.31 +- Rust: rustc 1.94.1 (e408947bf 2026-03-25), cargo 1.94.1 (29ea6fb6a 2026-03-24), host x86_64-unknown-linux-gnu +- Platform: Linux / x86_64 + +Measurement environment identity: `P037_A2_MEASUREMENT_M1`, provisioned as an +isolated toolchain directory (no container runtime available on the VPS); +provisioning recipe `recipe/provision.sh` sha256 +`18fcc8f20f4032e73813a2f215f9d7440d2a7f83e4325b818df576f4ee3ad0be`, retained +outside this repository. + +Taken: 2026-09-19 (UTC), operator run. + +This commit is evidence-only: it adds files under `docs/evidence/` and +nothing else. No instrument, treatment, spec, or CI file is touched. diff --git a/docs/evidence/p037-a2-baseline-mos-corpus.json b/docs/evidence/p037-a2-baseline-mos-corpus.json new file mode 100644 index 00000000..6b6b1af5 --- /dev/null +++ b/docs/evidence/p037-a2-baseline-mos-corpus.json @@ -0,0 +1,7447 @@ +{ + "analysis_manifest": [ + { + "blob": "38d180096c63c7d01d7bb39601c1f88e3a53f67e", + "path": "corpus/di/singleton-captures-scoped-dbcontext/after.cs" + }, + { + "blob": "4d6f60e065d7e2572bc457e3df6a593b6a4699c4", + "path": "corpus/di/singleton-captures-scoped-dbcontext/before.cs" + }, + { + "blob": "67c4aa0b15fa0782d865cbd1c5ef355fbc926f8f", + "path": "corpus/fixtures/systemevents-console/Program.cs" + }, + { + "blob": "c9d140949acfe06bd187404508a46b6b61a7c89e", + "path": "corpus/p036-bakeoff/guarded-consume-early-return/after.cs" + }, + { + "blob": "c80dee0bc66037c3c4ae7ff8ce8125ba145f8156", + "path": "corpus/p036-bakeoff/guarded-consume-early-return/before.cs" + }, + { + "blob": "b13ab3891e11f2281754d5c5664fc92bc97710c5", + "path": "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs" + }, + { + "blob": "482151f9ed085819fc82bbe85df003beec21ed02", + "path": "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs" + }, + { + "blob": "b60e95a076611d3661fef95091f041ba228d546e", + "path": "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs" + }, + { + "blob": "b93a52759704651ccb7d09d946c0900c8ab46e54", + "path": "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs" + }, + { + "blob": "48b0accda29b02366d4f652b5c05c2ee7956f6d2", + "path": "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs" + }, + { + "blob": "77cc02f8920b8ac424dd0854d2a1ec188329a01b", + "path": "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs" + }, + { + "blob": "0d862db009407131da16a23b1cc255d3155a64b2", + "path": "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs" + }, + { + "blob": "28a89ec5ee3eb48673ec895f3bd0f8404ec29e99", + "path": "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs" + }, + { + "blob": "faf7be2c04decc1a966a5870e0641ec47d72da5c", + "path": "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs" + }, + { + "blob": "87f06ebe8d6842ec1011a0c8e935c92fd47ee714", + "path": "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs" + }, + { + "blob": "1faa3a7b8fa19ae08128e1b1f30d6dfae1e9f534", + "path": "corpus/real-world/ado-executereader-leak/after.cs" + }, + { + "blob": "d69020eceb2c3619ce3d2f6f36715d97aad5b616", + "path": "corpus/real-world/ado-executereader-leak/before.cs" + }, + { + "blob": "d36d794ecd78e95a99964ecd5ff4e66cc1352e43", + "path": "corpus/real-world/arraypool-aliased-receiver/after.cs" + }, + { + "blob": "3ee0cbfd662aec91a0c437ade04ef9f5a885280a", + "path": "corpus/real-world/arraypool-aliased-receiver/before.cs" + }, + { + "blob": "9c319b50c8147b72a07f2c4c643c936d9849e35c", + "path": "corpus/real-world/arraypool-double-return/after.cs" + }, + { + "blob": "9dc6c22a359a922ea104e2babd1f6c3cb18c55aa", + "path": "corpus/real-world/arraypool-double-return/before.cs" + }, + { + "blob": "fa9fce58d4d9f62a37ab0cd5b88b49627b6e2553", + "path": "corpus/real-world/arraypool-field-fullspan-overread/after.cs" + }, + { + "blob": "768af16266ec428afdb343185a654138d1d04d71", + "path": "corpus/real-world/arraypool-field-fullspan-overread/before.cs" + }, + { + "blob": "3c45a05482eae50f6c68f806e80e1bd030f30151", + "path": "corpus/real-world/arraypool-fullspan-overread/after.cs" + }, + { + "blob": "991b898ca1f564320ee3f5b9eba69e56b5607f6d", + "path": "corpus/real-world/arraypool-fullspan-overread/before.cs" + }, + { + "blob": "8f1c0de961065338fa611e1ac2b3e93099d1a390", + "path": "corpus/real-world/arraypool-length-overread/after.cs" + }, + { + "blob": "0c7d64c1159b4041118b674a912a7f5533e8a301", + "path": "corpus/real-world/arraypool-length-overread/before.cs" + }, + { + "blob": "8c8794e57d810cd542d90c12cea06ff1c034a0fc", + "path": "corpus/real-world/arraypool-memory-view-escape/after.cs" + }, + { + "blob": "7a29e26ef81bc82f98b5c19f626ead25de43986e", + "path": "corpus/real-world/arraypool-memory-view-escape/before.cs" + }, + { + "blob": "debff6f8435c5f396cd1b00d9c12cf09102d13f9", + "path": "corpus/real-world/arraypool-span-view-after-return/after.cs" + }, + { + "blob": "818d3c8cba0b5dbcc9cec5993322d2e04c840f17", + "path": "corpus/real-world/arraypool-span-view-after-return/before.cs" + }, + { + "blob": "708735216525a12901b06cce249aa65f37b5da6b", + "path": "corpus/real-world/arraypool-use-after-return/after.cs" + }, + { + "blob": "0506cd9adcf09ac17e98c56d713d33b516a791af", + "path": "corpus/real-world/arraypool-use-after-return/before.cs" + }, + { + "blob": "6ec2e76f1070f5a1fa3942e11f7e5e5009fe7a03", + "path": "corpus/real-world/arraypool-view-into-field-overread/after.cs" + }, + { + "blob": "5c72fc7284fec7a262a66a499e3197cc663771ac", + "path": "corpus/real-world/arraypool-view-into-field-overread/before.cs" + }, + { + "blob": "02e54d36919c8d03bce56321faa1f7efabb981f9", + "path": "corpus/real-world/field-dispose-via-exchange/after.cs" + }, + { + "blob": "b532135df2f7946e70829834444059b840a168f5", + "path": "corpus/real-world/field-dispose-via-exchange/before.cs" + }, + { + "blob": "c9b071d49cbddd567a108425de4cd7803886b1c6", + "path": "corpus/real-world/field-dispose-via-helper/after.cs" + }, + { + "blob": "7d232b848ef85fbb55deafaff024084a857d7edd", + "path": "corpus/real-world/field-dispose-via-helper/before.cs" + }, + { + "blob": "a07539757bc6bf6ae24766092f56f72ca7bf3010", + "path": "corpus/real-world/field-noop-dispose-wrapper/after.cs" + }, + { + "blob": "8fd5c820e25bab6682f5b02e43b562d2305410a3", + "path": "corpus/real-world/field-noop-dispose-wrapper/before.cs" + }, + { + "blob": "135a360400f5da99bcf6ba5a2efcd1413833e868", + "path": "corpus/real-world/local-dispose-via-using-statement/after.cs" + }, + { + "blob": "5c93e81a1c4bc7b43fd9493a73d2227926d6c069", + "path": "corpus/real-world/local-dispose-via-using-statement/before.cs" + }, + { + "blob": "c7d52d6ead47c013d221e5a3406b98044ced70a2", + "path": "corpus/real-world/memorypool-double-dispose/after.cs" + }, + { + "blob": "b0a3acd9dced8ea7f2bb4702e92984e2be53f931", + "path": "corpus/real-world/memorypool-double-dispose/before.cs" + }, + { + "blob": "51f5e21473f3831892c82e8b35277dc91108bdcf", + "path": "corpus/real-world/memorypool-using-owner-escape/after.cs" + }, + { + "blob": "bfc1b768c48074d67f7da744a2cfd1e58b77be06", + "path": "corpus/real-world/memorypool-using-owner-escape/before.cs" + }, + { + "blob": "2466da9d86248686070994b434beca526c51fe06", + "path": "corpus/real-world/memorypool-using-statement-view-escape/after.cs" + }, + { + "blob": "afc9ea74b3e8c407c06d7a797ba3673a926f5c3c", + "path": "corpus/real-world/memorypool-using-statement-view-escape/before.cs" + }, + { + "blob": "499ce51f09325341ddbbb8236944fa9bc2158eac", + "path": "corpus/real-world/memorypool-using-view-escape/after.cs" + }, + { + "blob": "45437c15fa6ec4e2b5f28f16cfc41155866f00ae", + "path": "corpus/real-world/memorypool-using-view-escape/before.cs" + }, + { + "blob": "7327ffa1666b4ba534fbb9a3f0d5f9d4a9e1b628", + "path": "corpus/real-world/memorypool-view-after-dispose/after.cs" + }, + { + "blob": "072dfa923df7e919913fc69e0d676e5ce2ebafa5", + "path": "corpus/real-world/memorypool-view-after-dispose/before.cs" + }, + { + "blob": "78eb173af727d40d4477ebb313cfcbf5291068c2", + "path": "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs" + }, + { + "blob": "a4deffc410b2dedfc5edb61cec3ef6f1777d0adf", + "path": "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs" + }, + { + "blob": "f2a81599a30d95c539b3918aeef3d4213e50c721", + "path": "corpus/real-world/ownership-handoff-consume/after.cs" + }, + { + "blob": "d65ba7b9424e36eb2c5e7e8fc7b390bdb2f6bfff", + "path": "corpus/real-world/ownership-handoff-consume/before.cs" + }, + { + "blob": "91134e9bd2cc709b0174e20c31e43b76b297df66", + "path": "corpus/real-world/ownership-handoff-use-transitive/after.cs" + }, + { + "blob": "2ed2ca15dfdea27d0f1a072d3b569eea7596b0b1", + "path": "corpus/real-world/ownership-handoff-use-transitive/before.cs" + }, + { + "blob": "8aacb78586d8441ea060a6fcac1590bb7c4e824e", + "path": "corpus/real-world/ownership-handoff-use/after.cs" + }, + { + "blob": "e4a61bf6023f4e32f54a1c4887e26c844f757f42", + "path": "corpus/real-world/ownership-handoff-use/before.cs" + }, + { + "blob": "a4f71bc85fc6219e309a7ffb2fe4659c7ba647cd", + "path": "corpus/real-world/pool-transfer-via-wrapper-local/after.cs" + }, + { + "blob": "004dfda6385ff8697c8c16aeb844bcfb46ca9a2a", + "path": "corpus/real-world/pool-transfer-via-wrapper-local/before.cs" + }, + { + "blob": "48fea235d362012f5482abbe598a69ba513f598a", + "path": "corpus/real-world/screentogif-loaded-subscription/after.cs" + }, + { + "blob": "f531ea536868381417fef0d8392bf956802ea194", + "path": "corpus/real-world/screentogif-loaded-subscription/before.cs" + }, + { + "blob": "f353a95c721347d12317acd7ea4b089495c9ec1a", + "path": "corpus/real-world/screentogif-systemevents-leak/after.cs" + }, + { + "blob": "f531e57e99f32029d1ae7b3df183c2785ef85714", + "path": "corpus/real-world/screentogif-systemevents-leak/before.cs" + }, + { + "blob": "671e8c665df0f4a951fd14002b056355b37019ea", + "path": "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs" + }, + { + "blob": "09dbfd123416af89eff3f8e301ec300f184a2d8d", + "path": "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs" + }, + { + "blob": "37eabf992f0e083364d20160a1ddf0c82c28b768", + "path": "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs" + }, + { + "blob": "2355f37e9fc8fc6b63e5023a2a2a18265b16d669", + "path": "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs" + }, + { + "blob": "74a99ffd338ef3cbf853cf2804c3a3ece8ed42a7", + "path": "corpus/real-world/socket-accept-leak/after.cs" + }, + { + "blob": "18a721ce6d07b7eed6cf97afef578d97e7ba2744", + "path": "corpus/real-world/socket-accept-leak/before.cs" + }, + { + "blob": "3be8156197c7e76fe60eee06028c65fe03407254", + "path": "corpus/real-world/subscription-self-owned-property/after.cs" + }, + { + "blob": "53ec5ba89ca9eb3791bcc7c2489c5884dd0acad7", + "path": "corpus/real-world/subscription-self-owned-property/before.cs" + }, + { + "blob": "601976e5600d97d6184fe5dc44b957c985a97115", + "path": "corpus/real-world/tcplistener-accept-leak/after.cs" + }, + { + "blob": "ab88672d4e90e99b7a8fb2a061d533a5a5ef0072", + "path": "corpus/real-world/tcplistener-accept-leak/before.cs" + }, + { + "blob": "dce3d96a463068f59288176541d5c75befa570b8", + "path": "corpus/real-world/tcplistener-acceptsocket-leak/after.cs" + }, + { + "blob": "6ae9c4c8faef9559b9ac4de4da1ba03c4acada5e", + "path": "corpus/real-world/tcplistener-acceptsocket-leak/before.cs" + }, + { + "blob": "b54a2b87b1f584a9a857c5f311d5874099910643", + "path": "corpus/real-world/using-statement-throw-releases/after.cs" + }, + { + "blob": "acc415ddf95c058de642d3a13e39226570ebf6e0", + "path": "corpus/real-world/using-statement-throw-releases/before.cs" + }, + { + "blob": "ef464e6cf0f0bb0c9d3941fa0fce881b78011bcb", + "path": "corpus/wpf/custom-weak-wrapper/after.cs" + }, + { + "blob": "d255613e1dbf311f93c34cbabc1ae304b648ea2b", + "path": "corpus/wpf/custom-weak-wrapper/before.cs" + }, + { + "blob": "30697c7b21435ea03352b9f1826938c88a60d3d9", + "path": "corpus/wpf/field-use-after-dispose/after.cs" + }, + { + "blob": "79fdb97a6375c5b1b6df5be6967bd22c738e9cce", + "path": "corpus/wpf/field-use-after-dispose/before.cs" + }, + { + "blob": "242fec8ebaf85ea83df4a0a27c9f1e6cac80a9b8", + "path": "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs" + }, + { + "blob": "445968e5bc0d6bb77950196774b5f645c6d56459", + "path": "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs" + }, + { + "blob": "2aaf3b53fba9dd98a72cbe7c2caed65cf89262fd", + "path": "corpus/wpf/handler-use-after-dispose/after.cs" + }, + { + "blob": "68e25c6b763c122df627b3e7847f548524db9d21", + "path": "corpus/wpf/handler-use-after-dispose/before.cs" + }, + { + "blob": "b62ced3b658f10929e98d5fca7c65401b4fc0aea", + "path": "corpus/wpf/pooled-view-after-dispose/after.cs" + }, + { + "blob": "4731249cfee1b47a750fbc11ac66b598b17453ae", + "path": "corpus/wpf/pooled-view-after-dispose/before.cs" + }, + { + "blob": "9b093f5e39f7087333b7f8f2c89a4b155e078edd", + "path": "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs" + }, + { + "blob": "e7d5904e1c32d78a267309faf6717be59a374aec", + "path": "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs" + }, + { + "blob": "cb3ed69a917c9516ddcafa5c7c55cc8467739fe5", + "path": "corpus/wpf/subscription-disposing-else-branch-release/after.cs" + }, + { + "blob": "d0e1dc7929300bc60f4349a7e0df29ca87d018ce", + "path": "corpus/wpf/subscription-disposing-else-branch-release/before.cs" + }, + { + "blob": "bae861a35a441a2fc7714d9904883bd576182ed4", + "path": "corpus/wpf/subscription-explicit-delegate-release/after.cs" + }, + { + "blob": "e86bb4d5ff49116c6fd49c045b7d4f5136add534", + "path": "corpus/wpf/subscription-explicit-delegate-release/before.cs" + }, + { + "blob": "8299b26e3d1d9ec7c15673ba148199aafac6c6ef", + "path": "corpus/wpf/subscription-finalizer-release/after.cs" + }, + { + "blob": "3d03e2c90b8c8cacd68ef93cf44587f3d299288d", + "path": "corpus/wpf/subscription-finalizer-release/before.cs" + }, + { + "blob": "622e8cd997b9d2acf731c3b415166568339adf3a", + "path": "corpus/wpf/subscription-nonteardown-release/after.cs" + }, + { + "blob": "54f7969790b8daa82b498f795e1341e63fc1dd89", + "path": "corpus/wpf/subscription-nonteardown-release/before.cs" + }, + { + "blob": "934577f5c5c294d77029d816908b69f276c6583c", + "path": "corpus/wpf/subscription-overload-conflated-cleanup/after.cs" + }, + { + "blob": "1a0462ebd958a6e7d1a23dae2b8c99a1fdf48700", + "path": "corpus/wpf/subscription-overload-conflated-cleanup/before.cs" + }, + { + "blob": "b1b9faf7f5ce931bc89316e239ec03b482cc6700", + "path": "corpus/wpf/subscription-param-guarded-unregister/after.cs" + }, + { + "blob": "015343c46671afe384fd1a60d38c107426a01420", + "path": "corpus/wpf/subscription-param-guarded-unregister/before.cs" + }, + { + "blob": "f57d5340e25a55538de23892e29c1718d3042e8f", + "path": "corpus/wpf/subscription-target-typed-delegate-release/after.cs" + }, + { + "blob": "b6ada87556cf82ab68f6c58afdfec9d85daa93ef", + "path": "corpus/wpf/subscription-target-typed-delegate-release/before.cs" + }, + { + "blob": "0cab64b233266ef06e6988f27326eded395271e3", + "path": "corpus/wpf/subscription-teardown-early-return-guard/after.cs" + }, + { + "blob": "85d32821de0a02990a5e1abf87eccc986bac6b93", + "path": "corpus/wpf/subscription-teardown-early-return-guard/before.cs" + }, + { + "blob": "23bd620a57b1a68d0cf6569125817caf3fb47efc", + "path": "corpus/wpf/subscription-uncalled-local-function/after.cs" + }, + { + "blob": "2e129b6bb1e183443a073bf083a3a04b844d9a98", + "path": "corpus/wpf/subscription-uncalled-local-function/before.cs" + }, + { + "blob": "292c674a95a34ddff1f9eace96bbd316dabafff5", + "path": "corpus/wpf/subscription-xaml-name-only-release/after.cs" + }, + { + "blob": "59c8548878d13a026de9ddc65534b38ae94f8864", + "path": "corpus/wpf/subscription-xaml-name-only-release/before.cs" + }, + { + "blob": "3062b7e371fb709c622ef5ac918f4682df990b3b", + "path": "corpus/wpf/systemevents-region-escape/after.cs" + }, + { + "blob": "5a89237790ae5b12d64a680288196c6ead8c6662", + "path": "corpus/wpf/systemevents-region-escape/before.cs" + }, + { + "blob": "4ab388af8e8ea1b1faaf154f0f878db498fce704", + "path": "corpus/wpf/timer-stop-disposing-else-branch/after.cs" + }, + { + "blob": "5c1a7e991a861b316bf08869ef425583d26da556", + "path": "corpus/wpf/timer-stop-disposing-else-branch/before.cs" + }, + { + "blob": "a8a4d710a2f06c25e43a106c1410800369696d74", + "path": "corpus/wpf/timer-stop-early-return-guard/after.cs" + }, + { + "blob": "2e8e5e241d7980c65a70857fa128400c23331fed", + "path": "corpus/wpf/timer-stop-early-return-guard/before.cs" + }, + { + "blob": "743a4fab56737068377dbc553a030cc87273a465", + "path": "corpus/wpf/timer-stop-finalizer-release/after.cs" + }, + { + "blob": "973df1396ee32098c045e55dff973b979f13c1fc", + "path": "corpus/wpf/timer-stop-finalizer-release/before.cs" + }, + { + "blob": "d8e77d9849476e5491b4dcc19a9e53e48ff39795", + "path": "corpus/wpf/timer-stop-nonteardown-release/after.cs" + }, + { + "blob": "a2b1699fa2ce74a8bfab34c8d63a2374a9696723", + "path": "corpus/wpf/timer-stop-nonteardown-release/before.cs" + }, + { + "blob": "d59b693ecf990fd43d60a1051544f40e1ad2c818", + "path": "corpus/wpf/timer-stop-param-guarded/after.cs" + }, + { + "blob": "012854a1e19f04133dc78ecbbd14a1cef8044622", + "path": "corpus/wpf/timer-stop-param-guarded/before.cs" + }, + { + "blob": "e76351d486fd80e1037a4bca2ab9783c7ae4c1fd", + "path": "corpus/wpf/timer-stop-uncalled-helper/after.cs" + }, + { + "blob": "42a743ff9743fd38551eaf687b0a96ac874f0eb8", + "path": "corpus/wpf/timer-stop-uncalled-helper/before.cs" + }, + { + "blob": "0a65c2215f03fc979d71d4f91458043e2b02a143", + "path": "corpus/wpf/timer-stop-uncalled-lambda/after.cs" + }, + { + "blob": "3c29d5f0fe3f49b79244fd482e18bc9a39b1bb52", + "path": "corpus/wpf/timer-stop-uncalled-lambda/before.cs" + }, + { + "blob": "39bef7650422dfbac6319adbf0a82a99105a9ee6", + "path": "corpus/wpf/timer-stop-unwired-lifecycle/after.cs" + }, + { + "blob": "0d5062f2477f382150b32b286aa8726e51170200", + "path": "corpus/wpf/timer-stop-unwired-lifecycle/before.cs" + }, + { + "blob": "b2b6b657b0da7947086911cd2833278e1ca926c2", + "path": "corpus/wpf/timer-stop-wrong-receiver/after.cs" + }, + { + "blob": "d781717509873e414e92801419decddb32e0f826", + "path": "corpus/wpf/timer-stop-wrong-receiver/before.cs" + }, + { + "blob": "82f57d8b91534fd08c54f1b1f0857c3f8c76d46e", + "path": "corpus/wpf/viewmodel-escapes-to-app/after.cs" + }, + { + "blob": "ae52b324a6e428015fc5974bd11d60f8bfe3e4d0", + "path": "corpus/wpf/viewmodel-escapes-to-app/before.cs" + }, + { + "blob": "1f96bb7c57b978ff329761ca730a7d975b39fba9", + "path": "corpus/wpf/zombie-viewmodel/after.cs" + }, + { + "blob": "e9e4d0700a5abff8114dbe619993069b05bd6fc2", + "path": "corpus/wpf/zombie-viewmodel/before.cs" + } + ], + "analysis_manifest_sha256": "97ea59f4b4e7409597cdc00bf0e7d6496397b5c24f8c7785a063c507a23d5397", + "artifacts": { + "own-shadow-engine": { + "binary": "own-shadow-engine", + "bytes": 1819088, + "cargo": "cargo 1.94.1 (29ea6fb6a 2026-03-24)", + "cargo_argv": [ + "cargo", + "build", + "--locked", + "--release", + "--message-format=json", + "-p", + "own-shadow", + "--bin", + "own-shadow-engine" + ], + "cargo_clean_argv": [ + "cargo", + "clean", + "--release", + "-p", + "own-shadow" + ], + "cargo_lock_blob": "d8adbb1dc4d90da0c80aa1a2d8ba85bef805620f", + "cargo_lock_sha256": "17553420691d96febcfac54bd8f530b4f9e2a1ad7c79e6aaa022510e56692f45", + "dirty": false, + "executable": "/home/tandem/cargo-target/release/own-shadow-engine", + "executed": { + "bytes": 1819088, + "post_run_intact": true, + "sealed_path": "/home/tandem/owen-p037-a2/tmp/p037-take-a18q4mzn/own-shadow-engine", + "sha256": "21a311088337be0875d8803a51ce1be726bba5a5efe672359ed9dfdb8511e210" + }, + "host": "x86_64-unknown-linux-gnu", + "package": "own-shadow", + "profile": "release", + "rebuilt_by_this_call": true, + "repo_path": null, + "rustc": "rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8", + "sha256": "21a311088337be0875d8803a51ce1be726bba5a5efe672359ed9dfdb8511e210", + "source_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2" + } + }, + "dirty": false, + "documents": { + "corpus/di/singleton-captures-scoped-dbcontext/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1536, + "digest": "85c82a5fa0ac836f0b0e1f8455dc8c7cf61a2c85bed3cbdefea2dfa91823428d" + }, + "inputs": [ + "corpus/di/singleton-captures-scoped-dbcontext/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/di/singleton-captures-scoped-dbcontext/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1532, + "digest": "345a702c503995c1d8b8dba4e4cfebf0b5bc707e12474267f5bc24c86be75616" + }, + "inputs": [ + "corpus/di/singleton-captures-scoped-dbcontext/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/fixtures/systemevents-console/Program.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 2682, + "digest": "e543c101d7dacc8b396034c85e3bdc15b41c3fbea6ca671f9f7f939c7b1db31a" + }, + "inputs": [ + "corpus/fixtures/systemevents-console/Program.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/fixtures/systemevents-console/Program.cs", + "line": 0, + "method": "SystemEventsLeak.Program.DisposeOnThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/fixtures/systemevents-console/Program.cs", + "line": 0, + "method": "SystemEventsLeak.Program.LeakAFile", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/fixtures/systemevents-console/Program.cs", + "line": 0, + "method": "SystemEventsLeak.Program.LeakInTry", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/fixtures/systemevents-console/Program.cs", + "line": 0, + "method": "SystemEventsLeak.Program.DisposeOnThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/fixtures/systemevents-console/Program.cs", + "line": 0, + "method": "SystemEventsLeak.Program.LeakAFile", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/fixtures/systemevents-console/Program.cs", + "line": 0, + "method": "SystemEventsLeak.Program.LeakInTry", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1495, + "digest": "f9747cea4480366326f71a0231dcff88a1fbaae1f383ade82d127333df8754ca" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/after.cs", + "line": 0, + "method": "GuardedEarlyReturn.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/after.cs", + "line": 0, + "method": "GuardedEarlyReturn.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/after.cs", + "line": 0, + "method": "GuardedEarlyReturn.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/after.cs", + "line": 0, + "method": "GuardedEarlyReturn.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1497, + "digest": "0ddbb73eae96f747632f248c7f06b96bd9ba2d7db06d74a08504739dbec57813" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/before.cs", + "line": 0, + "method": "GuardedEarlyReturn.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/before.cs", + "line": 0, + "method": "GuardedEarlyReturn.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/before.cs", + "line": 0, + "method": "GuardedEarlyReturn.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-early-return/before.cs", + "line": 0, + "method": "GuardedEarlyReturn.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1380, + "digest": "930c719d7fa8e6a8dd74b207a269b5855c5c66473b6377f5a22d8126549144b4" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs", + "line": 0, + "method": "Guarded.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs", + "line": 0, + "method": "Guarded.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs", + "line": 0, + "method": "Guarded.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs", + "line": 0, + "method": "Guarded.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1383, + "digest": "8114180299988a0884f98567e15ead042389aecc3ebca2049e386c1bccbab945" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs", + "line": 0, + "method": "Guarded.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs", + "line": 0, + "method": "Guarded.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs", + "line": 0, + "method": "Guarded.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs", + "line": 0, + "method": "Guarded.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1865, + "digest": "3d0d7ab6b6eb7f5f7b03f5f609dbb5d92905722a0155342cbf0c06666fb5157f" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs", + "line": 0, + "method": "GuardedNegation.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs", + "line": 0, + "method": "GuardedNegation.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs", + "line": 0, + "method": "GuardedNegation.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs", + "line": 0, + "method": "GuardedNegation.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs", + "line": 0, + "method": "GuardedNegation.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs", + "line": 0, + "method": "GuardedNegation.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1868, + "digest": "65212107fe795526f040aff449cd48e26414c6aee81f791d8f291bf433a4e732" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs", + "line": 0, + "method": "GuardedNegation.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs", + "line": 0, + "method": "GuardedNegation.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs", + "line": 0, + "method": "GuardedNegation.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs", + "line": 0, + "method": "GuardedNegation.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs", + "line": 0, + "method": "GuardedNegation.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs", + "line": 0, + "method": "GuardedNegation.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1859, + "digest": "ddcc9ff099602885488f31da9b80c48e7e806760eb5da969a6574e934d03cd43" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs", + "line": 0, + "method": "GuardedWrapper.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs", + "line": 0, + "method": "GuardedWrapper.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs", + "line": 0, + "method": "GuardedWrapper.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs", + "line": 0, + "method": "GuardedWrapper.Fine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs", + "line": 0, + "method": "GuardedWrapper.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs", + "line": 0, + "method": "GuardedWrapper.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1862, + "digest": "b48f9f32d156bf63799e5689a0eec7c2e6d4242ebdf86c4a559967ba4a6e422c" + }, + "inputs": [ + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs", + "line": 0, + "method": "GuardedWrapper.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs", + "line": 0, + "method": "GuardedWrapper.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs", + "line": 0, + "method": "GuardedWrapper.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs", + "line": 0, + "method": "GuardedWrapper.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs", + "line": 0, + "method": "GuardedWrapper.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs", + "line": 0, + "method": "GuardedWrapper.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1731, + "digest": "dffa8d8ecb4def63e9a65660bbcdd7588ba7332cc86ac854d075144213953558" + }, + "inputs": [ + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs", + "line": 0, + "method": "Guarded.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "q", + "transfer": "may" + }, + { + "disposable": true, + "index": 1, + "name": "r", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [ + { + "disposable": true, + "index": 0, + "name": "other", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs", + "line": 0, + "method": "Guarded.Close", + "params": [ + { + "disposable": true, + "index": 0, + "name": "q", + "transfer": "may" + }, + { + "disposable": true, + "index": 1, + "name": "r", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [ + { + "disposable": true, + "index": 0, + "name": "other", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1787, + "digest": "2bf9baf40ab708160223bb97a78b3be2859469b3ff5717cd40fb055c01e0ed99" + }, + "inputs": [ + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs", + "line": 0, + "method": "Guarded.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs", + "line": 0, + "method": "Guarded.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs", + "line": 0, + "method": "Guarded.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs", + "line": 0, + "method": "Guarded.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1793, + "digest": "378ddf97813e8227630d903672f2162df555dadeda6a19ebf9aa098fc5fc932f" + }, + "inputs": [ + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs", + "line": 0, + "method": "Guarded.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs", + "line": 0, + "method": "Guarded.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs", + "line": 0, + "method": "Guarded.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs", + "line": 0, + "method": "Guarded.Outer", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1428, + "digest": "fdab7cdb68f6a5c8fcf51d4bd474b75305214bd8833932557c83fef0e6ede79d" + }, + "inputs": [ + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs", + "line": 0, + "method": "Guarded.M", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs", + "line": 0, + "method": "Guarded.M", + "params": [ + { + "disposable": true, + "index": 0, + "name": "p", + "transfer": "may" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs", + "line": 0, + "method": "Guarded.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ado-executereader-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 753, + "digest": "98dd55d8d7d333293b09666f5646320c99e6df0314eb6b37c33367daed93edbf" + }, + "inputs": [ + "corpus/real-world/ado-executereader-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ado-executereader-leak/after.cs", + "line": 0, + "method": "AdoReaderLeak.Run", + "params": [ + { + "disposable": true, + "index": 0, + "name": "cmd", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ado-executereader-leak/after.cs", + "line": 0, + "method": "AdoReaderLeak.Run", + "params": [ + { + "disposable": true, + "index": 0, + "name": "cmd", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ado-executereader-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 906, + "digest": "dccd453dbb0343d6da461113a0d6ed3f52e8bb20c801e425648ed571590cba32" + }, + "inputs": [ + "corpus/real-world/ado-executereader-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ado-executereader-leak/before.cs", + "line": 0, + "method": "AdoReaderLeak.Run", + "params": [ + { + "disposable": true, + "index": 0, + "name": "cmd", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ado-executereader-leak/before.cs", + "line": 0, + "method": "AdoReaderLeak.Run", + "params": [ + { + "disposable": true, + "index": 0, + "name": "cmd", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-aliased-receiver/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1154, + "digest": "526a59c5d1432dad152c2c769ebca2d6638b0b512b0aed195edd735b54d4722f" + }, + "inputs": [ + "corpus/real-world/arraypool-aliased-receiver/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-aliased-receiver/after.cs", + "line": 0, + "method": "PoolAliasedReceiver.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-aliased-receiver/after.cs", + "line": 0, + "method": "PoolAliasedReceiver.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-aliased-receiver/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1596, + "digest": "4a34fd2c34781ef4b7a7fa7af8ff330df8f9b8372d20f417af6de741eea0fdbc" + }, + "inputs": [ + "corpus/real-world/arraypool-aliased-receiver/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-aliased-receiver/before.cs", + "line": 0, + "method": "PoolAliasedReceiver.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-aliased-receiver/before.cs", + "line": 0, + "method": "PoolAliasedReceiver.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-double-return/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1147, + "digest": "37d779a90f23450050fc717689f0e583e0050967d9ca819fa3d533bb9680bfa5" + }, + "inputs": [ + "corpus/real-world/arraypool-double-return/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-double-return/after.cs", + "line": 0, + "method": "PoolDoubleReturn.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-double-return/after.cs", + "line": 0, + "method": "PoolDoubleReturn.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-double-return/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1590, + "digest": "e001f1d9c20b438ed2d49f31f9f8a98411009defb94d3e8a444dcbe02bf61a30" + }, + "inputs": [ + "corpus/real-world/arraypool-double-return/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-double-return/before.cs", + "line": 0, + "method": "PoolDoubleReturn.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-double-return/before.cs", + "line": 0, + "method": "PoolDoubleReturn.Use", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-field-fullspan-overread/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 605, + "digest": "5c21a85b91520a438eb205825184e84b0bf2ed651ccb8a08142fc139fefeb8c2" + }, + "inputs": [ + "corpus/real-world/arraypool-field-fullspan-overread/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-field-fullspan-overread/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1739, + "digest": "d5c207545b80313cae61bde69bb4f08c1ede589b15d234ff840cfe434a495fd4" + }, + "inputs": [ + "corpus/real-world/arraypool-field-fullspan-overread/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-field-fullspan-overread/before.cs", + "line": 0, + "method": "FieldPoolFramer.Flush", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-field-fullspan-overread/before.cs", + "line": 0, + "method": "FieldPoolFramer.FlushMeta", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-field-fullspan-overread/before.cs", + "line": 0, + "method": "FieldPoolFramer.Flush", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-field-fullspan-overread/before.cs", + "line": 0, + "method": "FieldPoolFramer.FlushMeta", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-fullspan-overread/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 984, + "digest": "887d234bd22bbdf8029994895e7d3c57078a6dc2420906de62120863cc96211f" + }, + "inputs": [ + "corpus/real-world/arraypool-fullspan-overread/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-fullspan-overread/after.cs", + "line": 0, + "method": "PoolFullSpanOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-fullspan-overread/after.cs", + "line": 0, + "method": "PoolFullSpanOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-fullspan-overread/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1173, + "digest": "0c5096519a16c585bf5d9a1c05662faaed54b49dcc787f01fdb728973e518760" + }, + "inputs": [ + "corpus/real-world/arraypool-fullspan-overread/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-fullspan-overread/before.cs", + "line": 0, + "method": "PoolFullSpanOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-fullspan-overread/before.cs", + "line": 0, + "method": "PoolFullSpanOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-length-overread/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 889, + "digest": "38b5a858ccf1e53252e16eb3ffaf5c73bf143b23934a86d2710161e95fc9f332" + }, + "inputs": [ + "corpus/real-world/arraypool-length-overread/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-length-overread/after.cs", + "line": 0, + "method": "PoolLengthOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-length-overread/after.cs", + "line": 0, + "method": "PoolLengthOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-length-overread/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 984, + "digest": "a4e241b28646896975bfee5c09e0809fbd61e15583435a95b65cfe14844038bf" + }, + "inputs": [ + "corpus/real-world/arraypool-length-overread/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-length-overread/before.cs", + "line": 0, + "method": "PoolLengthOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-length-overread/before.cs", + "line": 0, + "method": "PoolLengthOverread.Frame", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-memory-view-escape/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 990, + "digest": "7abe49c412f5557a1924e06959adb8bd5e19da7b9ff1699024d2cc34dd745943" + }, + "inputs": [ + "corpus/real-world/arraypool-memory-view-escape/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-memory-view-escape/after.cs", + "line": 0, + "method": "PoolMemoryViewEscape.Render", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-memory-view-escape/after.cs", + "line": 0, + "method": "PoolMemoryViewEscape.Render", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-memory-view-escape/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1422, + "digest": "f19f812c6e5c67408d0309f8ec3876e981277af8111525e83eb42166d0ab185a" + }, + "inputs": [ + "corpus/real-world/arraypool-memory-view-escape/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-memory-view-escape/before.cs", + "line": 0, + "method": "PoolMemoryViewEscape.Render", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-memory-view-escape/before.cs", + "line": 0, + "method": "PoolMemoryViewEscape.Render", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-span-view-after-return/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 815, + "digest": "1ab95d766e0b60e41e441d88063f854e1c34f47b2095c15c963e1b51ae965d91" + }, + "inputs": [ + "corpus/real-world/arraypool-span-view-after-return/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-span-view-after-return/after.cs", + "line": 0, + "method": "PoolSpanViewAfterReturn.Scramble", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-span-view-after-return/after.cs", + "line": 0, + "method": "PoolSpanViewAfterReturn.Scramble", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-span-view-after-return/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 816, + "digest": "00d9990195964c83096e849c14fd8c41e40c30003ae3880eb4fc30e4d967c59b" + }, + "inputs": [ + "corpus/real-world/arraypool-span-view-after-return/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-span-view-after-return/before.cs", + "line": 0, + "method": "PoolSpanViewAfterReturn.Scramble", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-span-view-after-return/before.cs", + "line": 0, + "method": "PoolSpanViewAfterReturn.Scramble", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-use-after-return/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 920, + "digest": "bf636a7c05affa50888d25bd6eef000bdce06e6e8b690d4ca59ae5b2abbf7fe2" + }, + "inputs": [ + "corpus/real-world/arraypool-use-after-return/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-use-after-return/after.cs", + "line": 0, + "method": "PoolUseAfterReturn.Divide", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-use-after-return/after.cs", + "line": 0, + "method": "PoolUseAfterReturn.Divide", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-use-after-return/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1016, + "digest": "1dd57bb39f70ceb0b50bda26387e38dedd48bb211573f88d642f24639e044f85" + }, + "inputs": [ + "corpus/real-world/arraypool-use-after-return/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-use-after-return/before.cs", + "line": 0, + "method": "PoolUseAfterReturn.Divide", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-use-after-return/before.cs", + "line": 0, + "method": "PoolUseAfterReturn.Divide", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-view-into-field-overread/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 606, + "digest": "cabe61e3c464867e68b999d599c5f83ef0d49724cf3d28f5bfbe0cb508bdaa13" + }, + "inputs": [ + "corpus/real-world/arraypool-view-into-field-overread/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/arraypool-view-into-field-overread/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1510, + "digest": "be50782fc8f098fb9f82bace1fee6a279c0fd2078713db614d98787ea607e6d1" + }, + "inputs": [ + "corpus/real-world/arraypool-view-into-field-overread/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-view-into-field-overread/before.cs", + "line": 0, + "method": "FieldViewFramer.Capture", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/arraypool-view-into-field-overread/before.cs", + "line": 0, + "method": "FieldViewFramer.Capture", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/field-dispose-via-exchange/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1191, + "digest": "c85bcd1cbd40cbb88b18ac82fc522fd61a495d5404a4cef0c5de8c5627dc4fc1" + }, + "inputs": [ + "corpus/real-world/field-dispose-via-exchange/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-exchange/after.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-exchange/after.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/field-dispose-via-exchange/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1196, + "digest": "f3dfc0a9cd9f809d4b8386d1c48c3427b3e3bb6935b2ae53934e40012c5c7a81" + }, + "inputs": [ + "corpus/real-world/field-dispose-via-exchange/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-exchange/before.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-exchange/before.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/field-dispose-via-helper/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1182, + "digest": "85a5318802817003fc55f107194b11398e8b72e854a554f82bd0f760cfdc02ef" + }, + "inputs": [ + "corpus/real-world/field-dispose-via-helper/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-helper/after.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-helper/after.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/field-dispose-via-helper/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1185, + "digest": "f05208a1844265c23a3eccae5306dc41143a8b6a0982f877ff08b5f2a55a1a66" + }, + "inputs": [ + "corpus/real-world/field-dispose-via-helper/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-helper/before.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/field-dispose-via-helper/before.cs", + "line": 0, + "method": "TimerSink.WaitForDispose", + "params": [ + { + "disposable": true, + "index": 0, + "name": "timer", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/field-noop-dispose-wrapper/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/real-world/field-noop-dispose-wrapper/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/field-noop-dispose-wrapper/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 641, + "digest": "011db74b029e53ec3db9d79684980f3e0e570768ad48b74da1f3d42fa475a10a" + }, + "inputs": [ + "corpus/real-world/field-noop-dispose-wrapper/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/local-dispose-via-using-statement/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1120, + "digest": "6e7ce96fca6b3bfd9baf82f8cc60ebc766900757eea779aa9143371b7a661ae0" + }, + "inputs": [ + "corpus/real-world/local-dispose-via-using-statement/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/local-dispose-via-using-statement/after.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/local-dispose-via-using-statement/after.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/local-dispose-via-using-statement/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 690, + "digest": "0bbec5d389f595c5fb610d09ca47b0d4412c9da49562ee22e589973ad5094f7f" + }, + "inputs": [ + "corpus/real-world/local-dispose-via-using-statement/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/local-dispose-via-using-statement/before.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/local-dispose-via-using-statement/before.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-double-dispose/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1127, + "digest": "8d1fbc8a549b59016db4416d103572b8940e87ff40bf09b22e7871a757264c18" + }, + "inputs": [ + "corpus/real-world/memorypool-double-dispose/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-double-dispose/after.cs", + "line": 0, + "method": "MemoryPoolDoubleDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-double-dispose/after.cs", + "line": 0, + "method": "MemoryPoolDoubleDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-double-dispose/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1255, + "digest": "7240bfec1a315cd950767e58b7ec1ea745b5f604d7aa15c27a36a73b08237274" + }, + "inputs": [ + "corpus/real-world/memorypool-double-dispose/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-double-dispose/before.cs", + "line": 0, + "method": "MemoryPoolDoubleDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-double-dispose/before.cs", + "line": 0, + "method": "MemoryPoolDoubleDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-using-owner-escape/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/real-world/memorypool-using-owner-escape/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-using-owner-escape/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1071, + "digest": "605e860e26da849abe7eed1c3b17d96c6bfae4dce89ee224f3de1394306989c8" + }, + "inputs": [ + "corpus/real-world/memorypool-using-owner-escape/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-using-owner-escape/before.cs", + "line": 0, + "method": "MemoryPoolUsingOwnerEscape.Borrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-using-owner-escape/before.cs", + "line": 0, + "method": "MemoryPoolUsingOwnerEscape.Borrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-using-statement-view-escape/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/real-world/memorypool-using-statement-view-escape/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-using-statement-view-escape/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1088, + "digest": "3615cda941d9ec0041d633a31664e1eddf2e6e48dddf0c7c1da034dc5e1e70f3" + }, + "inputs": [ + "corpus/real-world/memorypool-using-statement-view-escape/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-using-statement-view-escape/before.cs", + "line": 0, + "method": "MemoryPoolUsingStatementViewEscape.Borrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-using-statement-view-escape/before.cs", + "line": 0, + "method": "MemoryPoolUsingStatementViewEscape.Borrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-using-view-escape/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/real-world/memorypool-using-view-escape/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-using-view-escape/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1069, + "digest": "0f25c49e03e043a218263bdd84095249997f18d4af0b4a9ebebc62c58a5dddc3" + }, + "inputs": [ + "corpus/real-world/memorypool-using-view-escape/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-using-view-escape/before.cs", + "line": 0, + "method": "MemoryPoolUsingViewEscape.Borrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-using-view-escape/before.cs", + "line": 0, + "method": "MemoryPoolUsingViewEscape.Borrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-view-after-dispose/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1134, + "digest": "c5b20549d3ddeeab4d0727ef34a142fe84e6f6160055b18fd60d8469cbc0c174" + }, + "inputs": [ + "corpus/real-world/memorypool-view-after-dispose/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-view-after-dispose/after.cs", + "line": 0, + "method": "MemoryPoolViewAfterDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-view-after-dispose/after.cs", + "line": 0, + "method": "MemoryPoolViewAfterDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/memorypool-view-after-dispose/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 823, + "digest": "242d2e078f9e5fc50bab69821882d7ce195af93aa8cee3e735fe51404991b173" + }, + "inputs": [ + "corpus/real-world/memorypool-view-after-dispose/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-view-after-dispose/before.cs", + "line": 0, + "method": "MemoryPoolViewAfterDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/memorypool-view-after-dispose/before.cs", + "line": 0, + "method": "MemoryPoolViewAfterDispose.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1018, + "digest": "c02d1bde82b902276207be999e8febf3b914a3d4845e2da6e8ea660bc329719e" + }, + "inputs": [ + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs", + "line": 0, + "method": "Corpus.PatriciaTree.Get", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs", + "line": 0, + "method": "Corpus.PatriciaTree.Get", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1291, + "digest": "c84acf2d742602066457f6edbef037fcc32286da546386c65f350994662f9d80" + }, + "inputs": [ + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs", + "line": 0, + "method": "Corpus.PatriciaTree.Get", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs", + "line": 0, + "method": "Corpus.PatriciaTree.Get", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ownership-handoff-consume/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1799, + "digest": "518ca20d0a37f67037cebcef824aa5c44108f023a08cb79de28e71d0a95bf1af" + }, + "inputs": [ + "corpus/real-world/ownership-handoff-consume/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/after.cs", + "line": 0, + "method": "Archiver.Archive", + "params": [ + { + "disposable": true, + "index": 0, + "name": "source", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/after.cs", + "line": 0, + "method": "Archiver.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/after.cs", + "line": 0, + "method": "Archiver.RunOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/after.cs", + "line": 0, + "method": "Archiver.Archive", + "params": [ + { + "disposable": true, + "index": 0, + "name": "source", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/after.cs", + "line": 0, + "method": "Archiver.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/after.cs", + "line": 0, + "method": "Archiver.RunOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ownership-handoff-consume/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 2282, + "digest": "96ade630640833193ec314bb7f73d6f1208d356e395af486da2de1b962ac9bbe" + }, + "inputs": [ + "corpus/real-world/ownership-handoff-consume/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.Archive", + "params": [ + { + "disposable": true, + "index": 0, + "name": "source", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.RunOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.Archive", + "params": [ + { + "disposable": true, + "index": 0, + "name": "source", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.Leak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-consume/before.cs", + "line": 0, + "method": "Archiver.RunOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ownership-handoff-use-transitive/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1801, + "digest": "bee4e353bb6667f6e5279075a23219a36a7218cad1ac2901bd5905182ddfcc61" + }, + "inputs": [ + "corpus/real-world/ownership-handoff-use-transitive/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/after.cs", + "line": 0, + "method": "HandoffUseTransitive.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/after.cs", + "line": 0, + "method": "HandoffUseTransitive.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/after.cs", + "line": 0, + "method": "HandoffUseTransitive.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/after.cs", + "line": 0, + "method": "HandoffUseTransitive.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/after.cs", + "line": 0, + "method": "HandoffUseTransitive.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/after.cs", + "line": 0, + "method": "HandoffUseTransitive.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ownership-handoff-use-transitive/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1891, + "digest": "00a8a371e87fb850d72ec9a062ba665d19c3239f7f8742ea6d08ec0bca66b18e" + }, + "inputs": [ + "corpus/real-world/ownership-handoff-use-transitive/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/before.cs", + "line": 0, + "method": "HandoffUseTransitive.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/before.cs", + "line": 0, + "method": "HandoffUseTransitive.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/before.cs", + "line": 0, + "method": "HandoffUseTransitive.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/before.cs", + "line": 0, + "method": "HandoffUseTransitive.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/before.cs", + "line": 0, + "method": "HandoffUseTransitive.Inner", + "params": [ + { + "disposable": true, + "index": 0, + "name": "s", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use-transitive/before.cs", + "line": 0, + "method": "HandoffUseTransitive.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ownership-handoff-use/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1313, + "digest": "6b529eede21b6a85738160f51d99486d9d2cae181318463dd4fe285b07a8fe05" + }, + "inputs": [ + "corpus/real-world/ownership-handoff-use/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/after.cs", + "line": 0, + "method": "HandoffUse.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/after.cs", + "line": 0, + "method": "HandoffUse.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/after.cs", + "line": 0, + "method": "HandoffUse.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/after.cs", + "line": 0, + "method": "HandoffUse.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/ownership-handoff-use/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1404, + "digest": "bc381fff04a01c6b4c76c934fa6f69b5272d386ee835d6c8eee76e09980a09b2" + }, + "inputs": [ + "corpus/real-world/ownership-handoff-use/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/before.cs", + "line": 0, + "method": "HandoffUse.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/before.cs", + "line": 0, + "method": "HandoffUse.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/before.cs", + "line": 0, + "method": "HandoffUse.Consume", + "params": [ + { + "disposable": true, + "index": 0, + "name": "sink", + "transfer": "must" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/ownership-handoff-use/before.cs", + "line": 0, + "method": "HandoffUse.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 804, + "digest": "366476374d311deced8d8ff927d94183f9306d91c260d808183694f1f86279b7" + }, + "inputs": [ + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/pool-transfer-via-wrapper-local/after.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/pool-transfer-via-wrapper-local/after.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 853, + "digest": "b9ced6d38d48449712d0954701cad88f4a82261bf52913379cec0396b8b63545" + }, + "inputs": [ + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/pool-transfer-via-wrapper-local/before.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/pool-transfer-via-wrapper-local/before.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/screentogif-loaded-subscription/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1457, + "digest": "223cb264993bc6d140144ef46986975be86c395fa1191a663a47fd8119e88752" + }, + "inputs": [ + "corpus/real-world/screentogif-loaded-subscription/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/screentogif-loaded-subscription/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1364, + "digest": "4194acc87fb3095604b89e867e5066cfd006d877b58e530af23df84a000de222" + }, + "inputs": [ + "corpus/real-world/screentogif-loaded-subscription/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/screentogif-systemevents-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 870, + "digest": "d2a81610487f8e298d1d4ba5cb86461aff193e8466ac3295fec9bf7d8f8f5cdf" + }, + "inputs": [ + "corpus/real-world/screentogif-systemevents-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/screentogif-systemevents-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 695, + "digest": "1e9530d2e28322affdc37448e602200562b57148a8e4f1df0f5d36d18e35f167" + }, + "inputs": [ + "corpus/real-world/screentogif-systemevents-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1068, + "digest": "e39c7c0ee7b58eae27a94846ada780cfe5f403d5e2560678225ed5ac38935968" + }, + "inputs": [ + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs", + "line": 0, + "method": "VaultCrypto.DeriveCryptoData", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs", + "line": 0, + "method": "VaultCrypto.DeriveCryptoData", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 645, + "digest": "0292fbda9a3938d241637ca201c10daed635109fe189a5b517da1f325d60ba31" + }, + "inputs": [ + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 646, + "digest": "2c97160ac33a0e5ce0f3c14695e65924ceacf6510b1bc8a3555f55e698ca7cc4" + }, + "inputs": [ + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/socket-accept-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 666, + "digest": "8ee02890727da67fac200ca8776873ffda128d60c2c256897b4536b94e68f1ea" + }, + "inputs": [ + "corpus/real-world/socket-accept-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/socket-accept-leak/after.cs", + "line": 0, + "method": "SocketAcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/socket-accept-leak/after.cs", + "line": 0, + "method": "SocketAcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/socket-accept-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 908, + "digest": "e238f0ee708d2d2498bb29442e03ecce198ab500b66712cb61f553b40c6a5e94" + }, + "inputs": [ + "corpus/real-world/socket-accept-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/socket-accept-leak/before.cs", + "line": 0, + "method": "SocketAcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/socket-accept-leak/before.cs", + "line": 0, + "method": "SocketAcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/subscription-self-owned-property/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/real-world/subscription-self-owned-property/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/subscription-self-owned-property/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 729, + "digest": "882aeb491c18e9d3f68490a742ebec4110ff3d69fbe9659bd8292fb41b1c7ed7" + }, + "inputs": [ + "corpus/real-world/subscription-self-owned-property/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/tcplistener-accept-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 670, + "digest": "0fad59cb39af3f6e7e058edbc9921631ccf13e8612a200f658527b8b573f179f" + }, + "inputs": [ + "corpus/real-world/tcplistener-accept-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-accept-leak/after.cs", + "line": 0, + "method": "AcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-accept-leak/after.cs", + "line": 0, + "method": "AcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/tcplistener-accept-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 916, + "digest": "14225ebe05f207b6381445e11fd0cd51af68bfdcb6776c723e28e415085e5fe7" + }, + "inputs": [ + "corpus/real-world/tcplistener-accept-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-accept-leak/before.cs", + "line": 0, + "method": "AcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-accept-leak/before.cs", + "line": 0, + "method": "AcceptLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 682, + "digest": "6f7beb79279e491530cf512fcc4873fd2693b7c0574ccdcd1c67b8385798a37c" + }, + "inputs": [ + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-acceptsocket-leak/after.cs", + "line": 0, + "method": "AcceptSocketLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-acceptsocket-leak/after.cs", + "line": 0, + "method": "AcceptSocketLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 924, + "digest": "2655f555efc313ac4f8af306666c8c991524edf108eeac0b12a8041abd2bb4db" + }, + "inputs": [ + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-acceptsocket-leak/before.cs", + "line": 0, + "method": "AcceptSocketLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/tcplistener-acceptsocket-leak/before.cs", + "line": 0, + "method": "AcceptSocketLeak.Serve", + "params": [ + { + "disposable": true, + "index": 0, + "name": "listener", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/using-statement-throw-releases/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1400, + "digest": "1258d2c75573760eed1884eceaf50d95338bdd4addf73f9a69fa0f9161adb74f" + }, + "inputs": [ + "corpus/real-world/using-statement-throw-releases/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/using-statement-throw-releases/after.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/using-statement-throw-releases/after.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/real-world/using-statement-throw-releases/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1641, + "digest": "2675c68418b90798b23c6ebccf545feb55c30c6220547f04c3b6cea8eb0f5852" + }, + "inputs": [ + "corpus/real-world/using-statement-throw-releases/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/using-statement-throw-releases/before.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/real-world/using-statement-throw-releases/before.cs", + "line": 0, + "method": "Demo.Run", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/custom-weak-wrapper/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/wpf/custom-weak-wrapper/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/custom-weak-wrapper/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 716, + "digest": "554f01c455b9caee5af33a6d41e4c37812c7e76499b6f18cb0c17a2b1dc9fcc8" + }, + "inputs": [ + "corpus/wpf/custom-weak-wrapper/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/field-use-after-dispose/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 630, + "digest": "5e8403976ee5c58dd9c8ccb8633047948ab25eaf5146f3ce74aec047557c488a" + }, + "inputs": [ + "corpus/wpf/field-use-after-dispose/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/field-use-after-dispose/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1158, + "digest": "baee2ef7b40f1846f826946bf0b15895d9a9a13b2378ffc54021efefc639eb54" + }, + "inputs": [ + "corpus/wpf/field-use-after-dispose/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/field-use-after-dispose/before.cs", + "line": 0, + "method": "ReportViewModel.OnDataChanged", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/field-use-after-dispose/before.cs", + "line": 0, + "method": "ReportViewModel.OnDataChanged", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 644, + "digest": "43ffcf8338181c07bd62ba9ad5374a19cfc6747f516b3b64f8f829fc88b4d45f" + }, + "inputs": [ + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1188, + "digest": "b306fc7240c43ca9f2eaa15878112e3e54a5cec00fd89d895557c780b563c517" + }, + "inputs": [ + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs", + "line": 0, + "method": "SourceView.OnSourceChanged", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs", + "line": 0, + "method": "SourceView.OnSourceChanged", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/handler-use-after-dispose/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 634, + "digest": "326ab79aac370e315311229a45cc2016fbc74c7a1253f1439a32b1734237f9ad" + }, + "inputs": [ + "corpus/wpf/handler-use-after-dispose/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/handler-use-after-dispose/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1170, + "digest": "cc300ea04b282ad37fb475ba1b1800ea5c10237cd8e3a982ca31f6585136b69b" + }, + "inputs": [ + "corpus/wpf/handler-use-after-dispose/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/handler-use-after-dispose/before.cs", + "line": 0, + "method": "CustomerViewModel.OnCustomerChanged", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/handler-use-after-dispose/before.cs", + "line": 0, + "method": "CustomerViewModel.OnCustomerChanged", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/pooled-view-after-dispose/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/wpf/pooled-view-after-dispose/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/pooled-view-after-dispose/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 749, + "digest": "77ef7b8af94100f1680b81c3eec800a060494162d721439df59c92455b92495b" + }, + "inputs": [ + "corpus/wpf/pooled-view-after-dispose/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/pooled-view-after-dispose/before.cs", + "line": 0, + "method": "FrameDecoder.OnFrameReady", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095/corpus/wpf/pooled-view-after-dispose/before.cs", + "line": 0, + "method": "FrameDecoder.OnFrameReady", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 908, + "digest": "a9480b71d0e45fff2d31cc7985e73d176e4591b6b66583893ca00ba062bcc467" + }, + "inputs": [ + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 910, + "digest": "c49e979336abff7186e0a078a0aee5625a47b55de8262a48739de8c05698bcf2" + }, + "inputs": [ + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-disposing-else-branch-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 768, + "digest": "79d3ff4102dac8935180d3fb1fa4681bfa0cd391e19da0a4e5ef9929f234d350" + }, + "inputs": [ + "corpus/wpf/subscription-disposing-else-branch-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-disposing-else-branch-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 770, + "digest": "a9eff839199f649ff0deb2490e9de138cbb9ed1e4214104caa9cd3fd1c81e460" + }, + "inputs": [ + "corpus/wpf/subscription-disposing-else-branch-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-explicit-delegate-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 764, + "digest": "8743b538ccdb6f7ad482215c1bfe19196c20f29ac90d7c722f12326c504ac74a" + }, + "inputs": [ + "corpus/wpf/subscription-explicit-delegate-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-explicit-delegate-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 766, + "digest": "ed2c416a93b08944c2dc8f0d0b5191ac66b2f0a73f712fee4ae24238c68c0259" + }, + "inputs": [ + "corpus/wpf/subscription-explicit-delegate-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-finalizer-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 736, + "digest": "9a194ba5bf46daf4862e9ffff22321d05e1cfd69d0e2b4217dfbb390d19b1d10" + }, + "inputs": [ + "corpus/wpf/subscription-finalizer-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-finalizer-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 738, + "digest": "744162c120c4edf7d3b0fcc1f9eee53c1e6a5d012288dabafb97c058facb8737" + }, + "inputs": [ + "corpus/wpf/subscription-finalizer-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-nonteardown-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 720, + "digest": "eb2edf8684887a265864fe321d1f45e6a280ef793bb6420daa3bac8f37008628" + }, + "inputs": [ + "corpus/wpf/subscription-nonteardown-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-nonteardown-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 722, + "digest": "6463c6087d6eba36c160f1804d165ce953e7424c02f8fbed66038f81297c3d18" + }, + "inputs": [ + "corpus/wpf/subscription-nonteardown-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 724, + "digest": "2f6fe06a07529bc8448b2bed336f49fd73d0993ce15b7be2e3a34ee436cf5419" + }, + "inputs": [ + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 726, + "digest": "024a7d5e4c233f87269ce022709875b740e01a5f48bb32b0c9d9df47a4138d69" + }, + "inputs": [ + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-param-guarded-unregister/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 766, + "digest": "8357fdf69d6c99ee66858399221578895e01986724fe944c7389cdc9c5230739" + }, + "inputs": [ + "corpus/wpf/subscription-param-guarded-unregister/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-param-guarded-unregister/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 768, + "digest": "80211f1c6f77601af1ee8ea6c067ccc319f3631b945a4c600c42b28df70a5894" + }, + "inputs": [ + "corpus/wpf/subscription-param-guarded-unregister/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-target-typed-delegate-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 740, + "digest": "6d497efa32b7716e58297c11065c8ed936680f34f89511e3733dfe6a6b231c5d" + }, + "inputs": [ + "corpus/wpf/subscription-target-typed-delegate-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-target-typed-delegate-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 742, + "digest": "66cbf07fe31283239646288663c68b20f7d1053cd023c68570899c65eb1c3c83" + }, + "inputs": [ + "corpus/wpf/subscription-target-typed-delegate-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-teardown-early-return-guard/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 771, + "digest": "4b9807711736129a240364322dfe9b8146209c989296c685186b347c01ba09dd" + }, + "inputs": [ + "corpus/wpf/subscription-teardown-early-return-guard/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-teardown-early-return-guard/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 773, + "digest": "7088a5daffa66b7685d4cfb029240bc95386dc1b839f64daf7da89422ae696fc" + }, + "inputs": [ + "corpus/wpf/subscription-teardown-early-return-guard/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-uncalled-local-function/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 734, + "digest": "ec2ad7cbc261709f93494385d9aa02aba00db24250332e2a992a57ad8641523f" + }, + "inputs": [ + "corpus/wpf/subscription-uncalled-local-function/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-uncalled-local-function/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1242, + "digest": "463319ba792170cc651930d030ffb9b7279220d0ae97eb16342ed57bbd4a419f" + }, + "inputs": [ + "corpus/wpf/subscription-uncalled-local-function/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-xaml-name-only-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 1229, + "digest": "c576b1e0f013b89edaae4443c8bb7ba04faa02c3560bf84c5cda87436c4d9e63" + }, + "inputs": [ + "corpus/wpf/subscription-xaml-name-only-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/subscription-xaml-name-only-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 728, + "digest": "5c2e16858e3a609f462be206fb992ec8846b760701e219dc5b2e10b2529ff06a" + }, + "inputs": [ + "corpus/wpf/subscription-xaml-name-only-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/systemevents-region-escape/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 849, + "digest": "2b95b9ec0b27f704a6fdbf0edb413a6578187a6e16a2ad1f63a2f45862833315" + }, + "inputs": [ + "corpus/wpf/systemevents-region-escape/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/systemevents-region-escape/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 674, + "digest": "84e0ea5e2dca863a37b78485b8d7771ca2c746b4428a9eea0f344274f3013cb3" + }, + "inputs": [ + "corpus/wpf/systemevents-region-escape/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-disposing-else-branch/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 687, + "digest": "a42f6a0c43693a09c7484b570b374a4970b7ce50373948ced410ec7bcfc91928" + }, + "inputs": [ + "corpus/wpf/timer-stop-disposing-else-branch/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-disposing-else-branch/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 689, + "digest": "69066ec33280196711938348368eca9e0a63ab40875490e6eea103e5cd7fe02b" + }, + "inputs": [ + "corpus/wpf/timer-stop-disposing-else-branch/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-early-return-guard/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 684, + "digest": "7eaeac46eceb26d3a7c8035658e33f23b90503fe6467ec10bfdf42590c6f4f1e" + }, + "inputs": [ + "corpus/wpf/timer-stop-early-return-guard/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-early-return-guard/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 686, + "digest": "71ef3b7b65bb5ff1d8ab86eb4b3f3825785538e66c03e8ca75b898659de2d2aa" + }, + "inputs": [ + "corpus/wpf/timer-stop-early-return-guard/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-finalizer-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 689, + "digest": "8d6d55e578516af8d7a1061279896b7c254044203d9fcf3e6d86ddda4ee79798" + }, + "inputs": [ + "corpus/wpf/timer-stop-finalizer-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-finalizer-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 691, + "digest": "bbf1cbda6b5df6d1f745ad7b300d224702d1a57d92f58fc86ba6f7976b7987bb" + }, + "inputs": [ + "corpus/wpf/timer-stop-finalizer-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-nonteardown-release/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 685, + "digest": "da2d8981151e366a383e1539674812dcce74d77d41db2d20fa5fdc8d0afdaca3" + }, + "inputs": [ + "corpus/wpf/timer-stop-nonteardown-release/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-nonteardown-release/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 687, + "digest": "061b4876c9c64bb72a5f1ca9d824ecc81a5a260520e126e0bbc646450c50cafd" + }, + "inputs": [ + "corpus/wpf/timer-stop-nonteardown-release/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-param-guarded/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 679, + "digest": "f1e30766d4c68277af8e96391a07a8bc184ec2339a5fdbbada0140a21ed30e51" + }, + "inputs": [ + "corpus/wpf/timer-stop-param-guarded/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-param-guarded/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 681, + "digest": "4d63866cc5ed269104801797f68a1d3ce2466c00648517e68aa045f7275d95ca" + }, + "inputs": [ + "corpus/wpf/timer-stop-param-guarded/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-uncalled-helper/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 688, + "digest": "4aabf4a2c5c0ac41bdc1c647e688919c352dcb8ce8bfcd4f7b7c1c4b46f139d4" + }, + "inputs": [ + "corpus/wpf/timer-stop-uncalled-helper/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-uncalled-helper/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 690, + "digest": "542694de6eed5843aaa7420cecf4f1a4d943087483b6670829d65668d5fd058f" + }, + "inputs": [ + "corpus/wpf/timer-stop-uncalled-helper/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-uncalled-lambda/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 682, + "digest": "79b3d88249293aa6979793eb765fd28a07e47ecf13e239bcb1e85703f813411b" + }, + "inputs": [ + "corpus/wpf/timer-stop-uncalled-lambda/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-uncalled-lambda/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 684, + "digest": "e0ca56070efb1d5717fd2002cf11d43ebd4c13624ce8b9351dd348d7fff393af" + }, + "inputs": [ + "corpus/wpf/timer-stop-uncalled-lambda/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 685, + "digest": "b990f0b57d53afc6de052c88dce7d5cdd4d3f015e6878ce2ac5ec118880e5b4c" + }, + "inputs": [ + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 687, + "digest": "780c8d804ca78547a3e5bc29ba3cc8ecb288de9c76ce8a377686715a8f7e5003" + }, + "inputs": [ + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-wrong-receiver/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 924, + "digest": "24289b5a941ae6e030cfd911731ae910893e0dbce2396e4dc8afd9caa8ddcda0" + }, + "inputs": [ + "corpus/wpf/timer-stop-wrong-receiver/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/timer-stop-wrong-receiver/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 926, + "digest": "23e5e379b9a8748d23e1aa59e693231d2a62f30298338753b3d1bfa02c93a3b3" + }, + "inputs": [ + "corpus/wpf/timer-stop-wrong-receiver/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/viewmodel-escapes-to-app/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/wpf/viewmodel-escapes-to-app/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/viewmodel-escapes-to-app/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 642, + "digest": "cfb0048886cda8835f01302498e450971372807af32c8bd0402c9fed5d3aed4f" + }, + "inputs": [ + "corpus/wpf/viewmodel-escapes-to-app/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/zombie-viewmodel/after.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 221, + "digest": "1495062048b1e5a30dc60b700f08bc8c58a993eb0cf8e226c20d8cbd1943e381" + }, + "inputs": [ + "corpus/wpf/zombie-viewmodel/after.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + }, + "corpus/wpf/zombie-viewmodel/before.cs": { + "facts": { + "algorithm": "sha256", + "bytes": 651, + "digest": "e9ec14e9a944c5bcf6cfdc1101ec2a00635437e63acd3e53cb9344da85730e14" + }, + "inputs": [ + "corpus/wpf/zombie-viewmodel/before.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [], + "unresolved": [] + }, + "status": "produced" + } + } + }, + "execution_profile": { + "dotnet": { + "runtimes": [ + "Microsoft.AspNetCore.App 8.0.31", + "Microsoft.NETCore.App 8.0.31" + ], + "sdk": "8.0.425" + }, + "platform": { + "machine": "x86_64", + "system": "Linux" + }, + "python": { + "implementation": "CPython", + "version": "3.11.15 (main, Sep 19 2026, 00:18:08) [GCC 16.1.1 20260625]" + }, + "rust": { + "cargo": "cargo 1.94.1 (29ea6fb6a 2026-03-24)", + "host": "x86_64-unknown-linux-gnu", + "rustc": "rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8" + } + }, + "input_roots": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "instrument_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py" + ], + "is_evidence": true, + "materialization_root": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095", + "population_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "post_run_population_intact": true, + "reference_profile": { + "OWN_EXTRA_REF_DIRS": "removed-from-child-environment", + "observed_extra_reference_lines": 0 + }, + "schema": "p037-mos-snapshot/2", + "source": "corpus", + "source_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "subject_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py", + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ], + "support_manifest": [], + "support_manifest_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "treatment_paths": [ + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ] +} diff --git a/docs/evidence/p037-a2-baseline-mos-repo.json b/docs/evidence/p037-a2-baseline-mos-repo.json new file mode 100644 index 00000000..54d5cfb4 --- /dev/null +++ b/docs/evidence/p037-a2-baseline-mos-repo.json @@ -0,0 +1,2672 @@ +{ + "analysis_manifest": [ + { + "blob": "db9868f0e8b9fcbe286f8f810ccc988416f10b1e", + "path": "audit/runtime/DuplicateDetector/Program.cs" + }, + { + "blob": "61d10bce7d57789882a0b9c1e3269bede7ee5271", + "path": "audit/runtime/LeakHarness/HeapCounter.cs" + }, + { + "blob": "0e6a1d74575c72c621b6aa5afe9f3e3bc2594e19", + "path": "audit/runtime/LeakHarness/Program.cs" + }, + { + "blob": "76f0aa4c197925c0cbbe5094986c25ef8c5f57fc", + "path": "audit/runtime/LeakHarness/Scenario.cs" + }, + { + "blob": "0de2cf83746dcb98f28bd774eeeb0b4cc6915b0f", + "path": "audit/runtime/PropertyChangedStorm/Program.cs" + }, + { + "blob": "14234cabf0d3f931dda84c0f921980e4f9bbd612", + "path": "audit/runtime/RetentionPath/Heap.cs" + }, + { + "blob": "72f149c65a97590f677bc76afcff933107afac20", + "path": "audit/runtime/RetentionPath/Program.cs" + }, + { + "blob": "f803433a54e23a6845792fd2050969d3f4da5a85", + "path": "frontend/roslyn/Owen.CSharp.Rewriter/Program.cs" + }, + { + "blob": "e2a7caf1437892347df186a7a5636c032651d320", + "path": "frontend/roslyn/OwnSharp.Cli/CheckCommand.cs" + }, + { + "blob": "14d9afdfcae183bcc1a36cb66713e5cac1ee2779", + "path": "frontend/roslyn/OwnSharp.Cli/CompareMode.cs" + }, + { + "blob": "29b16c9d30bd974e04125a32bec345ca5596334a", + "path": "frontend/roslyn/OwnSharp.Cli/CoreVendor.cs" + }, + { + "blob": "a51855e9f0a5f7ad5dd942dca5c4313fd99b032e", + "path": "frontend/roslyn/OwnSharp.Cli/CrashReport.cs" + }, + { + "blob": "58453947817b0e874d5ad6e17e1e4a49b7c125b5", + "path": "frontend/roslyn/OwnSharp.Cli/EngineRunner.cs" + }, + { + "blob": "ad30d037b862776072d3474d367f9f1628cb139a", + "path": "frontend/roslyn/OwnSharp.Cli/EngineSelection.cs" + }, + { + "blob": "6674fe0270f82f12e4472078d8e2b4a2a57cf5bd", + "path": "frontend/roslyn/OwnSharp.Cli/Program.cs" + }, + { + "blob": "d78c5d2a072fe22a6cdc39c416506df77e51bdf5", + "path": "frontend/roslyn/OwnSharp.Cli/PythonResolver.cs" + }, + { + "blob": "c83babf3a205f81e86581c418dcb97bbe3226fd5", + "path": "frontend/roslyn/OwnSharp.Cli/RustCoreLocator.cs" + }, + { + "blob": "07cb275070130437ec22207978e3b9fd9718c13f", + "path": "frontend/roslyn/OwnSharp.Cli/ToolVersion.cs" + }, + { + "blob": "33bd542eed196609315330b524086c6e6d5d117f", + "path": "frontend/roslyn/OwnSharp.Extractor/Program.cs" + }, + { + "blob": "b90d2916e1d6725d20c7a97af1647f73215413eb", + "path": "frontend/roslyn/OwnSharp.WeakTargetProbe/Program.cs" + }, + { + "blob": "faf652745bc629ad77f51f8aaeeb220fbf810463", + "path": "frontend/roslyn/project-input-sample/CustomerSubscription.cs" + }, + { + "blob": "8ea4797f7c567316194b4a452bbf6e0d8ee10a9d", + "path": "frontend/roslyn/samples/AliasDisposeSample.cs" + }, + { + "blob": "6031f887cfb754c9de522b843d8d8a547eab32e6", + "path": "frontend/roslyn/samples/AliasedSourceViewModel.cs" + }, + { + "blob": "55ff2b817a92c0da3d2081ca91d6d29671de54d9", + "path": "frontend/roslyn/samples/AppDomainShutdownSample.cs" + }, + { + "blob": "a7dbe6708effae84dfcf9f8057bb756de6e980f2", + "path": "frontend/roslyn/samples/AppLifetimeSample.cs" + }, + { + "blob": "37f8adf21b1e9b2d27e6baf91e84b83de163cb8b", + "path": "frontend/roslyn/samples/AppScopedSourceSample.cs" + }, + { + "blob": "08096e0cc1b6aafc79eed60e5c6ef547e4056e4f", + "path": "frontend/roslyn/samples/AssociatedObjectSourceSample.cs" + }, + { + "blob": "9e6a77034b2e031631fb76745ef55a00d82bc3c8", + "path": "frontend/roslyn/samples/BodyThrowEdgesSample.cs" + }, + { + "blob": "c5ac84d050c01ed6139a2f691b71dce1b014b41b", + "path": "frontend/roslyn/samples/CloseReleaseSample.cs" + }, + { + "blob": "02fb37ca09d02cea02e2a47ed117a0152ad573a9", + "path": "frontend/roslyn/samples/ColumnAnchorsSample.cs" + }, + { + "blob": "21aa5461b2218dd5ca3f5e7af4180ac439ed9e46", + "path": "frontend/roslyn/samples/CustomerViewModel.cs" + }, + { + "blob": "c10f0f0ec7276d6662a2b373a37b90190d2515eb", + "path": "frontend/roslyn/samples/DiCaptiveSample.cs" + }, + { + "blob": "101d4360a6975cd22ff53878c1d8fe1285dd3625", + "path": "frontend/roslyn/samples/DisposableFieldViewModel.cs" + }, + { + "blob": "a51987e54a530a7599e0b380b14f997156567547", + "path": "frontend/roslyn/samples/DpRotationSample.cs" + }, + { + "blob": "cd7d85bb4c42d6fa4765440ba02573a8d904e4ce", + "path": "frontend/roslyn/samples/EmptyDisposeSample.cs" + }, + { + "blob": "b2ac5868a5b4a14f1c9581ccc08e36bea2a96c1d", + "path": "frontend/roslyn/samples/EventSourceCountersSample.cs" + }, + { + "blob": "91e723c120a686971ca2b7efaabfa306b9d831b2", + "path": "frontend/roslyn/samples/ExternalRefSubscription.cs" + }, + { + "blob": "60233494795aa9b81fd7fabe227343305acb3548", + "path": "frontend/roslyn/samples/FactoryAdoptSample.cs" + }, + { + "blob": "9fb14588b0d77049f20cc9cfd94b1c8bc01bcf8f", + "path": "frontend/roslyn/samples/FactoryLeakSample.cs" + }, + { + "blob": "b85092085ad8b6cd5b5b199cc26c8921c41dd605", + "path": "frontend/roslyn/samples/FieldReleaseSample.cs" + }, + { + "blob": "4c8a6927f8ed6437ca50e4dba61093e79b907e61", + "path": "frontend/roslyn/samples/FixCandidatesSample.cs" + }, + { + "blob": "5d63dcb6470a2c50a8f4cbe0fe2d19cf7fd3a465", + "path": "frontend/roslyn/samples/FixRewriteSample.cs" + }, + { + "blob": "8139f06f89bda2826ac092cf9895bb1d52c2e930", + "path": "frontend/roslyn/samples/FlowLocalsSample.cs" + }, + { + "blob": "b9ba1bd05f7c3a4ba3447905cf1f8cd8e0efc561", + "path": "frontend/roslyn/samples/InjectedDcViewSample.xaml.cs" + }, + { + "blob": "b1526d6820914accc93cf517094dcd9e6362b57b", + "path": "frontend/roslyn/samples/LambdaHandlerViewModel.cs" + }, + { + "blob": "d9e97be3849357732f4cddd71692866d54b08909", + "path": "frontend/roslyn/samples/LambdaTiersSample.cs" + }, + { + "blob": "a1c7d3cdd2f59a9e9f295456c7900b65c86c5fcb", + "path": "frontend/roslyn/samples/LocalDisposableSample.cs" + }, + { + "blob": "20f7002ac617caae05053efad11b1c6626830493", + "path": "frontend/roslyn/samples/MemoryOwnerEscapeSample.cs" + }, + { + "blob": "d7d17688ee408e9f400840f42cd649edd67098a3", + "path": "frontend/roslyn/samples/MessengerViewModel.cs" + }, + { + "blob": "8c78b8537be0bd6dd22a9d331bbbc3649030e07a", + "path": "frontend/roslyn/samples/OrdersViewModel.cs" + }, + { + "blob": "b27be0a78d81e6d40117f627c01c70686dbb9309", + "path": "frontend/roslyn/samples/OverloadSigSample.cs" + }, + { + "blob": "2a151381d555094a533c99ad6de777562c5e29e3", + "path": "frontend/roslyn/samples/OwnIgnoreSample.cs" + }, + { + "blob": "ed6813a5ab0a7c0c4b83099851665d7981e66e12", + "path": "frontend/roslyn/samples/OwnedCollectionElementSample.cs" + }, + { + "blob": "0337264bc3de8a385aa34868a25e106b21a5c0ef", + "path": "frontend/roslyn/samples/PipeFieldsSample.cs" + }, + { + "blob": "76592f6a3b5a4ff9267281cec30f85a6ea73c9e3", + "path": "frontend/roslyn/samples/PooledBufferSample.cs" + }, + { + "blob": "51825daad0d71588bc131cea2f8a141df116fc40", + "path": "frontend/roslyn/samples/RequerySuggestedAllowlistSample.cs" + }, + { + "blob": "2d9c2b2f1e9968d779ee1c143ebf9700a06e04eb", + "path": "frontend/roslyn/samples/ResolvedDisposableSample.cs" + }, + { + "blob": "af288a010502b698abe3f3c89c8b926d02602ed5", + "path": "frontend/roslyn/samples/ReturnedPublisherSample.cs" + }, + { + "blob": "b333b55e02c363f7fdf1a3b4dd6614c30ee809de", + "path": "frontend/roslyn/samples/SampleTypes.cs" + }, + { + "blob": "43775ca64f0fa022bad0a0e5fd4ab81a0388a63a", + "path": "frontend/roslyn/samples/SelfDetachingHandlerSample.cs" + }, + { + "blob": "2dc120c7cc0da9897b2dedbc4cf08a18f41e09bb", + "path": "frontend/roslyn/samples/SelfOwnedControlParts.cs" + }, + { + "blob": "c5d9e33e7aab3b008fdd49b6ea678340ab5805df", + "path": "frontend/roslyn/samples/SelfOwnedViewModel.cs" + }, + { + "blob": "76b04623e0e45ef8710cca1ad27733f67b62dafa", + "path": "frontend/roslyn/samples/SemaphoreFieldSample.cs" + }, + { + "blob": "e31cab4f6892f48041a3e881c980a8bbdd4773ea", + "path": "frontend/roslyn/samples/StaticClassEscapeSample.cs" + }, + { + "blob": "c3f958ded180e900a396f73bed3173fefcd44a6a", + "path": "frontend/roslyn/samples/StaticEventEscapeViewModel.cs" + }, + { + "blob": "921a969a9e683e1168d5fa4df1be86d216c1b272", + "path": "frontend/roslyn/samples/StaticHandlerViewModel.cs" + }, + { + "blob": "8d7ffe27b6b75c063b8f2d87bdefa12993737035", + "path": "frontend/roslyn/samples/TemplatePartLocalCaptureSample.cs" + }, + { + "blob": "31961de2bbd09e3cf564ae1b32d1d5ec31312ca8", + "path": "frontend/roslyn/samples/TierBSample.cs" + }, + { + "blob": "0b7d93c5d460dac3d2b08c209a3fb6de20c6eeb2", + "path": "frontend/roslyn/samples/TimerViewModel.cs" + }, + { + "blob": "369eeb6b860eb57766bf925ca432e73e8a4e2d55", + "path": "frontend/roslyn/samples/UnitOfWorkFlowSample.cs" + }, + { + "blob": "56c7601cf82f008e0c1c3bc7fcd19203b076fcb3", + "path": "frontend/roslyn/samples/UsingFieldAcquisitionSample.cs" + }, + { + "blob": "c704b62363503bdf08ff441d1e0ddbe2646af939", + "path": "frontend/roslyn/samples/ViewOwnsVmSample.xaml.cs" + }, + { + "blob": "fa1e6e2ba28c9c61679a373afd42cedf0fc6f6df", + "path": "frontend/roslyn/samples/VoidSubscribeSample.cs" + }, + { + "blob": "f067d4bbaba417247264b614a5b64e24283a3e47", + "path": "frontend/roslyn/samples/WeakSubscribeAllowlistSample.cs" + }, + { + "blob": "49d4b1aa29d6fffb4a66bef39698c14e4e3e1d03", + "path": "frontend/roslyn/samples/WeakSubscribeRxNoEventsSample.cs" + }, + { + "blob": "e4a3925648e8f40e4659b3ee87ed6da7b8160d98", + "path": "frontend/roslyn/samples/WeakSubscribeUnresolvedSample.cs" + }, + { + "blob": "24a344692519d34e6b3eea683e854c7d2973abab", + "path": "frontend/roslyn/samples/WhenAnyValueViewModel.cs" + }, + { + "blob": "47242c681bca9f6e98cf06e0cfddd46764205140", + "path": "frontend/roslyn/samples/WinFormsDisposalSample.cs" + }, + { + "blob": "dcc97874007b671df84d40bf24c48a76ebd40fe2", + "path": "frontend/roslyn/samples/WinFormsModelessSample.cs" + }, + { + "blob": "0487e4847c221f7256c2598a523a0a4037ed0906", + "path": "frontend/roslyn/samples/weaved-linked/Shared/SharedEnumerator.cs" + }, + { + "blob": "ce79c24883be50189a02547d148aca4bff80b770", + "path": "frontend/roslyn/samples/weaved/WeavedEmptyDispose.cs" + } + ], + "analysis_manifest_sha256": "325a580da5dc78493744e080fb497a4bba5fc6b21c8a01058793b99686cb894a", + "artifacts": { + "own-shadow-engine": { + "binary": "own-shadow-engine", + "bytes": 1819088, + "cargo": "cargo 1.94.1 (29ea6fb6a 2026-03-24)", + "cargo_argv": [ + "cargo", + "build", + "--locked", + "--release", + "--message-format=json", + "-p", + "own-shadow", + "--bin", + "own-shadow-engine" + ], + "cargo_clean_argv": [ + "cargo", + "clean", + "--release", + "-p", + "own-shadow" + ], + "cargo_lock_blob": "d8adbb1dc4d90da0c80aa1a2d8ba85bef805620f", + "cargo_lock_sha256": "17553420691d96febcfac54bd8f530b4f9e2a1ad7c79e6aaa022510e56692f45", + "dirty": false, + "executable": "/home/tandem/cargo-target/release/own-shadow-engine", + "executed": { + "bytes": 1819088, + "post_run_intact": true, + "sealed_path": "/home/tandem/owen-p037-a2/tmp/p037-take-5qf9ce39/own-shadow-engine", + "sha256": "21a311088337be0875d8803a51ce1be726bba5a5efe672359ed9dfdb8511e210" + }, + "host": "x86_64-unknown-linux-gnu", + "package": "own-shadow", + "profile": "release", + "rebuilt_by_this_call": true, + "repo_path": null, + "rustc": "rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8", + "sha256": "21a311088337be0875d8803a51ce1be726bba5a5efe672359ed9dfdb8511e210", + "source_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2" + } + }, + "dirty": false, + "documents": { + "repo-tree": { + "facts": { + "algorithm": "sha256", + "bytes": 145029, + "digest": "5358c33af1d38e975893374fafb2684d6db2c5e72511cee9d5f813bc02e9aaa1" + }, + "inputs": [ + "audit/runtime/DuplicateDetector/Program.cs", + "audit/runtime/LeakHarness/HeapCounter.cs", + "audit/runtime/LeakHarness/Program.cs", + "audit/runtime/LeakHarness/Scenario.cs", + "audit/runtime/PropertyChangedStorm/Program.cs", + "audit/runtime/RetentionPath/Heap.cs", + "audit/runtime/RetentionPath/Program.cs", + "frontend/roslyn/Owen.CSharp.Rewriter/Program.cs", + "frontend/roslyn/OwnSharp.Cli/CheckCommand.cs", + "frontend/roslyn/OwnSharp.Cli/CompareMode.cs", + "frontend/roslyn/OwnSharp.Cli/CoreVendor.cs", + "frontend/roslyn/OwnSharp.Cli/CrashReport.cs", + "frontend/roslyn/OwnSharp.Cli/EngineRunner.cs", + "frontend/roslyn/OwnSharp.Cli/EngineSelection.cs", + "frontend/roslyn/OwnSharp.Cli/Program.cs", + "frontend/roslyn/OwnSharp.Cli/PythonResolver.cs", + "frontend/roslyn/OwnSharp.Cli/RustCoreLocator.cs", + "frontend/roslyn/OwnSharp.Cli/ToolVersion.cs", + "frontend/roslyn/OwnSharp.Extractor/Program.cs", + "frontend/roslyn/OwnSharp.WeakTargetProbe/Program.cs", + "frontend/roslyn/project-input-sample/CustomerSubscription.cs", + "frontend/roslyn/samples/AliasDisposeSample.cs", + "frontend/roslyn/samples/AliasedSourceViewModel.cs", + "frontend/roslyn/samples/AppDomainShutdownSample.cs", + "frontend/roslyn/samples/AppLifetimeSample.cs", + "frontend/roslyn/samples/AppScopedSourceSample.cs", + "frontend/roslyn/samples/AssociatedObjectSourceSample.cs", + "frontend/roslyn/samples/BodyThrowEdgesSample.cs", + "frontend/roslyn/samples/CloseReleaseSample.cs", + "frontend/roslyn/samples/ColumnAnchorsSample.cs", + "frontend/roslyn/samples/CustomerViewModel.cs", + "frontend/roslyn/samples/DiCaptiveSample.cs", + "frontend/roslyn/samples/DisposableFieldViewModel.cs", + "frontend/roslyn/samples/DpRotationSample.cs", + "frontend/roslyn/samples/EmptyDisposeSample.cs", + "frontend/roslyn/samples/EventSourceCountersSample.cs", + "frontend/roslyn/samples/ExternalRefSubscription.cs", + "frontend/roslyn/samples/FactoryAdoptSample.cs", + "frontend/roslyn/samples/FactoryLeakSample.cs", + "frontend/roslyn/samples/FieldReleaseSample.cs", + "frontend/roslyn/samples/FixCandidatesSample.cs", + "frontend/roslyn/samples/FixRewriteSample.cs", + "frontend/roslyn/samples/FlowLocalsSample.cs", + "frontend/roslyn/samples/InjectedDcViewSample.xaml.cs", + "frontend/roslyn/samples/LambdaHandlerViewModel.cs", + "frontend/roslyn/samples/LambdaTiersSample.cs", + "frontend/roslyn/samples/LocalDisposableSample.cs", + "frontend/roslyn/samples/MemoryOwnerEscapeSample.cs", + "frontend/roslyn/samples/MessengerViewModel.cs", + "frontend/roslyn/samples/OrdersViewModel.cs", + "frontend/roslyn/samples/OverloadSigSample.cs", + "frontend/roslyn/samples/OwnIgnoreSample.cs", + "frontend/roslyn/samples/OwnedCollectionElementSample.cs", + "frontend/roslyn/samples/PipeFieldsSample.cs", + "frontend/roslyn/samples/PooledBufferSample.cs", + "frontend/roslyn/samples/RequerySuggestedAllowlistSample.cs", + "frontend/roslyn/samples/ResolvedDisposableSample.cs", + "frontend/roslyn/samples/ReturnedPublisherSample.cs", + "frontend/roslyn/samples/SampleTypes.cs", + "frontend/roslyn/samples/SelfDetachingHandlerSample.cs", + "frontend/roslyn/samples/SelfOwnedControlParts.cs", + "frontend/roslyn/samples/SelfOwnedViewModel.cs", + "frontend/roslyn/samples/SemaphoreFieldSample.cs", + "frontend/roslyn/samples/StaticClassEscapeSample.cs", + "frontend/roslyn/samples/StaticEventEscapeViewModel.cs", + "frontend/roslyn/samples/StaticHandlerViewModel.cs", + "frontend/roslyn/samples/TemplatePartLocalCaptureSample.cs", + "frontend/roslyn/samples/TierBSample.cs", + "frontend/roslyn/samples/TimerViewModel.cs", + "frontend/roslyn/samples/UnitOfWorkFlowSample.cs", + "frontend/roslyn/samples/UsingFieldAcquisitionSample.cs", + "frontend/roslyn/samples/ViewOwnsVmSample.xaml.cs", + "frontend/roslyn/samples/VoidSubscribeSample.cs", + "frontend/roslyn/samples/WeakSubscribeAllowlistSample.cs", + "frontend/roslyn/samples/WeakSubscribeRxNoEventsSample.cs", + "frontend/roslyn/samples/WeakSubscribeUnresolvedSample.cs", + "frontend/roslyn/samples/WhenAnyValueViewModel.cs", + "frontend/roslyn/samples/WinFormsDisposalSample.cs", + "frontend/roslyn/samples/WinFormsModelessSample.cs", + "frontend/roslyn/samples/weaved-linked/Shared/SharedEnumerator.cs", + "frontend/roslyn/samples/weaved/WeavedEmptyDispose.cs" + ], + "python-ownlang": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/UnitOfWorkFlowSample.cs", + "line": 0, + "method": "Catalog.CatalogService.CreateUnitOfWork", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/UnitOfWorkFlowSample.cs", + "line": 0, + "method": "Catalog.CatalogService.GetProductsFromCatalogWODocuments", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/UnitOfWorkFlowSample.cs", + "line": 0, + "method": "Catalog.CatalogService.ImportProducts", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/ColumnAnchorsSample.cs", + "line": 0, + "method": "ColumnAnchorsSample.TwoLeaksOneLine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryLeakSample.cs", + "line": 0, + "method": "Factories.FactoryConsumers.Clean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryLeakSample.cs", + "line": 0, + "method": "Factories.FactoryConsumers.Leaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryLeakSample.cs", + "line": 0, + "method": "Factories.StreamFactory.Make", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CatchThenDisposeAfter", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.Clean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CryptoFactoryDisposed", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CryptoFactoryLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CtorInLambdaNotThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CtorThrowLeaksPrior", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposeAsyncConfiguredInTry", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposeInsideIfWithThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposeOnThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposedAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposedAsyncConfigured", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DoClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DoLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DoubleDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.EarlyReturnLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.Escapes", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ForIncrementorBodyUseAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ForLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ForeachLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.HasLoop", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.LeakOnElse", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.NameofInLambda", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.NestedThrowLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.NullCondFinallyDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.OutArgRebindSuppressesLaterUse", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.OutArgSiblingUseAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.PoolReturnedOnOnePath", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.QualifiedTypedCatchLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ReassignedView", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.RefArgUseAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SemaphoreLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SliceReassignAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SwitchAllDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SwitchOneLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TcpListenerNeverStopped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TcpListenerStopped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ThrowAfterAcquireLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ThrowAfterDisposeClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TimerLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TryFinallyClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TryFinallyReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TryNeverDisposed", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TypedCatchLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.UseAfterDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ValidatedThenClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ValidatedThenLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.WhileClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.WhileLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/BodyThrowEdgesSample.cs", + "line": 0, + "method": "Own.Samples.BodyThrowEdgesSample.AdjacentDisposeClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/BodyThrowEdgesSample.cs", + "line": 0, + "method": "Own.Samples.BodyThrowEdgesSample.MayThrowInFinallyClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/BodyThrowEdgesSample.cs", + "line": 0, + "method": "Own.Samples.BodyThrowEdgesSample.MayThrowLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/CloseReleaseSample.cs", + "line": 0, + "method": "Own.Samples.ClosesOtherInstanceField.CloseOther", + "params": [ + { + "disposable": true, + "index": 0, + "name": "other", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakBareInheritedAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakDerived", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakInheritedAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakLegacy", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakReader", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakReal", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.UseScratch", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsDisposalSample.cs", + "line": 0, + "method": "Own.Samples.ForeignContainerAdder.AttachTo", + "params": [ + { + "disposable": true, + "index": 0, + "name": "other", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/MemoryOwnerEscapeSample.cs", + "line": 0, + "method": "Own.Samples.MemoryOwnerEscape.PoolOwnerNotEscaped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/MemoryOwnerEscapeSample.cs", + "line": 0, + "method": "Own.Samples.MemoryOwnerEscape.ReadOnlyLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/AppDomainShutdownSample.cs", + "line": 0, + "method": "Own.Samples.NonAppDomainSubscriber..ctor", + "params": [ + { + "disposable": true, + "index": 0, + "name": "cts", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/AliasDisposeSample.cs", + "line": 0, + "method": "Own.Samples.ScopedAliasNameLeak.Other", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/weaved/WeavedEmptyDispose.cs", + "line": 0, + "method": "Own.Samples.Weaved.WeavedConsumer.Count", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/audit/runtime/RetentionPath/Program.cs", + "line": 0, + "method": "OwnNet.Audit.Runtime.Program.Census", + "params": [ + { + "disposable": true, + "index": 0, + "name": "walker", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/OwnSharp.Cli/EngineRunner.cs", + "line": 0, + "method": "OwnSharp.Cli.EngineRunner.DrainAsync", + "params": [ + { + "disposable": true, + "index": 0, + "name": "stream", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptDouble", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptInnerOnly", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptTargetTyped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.NonAdoptDoubleOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.StreamAdopter..ctor", + "params": [ + { + "disposable": true, + "index": 0, + "name": "inner", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.StreamHolder..ctor", + "params": [ + { + "disposable": true, + "index": 0, + "name": "held", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/PooledBufferSample.cs", + "line": 0, + "method": "PoolApp.Hasher.CleanHash", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/PooledBufferSample.cs", + "line": 0, + "method": "PoolApp.Hasher.LeakyHash", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.ConnectionResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.ExprBodiedResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.RequestResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.ScopedResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Drop", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Open", + "params": [ + { + "disposable": true, + "index": 0, + "name": "existing", + "transfer": "no" + } + ], + "returns": { + "owned": "unknown" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Open(System.IO.FileStream,System.Boolean)", + "params": [ + { + "disposable": true, + "index": 0, + "name": "existing", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Open(System.String)", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/LocalDisposableSample.cs", + "line": 0, + "method": "Streams.Loader.Leaky", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/LocalDisposableSample.cs", + "line": 0, + "method": "Streams.Loader.Transfer", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModalLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModalOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModeless", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModelessConditional", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + }, + "rust-own-bridge": { + "document": { + "degraded": null, + "module": "Extracted", + "ownir_version": 0, + "summaries": [ + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/UnitOfWorkFlowSample.cs", + "line": 0, + "method": "Catalog.CatalogService.CreateUnitOfWork", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/UnitOfWorkFlowSample.cs", + "line": 0, + "method": "Catalog.CatalogService.GetProductsFromCatalogWODocuments", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/UnitOfWorkFlowSample.cs", + "line": 0, + "method": "Catalog.CatalogService.ImportProducts", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/ColumnAnchorsSample.cs", + "line": 0, + "method": "ColumnAnchorsSample.TwoLeaksOneLine", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryLeakSample.cs", + "line": 0, + "method": "Factories.FactoryConsumers.Clean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryLeakSample.cs", + "line": 0, + "method": "Factories.FactoryConsumers.Leaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryLeakSample.cs", + "line": 0, + "method": "Factories.StreamFactory.Make", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CatchThenDisposeAfter", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.Clean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CryptoFactoryDisposed", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CryptoFactoryLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CtorInLambdaNotThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.CtorThrowLeaksPrior", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposeAsyncConfiguredInTry", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposeInsideIfWithThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposeOnThrow", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposedAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DisposedAsyncConfigured", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DoClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DoLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.DoubleDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.EarlyReturnLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.Escapes", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ForIncrementorBodyUseAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ForLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ForeachLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.HasLoop", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.LeakOnElse", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.NameofInLambda", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.NestedThrowLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.NullCondFinallyDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.OutArgRebindSuppressesLaterUse", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.OutArgSiblingUseAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.PoolReturnedOnOnePath", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.QualifiedTypedCatchLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ReassignedView", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.RefArgUseAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SemaphoreLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SliceReassignAfterReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SwitchAllDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.SwitchOneLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TcpListenerNeverStopped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TcpListenerStopped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ThrowAfterAcquireLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ThrowAfterDisposeClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TimerLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TryFinallyClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TryFinallyReturn", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TryNeverDisposed", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.TypedCatchLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.UseAfterDispose", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ValidatedThenClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.ValidatedThenLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.WhileClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FlowLocalsSample.cs", + "line": 0, + "method": "FlowLocalsSample.WhileLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/BodyThrowEdgesSample.cs", + "line": 0, + "method": "Own.Samples.BodyThrowEdgesSample.AdjacentDisposeClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/BodyThrowEdgesSample.cs", + "line": 0, + "method": "Own.Samples.BodyThrowEdgesSample.MayThrowInFinallyClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/BodyThrowEdgesSample.cs", + "line": 0, + "method": "Own.Samples.BodyThrowEdgesSample.MayThrowLeaks", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/CloseReleaseSample.cs", + "line": 0, + "method": "Own.Samples.ClosesOtherInstanceField.CloseOther", + "params": [ + { + "disposable": true, + "index": 0, + "name": "other", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakBareInheritedAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakDerived", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakInheritedAsync", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakLegacy", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakReader", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.LeakReal", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/EmptyDisposeSample.cs", + "line": 0, + "method": "Own.Samples.EmptyDisposeConsumers.UseScratch", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsDisposalSample.cs", + "line": 0, + "method": "Own.Samples.ForeignContainerAdder.AttachTo", + "params": [ + { + "disposable": true, + "index": 0, + "name": "other", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/MemoryOwnerEscapeSample.cs", + "line": 0, + "method": "Own.Samples.MemoryOwnerEscape.PoolOwnerNotEscaped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/MemoryOwnerEscapeSample.cs", + "line": 0, + "method": "Own.Samples.MemoryOwnerEscape.ReadOnlyLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/AppDomainShutdownSample.cs", + "line": 0, + "method": "Own.Samples.NonAppDomainSubscriber..ctor", + "params": [ + { + "disposable": true, + "index": 0, + "name": "cts", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/AliasDisposeSample.cs", + "line": 0, + "method": "Own.Samples.ScopedAliasNameLeak.Other", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/weaved/WeavedEmptyDispose.cs", + "line": 0, + "method": "Own.Samples.Weaved.WeavedConsumer.Count", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/audit/runtime/RetentionPath/Program.cs", + "line": 0, + "method": "OwnNet.Audit.Runtime.Program.Census", + "params": [ + { + "disposable": true, + "index": 0, + "name": "walker", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/OwnSharp.Cli/EngineRunner.cs", + "line": 0, + "method": "OwnSharp.Cli.EngineRunner.DrainAsync", + "params": [ + { + "disposable": true, + "index": 0, + "name": "stream", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptClean", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptDouble", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptInnerOnly", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.AdoptTargetTyped", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.AdoptConsumers.NonAdoptDoubleOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.StreamAdopter..ctor", + "params": [ + { + "disposable": true, + "index": 0, + "name": "inner", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/FactoryAdoptSample.cs", + "line": 0, + "method": "OwnSharp.Samples.StreamHolder..ctor", + "params": [ + { + "disposable": true, + "index": 0, + "name": "held", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/PooledBufferSample.cs", + "line": 0, + "method": "PoolApp.Hasher.CleanHash", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/PooledBufferSample.cs", + "line": 0, + "method": "PoolApp.Hasher.LeakyHash", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.ConnectionResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.ExprBodiedResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.RequestResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/DiCaptiveSample.cs", + "line": 0, + "method": "Sample.ScopedResolver.Warm", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Drop", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Open", + "params": [ + { + "disposable": true, + "index": 0, + "name": "existing", + "transfer": "no" + } + ], + "returns": { + "owned": "unknown" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Open(System.IO.FileStream,System.Boolean)", + "params": [ + { + "disposable": true, + "index": 0, + "name": "existing", + "transfer": "no" + } + ], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/OverloadSigSample.cs", + "line": 0, + "method": "SigOverloads.Open(System.String)", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/LocalDisposableSample.cs", + "line": 0, + "method": "Streams.Loader.Leaky", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/LocalDisposableSample.cs", + "line": 0, + "method": "Streams.Loader.Transfer", + "params": [], + "returns": { + "owned": "fresh" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModalLeak", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModalOk", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModeless", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + }, + { + "file": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849/frontend/roslyn/samples/WinFormsModelessSample.cs", + "line": 0, + "method": "WinFormsModelessSample.OpenModelessConditional", + "params": [], + "returns": { + "owned": "none" + }, + "source": "inferred" + } + ], + "unresolved": [] + }, + "status": "produced" + } + } + }, + "execution_profile": { + "dotnet": { + "runtimes": [ + "Microsoft.AspNetCore.App 8.0.31", + "Microsoft.NETCore.App 8.0.31" + ], + "sdk": "8.0.425" + }, + "platform": { + "machine": "x86_64", + "system": "Linux" + }, + "python": { + "implementation": "CPython", + "version": "3.11.15 (main, Sep 19 2026, 00:18:08) [GCC 16.1.1 20260625]" + }, + "rust": { + "cargo": "cargo 1.94.1 (29ea6fb6a 2026-03-24)", + "host": "x86_64-unknown-linux-gnu", + "rustc": "rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8" + } + }, + "input_roots": [ + "frontend", + "audit" + ], + "instrument_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py" + ], + "is_evidence": true, + "materialization_root": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/325a580da5dc7849", + "population_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "post_run_population_intact": true, + "reference_profile": { + "OWN_EXTRA_REF_DIRS": "removed-from-child-environment", + "observed_extra_reference_lines": 0 + }, + "schema": "p037-mos-snapshot/2", + "source": "repo", + "source_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "subject_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py", + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ], + "support_manifest": [ + { + "blob": "a070b9f433e0c5fe22afc9f7b33a7efd41026d70", + "mechanism": "sibling-xaml", + "path": "frontend/roslyn/samples/InjectedDcViewSample.xaml" + }, + { + "blob": "344654a106208d92789ff63672693ef823333743", + "mechanism": "sibling-xaml", + "path": "frontend/roslyn/samples/ViewOwnsVmSample.xaml" + }, + { + "blob": "b41ca452d4adffe860129074c164062685b1e37d", + "mechanism": "ancestor-fody", + "path": "frontend/roslyn/samples/weaved/FodyWeavers.xml" + } + ], + "support_manifest_sha256": "9002111b5cdcce3f8d09beb75060b131678f315f6aca708713b884ebf2b553fa", + "treatment_paths": [ + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ] +} diff --git a/docs/evidence/p037-a2-baseline-verdict-python.json b/docs/evidence/p037-a2-baseline-verdict-python.json new file mode 100644 index 00000000..98725e99 --- /dev/null +++ b/docs/evidence/p037-a2-baseline-verdict-python.json @@ -0,0 +1,1662 @@ +{ + "analysis_manifest": [ + { + "blob": "38d180096c63c7d01d7bb39601c1f88e3a53f67e", + "path": "corpus/di/singleton-captures-scoped-dbcontext/after.cs" + }, + { + "blob": "4d6f60e065d7e2572bc457e3df6a593b6a4699c4", + "path": "corpus/di/singleton-captures-scoped-dbcontext/before.cs" + }, + { + "blob": "67c4aa0b15fa0782d865cbd1c5ef355fbc926f8f", + "path": "corpus/fixtures/systemevents-console/Program.cs" + }, + { + "blob": "c9d140949acfe06bd187404508a46b6b61a7c89e", + "path": "corpus/p036-bakeoff/guarded-consume-early-return/after.cs" + }, + { + "blob": "c80dee0bc66037c3c4ae7ff8ce8125ba145f8156", + "path": "corpus/p036-bakeoff/guarded-consume-early-return/before.cs" + }, + { + "blob": "b13ab3891e11f2281754d5c5664fc92bc97710c5", + "path": "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs" + }, + { + "blob": "482151f9ed085819fc82bbe85df003beec21ed02", + "path": "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs" + }, + { + "blob": "b60e95a076611d3661fef95091f041ba228d546e", + "path": "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs" + }, + { + "blob": "b93a52759704651ccb7d09d946c0900c8ab46e54", + "path": "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs" + }, + { + "blob": "48b0accda29b02366d4f652b5c05c2ee7956f6d2", + "path": "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs" + }, + { + "blob": "77cc02f8920b8ac424dd0854d2a1ec188329a01b", + "path": "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs" + }, + { + "blob": "0d862db009407131da16a23b1cc255d3155a64b2", + "path": "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs" + }, + { + "blob": "28a89ec5ee3eb48673ec895f3bd0f8404ec29e99", + "path": "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs" + }, + { + "blob": "faf7be2c04decc1a966a5870e0641ec47d72da5c", + "path": "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs" + }, + { + "blob": "87f06ebe8d6842ec1011a0c8e935c92fd47ee714", + "path": "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs" + }, + { + "blob": "1faa3a7b8fa19ae08128e1b1f30d6dfae1e9f534", + "path": "corpus/real-world/ado-executereader-leak/after.cs" + }, + { + "blob": "d69020eceb2c3619ce3d2f6f36715d97aad5b616", + "path": "corpus/real-world/ado-executereader-leak/before.cs" + }, + { + "blob": "d36d794ecd78e95a99964ecd5ff4e66cc1352e43", + "path": "corpus/real-world/arraypool-aliased-receiver/after.cs" + }, + { + "blob": "3ee0cbfd662aec91a0c437ade04ef9f5a885280a", + "path": "corpus/real-world/arraypool-aliased-receiver/before.cs" + }, + { + "blob": "9c319b50c8147b72a07f2c4c643c936d9849e35c", + "path": "corpus/real-world/arraypool-double-return/after.cs" + }, + { + "blob": "9dc6c22a359a922ea104e2babd1f6c3cb18c55aa", + "path": "corpus/real-world/arraypool-double-return/before.cs" + }, + { + "blob": "fa9fce58d4d9f62a37ab0cd5b88b49627b6e2553", + "path": "corpus/real-world/arraypool-field-fullspan-overread/after.cs" + }, + { + "blob": "768af16266ec428afdb343185a654138d1d04d71", + "path": "corpus/real-world/arraypool-field-fullspan-overread/before.cs" + }, + { + "blob": "3c45a05482eae50f6c68f806e80e1bd030f30151", + "path": "corpus/real-world/arraypool-fullspan-overread/after.cs" + }, + { + "blob": "991b898ca1f564320ee3f5b9eba69e56b5607f6d", + "path": "corpus/real-world/arraypool-fullspan-overread/before.cs" + }, + { + "blob": "8f1c0de961065338fa611e1ac2b3e93099d1a390", + "path": "corpus/real-world/arraypool-length-overread/after.cs" + }, + { + "blob": "0c7d64c1159b4041118b674a912a7f5533e8a301", + "path": "corpus/real-world/arraypool-length-overread/before.cs" + }, + { + "blob": "8c8794e57d810cd542d90c12cea06ff1c034a0fc", + "path": "corpus/real-world/arraypool-memory-view-escape/after.cs" + }, + { + "blob": "7a29e26ef81bc82f98b5c19f626ead25de43986e", + "path": "corpus/real-world/arraypool-memory-view-escape/before.cs" + }, + { + "blob": "debff6f8435c5f396cd1b00d9c12cf09102d13f9", + "path": "corpus/real-world/arraypool-span-view-after-return/after.cs" + }, + { + "blob": "818d3c8cba0b5dbcc9cec5993322d2e04c840f17", + "path": "corpus/real-world/arraypool-span-view-after-return/before.cs" + }, + { + "blob": "708735216525a12901b06cce249aa65f37b5da6b", + "path": "corpus/real-world/arraypool-use-after-return/after.cs" + }, + { + "blob": "0506cd9adcf09ac17e98c56d713d33b516a791af", + "path": "corpus/real-world/arraypool-use-after-return/before.cs" + }, + { + "blob": "6ec2e76f1070f5a1fa3942e11f7e5e5009fe7a03", + "path": "corpus/real-world/arraypool-view-into-field-overread/after.cs" + }, + { + "blob": "5c72fc7284fec7a262a66a499e3197cc663771ac", + "path": "corpus/real-world/arraypool-view-into-field-overread/before.cs" + }, + { + "blob": "02e54d36919c8d03bce56321faa1f7efabb981f9", + "path": "corpus/real-world/field-dispose-via-exchange/after.cs" + }, + { + "blob": "b532135df2f7946e70829834444059b840a168f5", + "path": "corpus/real-world/field-dispose-via-exchange/before.cs" + }, + { + "blob": "c9b071d49cbddd567a108425de4cd7803886b1c6", + "path": "corpus/real-world/field-dispose-via-helper/after.cs" + }, + { + "blob": "7d232b848ef85fbb55deafaff024084a857d7edd", + "path": "corpus/real-world/field-dispose-via-helper/before.cs" + }, + { + "blob": "a07539757bc6bf6ae24766092f56f72ca7bf3010", + "path": "corpus/real-world/field-noop-dispose-wrapper/after.cs" + }, + { + "blob": "8fd5c820e25bab6682f5b02e43b562d2305410a3", + "path": "corpus/real-world/field-noop-dispose-wrapper/before.cs" + }, + { + "blob": "135a360400f5da99bcf6ba5a2efcd1413833e868", + "path": "corpus/real-world/local-dispose-via-using-statement/after.cs" + }, + { + "blob": "5c93e81a1c4bc7b43fd9493a73d2227926d6c069", + "path": "corpus/real-world/local-dispose-via-using-statement/before.cs" + }, + { + "blob": "c7d52d6ead47c013d221e5a3406b98044ced70a2", + "path": "corpus/real-world/memorypool-double-dispose/after.cs" + }, + { + "blob": "b0a3acd9dced8ea7f2bb4702e92984e2be53f931", + "path": "corpus/real-world/memorypool-double-dispose/before.cs" + }, + { + "blob": "51f5e21473f3831892c82e8b35277dc91108bdcf", + "path": "corpus/real-world/memorypool-using-owner-escape/after.cs" + }, + { + "blob": "bfc1b768c48074d67f7da744a2cfd1e58b77be06", + "path": "corpus/real-world/memorypool-using-owner-escape/before.cs" + }, + { + "blob": "2466da9d86248686070994b434beca526c51fe06", + "path": "corpus/real-world/memorypool-using-statement-view-escape/after.cs" + }, + { + "blob": "afc9ea74b3e8c407c06d7a797ba3673a926f5c3c", + "path": "corpus/real-world/memorypool-using-statement-view-escape/before.cs" + }, + { + "blob": "499ce51f09325341ddbbb8236944fa9bc2158eac", + "path": "corpus/real-world/memorypool-using-view-escape/after.cs" + }, + { + "blob": "45437c15fa6ec4e2b5f28f16cfc41155866f00ae", + "path": "corpus/real-world/memorypool-using-view-escape/before.cs" + }, + { + "blob": "7327ffa1666b4ba534fbb9a3f0d5f9d4a9e1b628", + "path": "corpus/real-world/memorypool-view-after-dispose/after.cs" + }, + { + "blob": "072dfa923df7e919913fc69e0d676e5ce2ebafa5", + "path": "corpus/real-world/memorypool-view-after-dispose/before.cs" + }, + { + "blob": "78eb173af727d40d4477ebb313cfcbf5291068c2", + "path": "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs" + }, + { + "blob": "a4deffc410b2dedfc5edb61cec3ef6f1777d0adf", + "path": "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs" + }, + { + "blob": "f2a81599a30d95c539b3918aeef3d4213e50c721", + "path": "corpus/real-world/ownership-handoff-consume/after.cs" + }, + { + "blob": "d65ba7b9424e36eb2c5e7e8fc7b390bdb2f6bfff", + "path": "corpus/real-world/ownership-handoff-consume/before.cs" + }, + { + "blob": "91134e9bd2cc709b0174e20c31e43b76b297df66", + "path": "corpus/real-world/ownership-handoff-use-transitive/after.cs" + }, + { + "blob": "2ed2ca15dfdea27d0f1a072d3b569eea7596b0b1", + "path": "corpus/real-world/ownership-handoff-use-transitive/before.cs" + }, + { + "blob": "8aacb78586d8441ea060a6fcac1590bb7c4e824e", + "path": "corpus/real-world/ownership-handoff-use/after.cs" + }, + { + "blob": "e4a61bf6023f4e32f54a1c4887e26c844f757f42", + "path": "corpus/real-world/ownership-handoff-use/before.cs" + }, + { + "blob": "a4f71bc85fc6219e309a7ffb2fe4659c7ba647cd", + "path": "corpus/real-world/pool-transfer-via-wrapper-local/after.cs" + }, + { + "blob": "004dfda6385ff8697c8c16aeb844bcfb46ca9a2a", + "path": "corpus/real-world/pool-transfer-via-wrapper-local/before.cs" + }, + { + "blob": "48fea235d362012f5482abbe598a69ba513f598a", + "path": "corpus/real-world/screentogif-loaded-subscription/after.cs" + }, + { + "blob": "f531ea536868381417fef0d8392bf956802ea194", + "path": "corpus/real-world/screentogif-loaded-subscription/before.cs" + }, + { + "blob": "f353a95c721347d12317acd7ea4b089495c9ec1a", + "path": "corpus/real-world/screentogif-systemevents-leak/after.cs" + }, + { + "blob": "f531e57e99f32029d1ae7b3df183c2785ef85714", + "path": "corpus/real-world/screentogif-systemevents-leak/before.cs" + }, + { + "blob": "671e8c665df0f4a951fd14002b056355b37019ea", + "path": "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs" + }, + { + "blob": "09dbfd123416af89eff3f8e301ec300f184a2d8d", + "path": "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs" + }, + { + "blob": "37eabf992f0e083364d20160a1ddf0c82c28b768", + "path": "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs" + }, + { + "blob": "2355f37e9fc8fc6b63e5023a2a2a18265b16d669", + "path": "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs" + }, + { + "blob": "74a99ffd338ef3cbf853cf2804c3a3ece8ed42a7", + "path": "corpus/real-world/socket-accept-leak/after.cs" + }, + { + "blob": "18a721ce6d07b7eed6cf97afef578d97e7ba2744", + "path": "corpus/real-world/socket-accept-leak/before.cs" + }, + { + "blob": "3be8156197c7e76fe60eee06028c65fe03407254", + "path": "corpus/real-world/subscription-self-owned-property/after.cs" + }, + { + "blob": "53ec5ba89ca9eb3791bcc7c2489c5884dd0acad7", + "path": "corpus/real-world/subscription-self-owned-property/before.cs" + }, + { + "blob": "601976e5600d97d6184fe5dc44b957c985a97115", + "path": "corpus/real-world/tcplistener-accept-leak/after.cs" + }, + { + "blob": "ab88672d4e90e99b7a8fb2a061d533a5a5ef0072", + "path": "corpus/real-world/tcplistener-accept-leak/before.cs" + }, + { + "blob": "dce3d96a463068f59288176541d5c75befa570b8", + "path": "corpus/real-world/tcplistener-acceptsocket-leak/after.cs" + }, + { + "blob": "6ae9c4c8faef9559b9ac4de4da1ba03c4acada5e", + "path": "corpus/real-world/tcplistener-acceptsocket-leak/before.cs" + }, + { + "blob": "b54a2b87b1f584a9a857c5f311d5874099910643", + "path": "corpus/real-world/using-statement-throw-releases/after.cs" + }, + { + "blob": "acc415ddf95c058de642d3a13e39226570ebf6e0", + "path": "corpus/real-world/using-statement-throw-releases/before.cs" + }, + { + "blob": "ef464e6cf0f0bb0c9d3941fa0fce881b78011bcb", + "path": "corpus/wpf/custom-weak-wrapper/after.cs" + }, + { + "blob": "d255613e1dbf311f93c34cbabc1ae304b648ea2b", + "path": "corpus/wpf/custom-weak-wrapper/before.cs" + }, + { + "blob": "30697c7b21435ea03352b9f1826938c88a60d3d9", + "path": "corpus/wpf/field-use-after-dispose/after.cs" + }, + { + "blob": "79fdb97a6375c5b1b6df5be6967bd22c738e9cce", + "path": "corpus/wpf/field-use-after-dispose/before.cs" + }, + { + "blob": "242fec8ebaf85ea83df4a0a27c9f1e6cac80a9b8", + "path": "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs" + }, + { + "blob": "445968e5bc0d6bb77950196774b5f645c6d56459", + "path": "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs" + }, + { + "blob": "2aaf3b53fba9dd98a72cbe7c2caed65cf89262fd", + "path": "corpus/wpf/handler-use-after-dispose/after.cs" + }, + { + "blob": "68e25c6b763c122df627b3e7847f548524db9d21", + "path": "corpus/wpf/handler-use-after-dispose/before.cs" + }, + { + "blob": "b62ced3b658f10929e98d5fca7c65401b4fc0aea", + "path": "corpus/wpf/pooled-view-after-dispose/after.cs" + }, + { + "blob": "4731249cfee1b47a750fbc11ac66b598b17453ae", + "path": "corpus/wpf/pooled-view-after-dispose/before.cs" + }, + { + "blob": "9b093f5e39f7087333b7f8f2c89a4b155e078edd", + "path": "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs" + }, + { + "blob": "e7d5904e1c32d78a267309faf6717be59a374aec", + "path": "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs" + }, + { + "blob": "cb3ed69a917c9516ddcafa5c7c55cc8467739fe5", + "path": "corpus/wpf/subscription-disposing-else-branch-release/after.cs" + }, + { + "blob": "d0e1dc7929300bc60f4349a7e0df29ca87d018ce", + "path": "corpus/wpf/subscription-disposing-else-branch-release/before.cs" + }, + { + "blob": "bae861a35a441a2fc7714d9904883bd576182ed4", + "path": "corpus/wpf/subscription-explicit-delegate-release/after.cs" + }, + { + "blob": "e86bb4d5ff49116c6fd49c045b7d4f5136add534", + "path": "corpus/wpf/subscription-explicit-delegate-release/before.cs" + }, + { + "blob": "8299b26e3d1d9ec7c15673ba148199aafac6c6ef", + "path": "corpus/wpf/subscription-finalizer-release/after.cs" + }, + { + "blob": "3d03e2c90b8c8cacd68ef93cf44587f3d299288d", + "path": "corpus/wpf/subscription-finalizer-release/before.cs" + }, + { + "blob": "622e8cd997b9d2acf731c3b415166568339adf3a", + "path": "corpus/wpf/subscription-nonteardown-release/after.cs" + }, + { + "blob": "54f7969790b8daa82b498f795e1341e63fc1dd89", + "path": "corpus/wpf/subscription-nonteardown-release/before.cs" + }, + { + "blob": "934577f5c5c294d77029d816908b69f276c6583c", + "path": "corpus/wpf/subscription-overload-conflated-cleanup/after.cs" + }, + { + "blob": "1a0462ebd958a6e7d1a23dae2b8c99a1fdf48700", + "path": "corpus/wpf/subscription-overload-conflated-cleanup/before.cs" + }, + { + "blob": "b1b9faf7f5ce931bc89316e239ec03b482cc6700", + "path": "corpus/wpf/subscription-param-guarded-unregister/after.cs" + }, + { + "blob": "015343c46671afe384fd1a60d38c107426a01420", + "path": "corpus/wpf/subscription-param-guarded-unregister/before.cs" + }, + { + "blob": "f57d5340e25a55538de23892e29c1718d3042e8f", + "path": "corpus/wpf/subscription-target-typed-delegate-release/after.cs" + }, + { + "blob": "b6ada87556cf82ab68f6c58afdfec9d85daa93ef", + "path": "corpus/wpf/subscription-target-typed-delegate-release/before.cs" + }, + { + "blob": "0cab64b233266ef06e6988f27326eded395271e3", + "path": "corpus/wpf/subscription-teardown-early-return-guard/after.cs" + }, + { + "blob": "85d32821de0a02990a5e1abf87eccc986bac6b93", + "path": "corpus/wpf/subscription-teardown-early-return-guard/before.cs" + }, + { + "blob": "23bd620a57b1a68d0cf6569125817caf3fb47efc", + "path": "corpus/wpf/subscription-uncalled-local-function/after.cs" + }, + { + "blob": "2e129b6bb1e183443a073bf083a3a04b844d9a98", + "path": "corpus/wpf/subscription-uncalled-local-function/before.cs" + }, + { + "blob": "292c674a95a34ddff1f9eace96bbd316dabafff5", + "path": "corpus/wpf/subscription-xaml-name-only-release/after.cs" + }, + { + "blob": "59c8548878d13a026de9ddc65534b38ae94f8864", + "path": "corpus/wpf/subscription-xaml-name-only-release/before.cs" + }, + { + "blob": "3062b7e371fb709c622ef5ac918f4682df990b3b", + "path": "corpus/wpf/systemevents-region-escape/after.cs" + }, + { + "blob": "5a89237790ae5b12d64a680288196c6ead8c6662", + "path": "corpus/wpf/systemevents-region-escape/before.cs" + }, + { + "blob": "4ab388af8e8ea1b1faaf154f0f878db498fce704", + "path": "corpus/wpf/timer-stop-disposing-else-branch/after.cs" + }, + { + "blob": "5c1a7e991a861b316bf08869ef425583d26da556", + "path": "corpus/wpf/timer-stop-disposing-else-branch/before.cs" + }, + { + "blob": "a8a4d710a2f06c25e43a106c1410800369696d74", + "path": "corpus/wpf/timer-stop-early-return-guard/after.cs" + }, + { + "blob": "2e8e5e241d7980c65a70857fa128400c23331fed", + "path": "corpus/wpf/timer-stop-early-return-guard/before.cs" + }, + { + "blob": "743a4fab56737068377dbc553a030cc87273a465", + "path": "corpus/wpf/timer-stop-finalizer-release/after.cs" + }, + { + "blob": "973df1396ee32098c045e55dff973b979f13c1fc", + "path": "corpus/wpf/timer-stop-finalizer-release/before.cs" + }, + { + "blob": "d8e77d9849476e5491b4dcc19a9e53e48ff39795", + "path": "corpus/wpf/timer-stop-nonteardown-release/after.cs" + }, + { + "blob": "a2b1699fa2ce74a8bfab34c8d63a2374a9696723", + "path": "corpus/wpf/timer-stop-nonteardown-release/before.cs" + }, + { + "blob": "d59b693ecf990fd43d60a1051544f40e1ad2c818", + "path": "corpus/wpf/timer-stop-param-guarded/after.cs" + }, + { + "blob": "012854a1e19f04133dc78ecbbd14a1cef8044622", + "path": "corpus/wpf/timer-stop-param-guarded/before.cs" + }, + { + "blob": "e76351d486fd80e1037a4bca2ab9783c7ae4c1fd", + "path": "corpus/wpf/timer-stop-uncalled-helper/after.cs" + }, + { + "blob": "42a743ff9743fd38551eaf687b0a96ac874f0eb8", + "path": "corpus/wpf/timer-stop-uncalled-helper/before.cs" + }, + { + "blob": "0a65c2215f03fc979d71d4f91458043e2b02a143", + "path": "corpus/wpf/timer-stop-uncalled-lambda/after.cs" + }, + { + "blob": "3c29d5f0fe3f49b79244fd482e18bc9a39b1bb52", + "path": "corpus/wpf/timer-stop-uncalled-lambda/before.cs" + }, + { + "blob": "39bef7650422dfbac6319adbf0a82a99105a9ee6", + "path": "corpus/wpf/timer-stop-unwired-lifecycle/after.cs" + }, + { + "blob": "0d5062f2477f382150b32b286aa8726e51170200", + "path": "corpus/wpf/timer-stop-unwired-lifecycle/before.cs" + }, + { + "blob": "b2b6b657b0da7947086911cd2833278e1ca926c2", + "path": "corpus/wpf/timer-stop-wrong-receiver/after.cs" + }, + { + "blob": "d781717509873e414e92801419decddb32e0f826", + "path": "corpus/wpf/timer-stop-wrong-receiver/before.cs" + }, + { + "blob": "82f57d8b91534fd08c54f1b1f0857c3f8c76d46e", + "path": "corpus/wpf/viewmodel-escapes-to-app/after.cs" + }, + { + "blob": "ae52b324a6e428015fc5974bd11d60f8bfe3e4d0", + "path": "corpus/wpf/viewmodel-escapes-to-app/before.cs" + }, + { + "blob": "1f96bb7c57b978ff329761ca730a7d975b39fba9", + "path": "corpus/wpf/zombie-viewmodel/after.cs" + }, + { + "blob": "e9e4d0700a5abff8114dbe619993069b05bd6fc2", + "path": "corpus/wpf/zombie-viewmodel/before.cs" + } + ], + "analysis_manifest_sha256": "97ea59f4b4e7409597cdc00bf0e7d6496397b5c24f8c7785a063c507a23d5397", + "artifacts": {}, + "corpus": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "dirty": false, + "engine": "python", + "execution_profile": { + "dotnet": { + "runtimes": [ + "Microsoft.AspNetCore.App 8.0.31", + "Microsoft.NETCore.App 8.0.31" + ], + "sdk": "8.0.425" + }, + "platform": { + "machine": "x86_64", + "system": "Linux" + }, + "python": { + "implementation": "CPython", + "version": "3.11.15 (main, Sep 19 2026, 00:18:08) [GCC 16.1.1 20260625]" + } + }, + "files": { + "corpus/di/singleton-captures-scoped-dbcontext/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/di/singleton-captures-scoped-dbcontext/before.cs": { + "exit": 0, + "findings": [ + { + "code": "DI001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/fixtures/systemevents-console/Program.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 43 + }, + { + "code": "OWN001", + "level": "warning", + "line": 54 + }, + { + "code": "OWN001", + "level": "warning", + "line": 77 + } + ] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 38 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 35 + } + ] + }, + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/arraypool-aliased-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-aliased-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/arraypool-double-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-double-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-field-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-field-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 46 + } + ] + }, + "corpus/real-world/arraypool-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 24 + }, + { + "code": "OWN025", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/arraypool-length-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-length-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/arraypool-memory-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-memory-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-span-view-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-span-view-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-use-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-use-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-view-into-field-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-view-into-field-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 41 + } + ] + }, + "corpus/real-world/field-dispose-via-exchange/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-exchange/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/real-world/field-dispose-via-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/field-noop-dispose-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-noop-dispose-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 9 + } + ] + }, + "corpus/real-world/local-dispose-via-using-statement/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/local-dispose-via-using-statement/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-double-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-double-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-owner-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-owner-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-statement-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-statement-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/ownership-handoff-consume/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-consume/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN002", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/real-world/ownership-handoff-use-transitive/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use-transitive/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/real-world/ownership-handoff-use/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 25 + }, + { + "code": "OWN001", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 12 + }, + { + "code": "OWN050", + "level": "note", + "line": 13 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 27 + } + ] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/subscription-self-owned-property/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/subscription-self-owned-property/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/tcplistener-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/using-statement-throw-releases/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/using-statement-throw-releases/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/custom-weak-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/custom-weak-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + }, + "corpus/wpf/field-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/field-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/handler-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/pooled-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/pooled-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 26 + }, + { + "code": "OWN050", + "level": "note", + "line": 27 + } + ] + }, + "corpus/wpf/subscription-disposing-else-branch-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-disposing-else-branch-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-explicit-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-explicit-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/subscription-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/wpf/subscription-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-param-guarded-unregister/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-param-guarded-unregister/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-target-typed-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-target-typed-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 14 + } + ] + }, + "corpus/wpf/subscription-teardown-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-teardown-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/wpf/subscription-uncalled-local-function/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-uncalled-local-function/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 42 + } + ] + }, + "corpus/wpf/subscription-xaml-name-only-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-xaml-name-only-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/wpf/systemevents-region-escape/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 15 + }, + { + "code": "OWN050", + "level": "note", + "line": 16 + } + ] + }, + "corpus/wpf/systemevents-region-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 26 + } + ] + }, + "corpus/wpf/timer-stop-disposing-else-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-disposing-else-branch/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/timer-stop-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/wpf/timer-stop-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/timer-stop-param-guarded/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-param-guarded/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-lambda/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-lambda/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-wrong-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-wrong-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 16 + } + ] + }, + "corpus/wpf/viewmodel-escapes-to-app/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/viewmodel-escapes-to-app/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 14 + } + ] + }, + "corpus/wpf/zombie-viewmodel/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/zombie-viewmodel/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + } + }, + "input_roots": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "instrument_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py" + ], + "is_evidence": true, + "materialization_root": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095", + "population_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "post_run_population_intact": true, + "reference_profile": { + "OWN_EXTRA_REF_DIRS": "removed-from-child-environment", + "observed_extra_reference_lines": 0 + }, + "schema": "p037-verdict-snapshot/3", + "source_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "subject_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py", + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ], + "support_manifest": [], + "support_manifest_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "treatment_paths": [ + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ] +} diff --git a/docs/evidence/p037-a2-baseline-verdict-rust.json b/docs/evidence/p037-a2-baseline-verdict-rust.json new file mode 100644 index 00000000..ddc2ae34 --- /dev/null +++ b/docs/evidence/p037-a2-baseline-verdict-rust.json @@ -0,0 +1,1709 @@ +{ + "analysis_manifest": [ + { + "blob": "38d180096c63c7d01d7bb39601c1f88e3a53f67e", + "path": "corpus/di/singleton-captures-scoped-dbcontext/after.cs" + }, + { + "blob": "4d6f60e065d7e2572bc457e3df6a593b6a4699c4", + "path": "corpus/di/singleton-captures-scoped-dbcontext/before.cs" + }, + { + "blob": "67c4aa0b15fa0782d865cbd1c5ef355fbc926f8f", + "path": "corpus/fixtures/systemevents-console/Program.cs" + }, + { + "blob": "c9d140949acfe06bd187404508a46b6b61a7c89e", + "path": "corpus/p036-bakeoff/guarded-consume-early-return/after.cs" + }, + { + "blob": "c80dee0bc66037c3c4ae7ff8ce8125ba145f8156", + "path": "corpus/p036-bakeoff/guarded-consume-early-return/before.cs" + }, + { + "blob": "b13ab3891e11f2281754d5c5664fc92bc97710c5", + "path": "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs" + }, + { + "blob": "482151f9ed085819fc82bbe85df003beec21ed02", + "path": "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs" + }, + { + "blob": "b60e95a076611d3661fef95091f041ba228d546e", + "path": "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs" + }, + { + "blob": "b93a52759704651ccb7d09d946c0900c8ab46e54", + "path": "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs" + }, + { + "blob": "48b0accda29b02366d4f652b5c05c2ee7956f6d2", + "path": "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs" + }, + { + "blob": "77cc02f8920b8ac424dd0854d2a1ec188329a01b", + "path": "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs" + }, + { + "blob": "0d862db009407131da16a23b1cc255d3155a64b2", + "path": "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs" + }, + { + "blob": "28a89ec5ee3eb48673ec895f3bd0f8404ec29e99", + "path": "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs" + }, + { + "blob": "faf7be2c04decc1a966a5870e0641ec47d72da5c", + "path": "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs" + }, + { + "blob": "87f06ebe8d6842ec1011a0c8e935c92fd47ee714", + "path": "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs" + }, + { + "blob": "1faa3a7b8fa19ae08128e1b1f30d6dfae1e9f534", + "path": "corpus/real-world/ado-executereader-leak/after.cs" + }, + { + "blob": "d69020eceb2c3619ce3d2f6f36715d97aad5b616", + "path": "corpus/real-world/ado-executereader-leak/before.cs" + }, + { + "blob": "d36d794ecd78e95a99964ecd5ff4e66cc1352e43", + "path": "corpus/real-world/arraypool-aliased-receiver/after.cs" + }, + { + "blob": "3ee0cbfd662aec91a0c437ade04ef9f5a885280a", + "path": "corpus/real-world/arraypool-aliased-receiver/before.cs" + }, + { + "blob": "9c319b50c8147b72a07f2c4c643c936d9849e35c", + "path": "corpus/real-world/arraypool-double-return/after.cs" + }, + { + "blob": "9dc6c22a359a922ea104e2babd1f6c3cb18c55aa", + "path": "corpus/real-world/arraypool-double-return/before.cs" + }, + { + "blob": "fa9fce58d4d9f62a37ab0cd5b88b49627b6e2553", + "path": "corpus/real-world/arraypool-field-fullspan-overread/after.cs" + }, + { + "blob": "768af16266ec428afdb343185a654138d1d04d71", + "path": "corpus/real-world/arraypool-field-fullspan-overread/before.cs" + }, + { + "blob": "3c45a05482eae50f6c68f806e80e1bd030f30151", + "path": "corpus/real-world/arraypool-fullspan-overread/after.cs" + }, + { + "blob": "991b898ca1f564320ee3f5b9eba69e56b5607f6d", + "path": "corpus/real-world/arraypool-fullspan-overread/before.cs" + }, + { + "blob": "8f1c0de961065338fa611e1ac2b3e93099d1a390", + "path": "corpus/real-world/arraypool-length-overread/after.cs" + }, + { + "blob": "0c7d64c1159b4041118b674a912a7f5533e8a301", + "path": "corpus/real-world/arraypool-length-overread/before.cs" + }, + { + "blob": "8c8794e57d810cd542d90c12cea06ff1c034a0fc", + "path": "corpus/real-world/arraypool-memory-view-escape/after.cs" + }, + { + "blob": "7a29e26ef81bc82f98b5c19f626ead25de43986e", + "path": "corpus/real-world/arraypool-memory-view-escape/before.cs" + }, + { + "blob": "debff6f8435c5f396cd1b00d9c12cf09102d13f9", + "path": "corpus/real-world/arraypool-span-view-after-return/after.cs" + }, + { + "blob": "818d3c8cba0b5dbcc9cec5993322d2e04c840f17", + "path": "corpus/real-world/arraypool-span-view-after-return/before.cs" + }, + { + "blob": "708735216525a12901b06cce249aa65f37b5da6b", + "path": "corpus/real-world/arraypool-use-after-return/after.cs" + }, + { + "blob": "0506cd9adcf09ac17e98c56d713d33b516a791af", + "path": "corpus/real-world/arraypool-use-after-return/before.cs" + }, + { + "blob": "6ec2e76f1070f5a1fa3942e11f7e5e5009fe7a03", + "path": "corpus/real-world/arraypool-view-into-field-overread/after.cs" + }, + { + "blob": "5c72fc7284fec7a262a66a499e3197cc663771ac", + "path": "corpus/real-world/arraypool-view-into-field-overread/before.cs" + }, + { + "blob": "02e54d36919c8d03bce56321faa1f7efabb981f9", + "path": "corpus/real-world/field-dispose-via-exchange/after.cs" + }, + { + "blob": "b532135df2f7946e70829834444059b840a168f5", + "path": "corpus/real-world/field-dispose-via-exchange/before.cs" + }, + { + "blob": "c9b071d49cbddd567a108425de4cd7803886b1c6", + "path": "corpus/real-world/field-dispose-via-helper/after.cs" + }, + { + "blob": "7d232b848ef85fbb55deafaff024084a857d7edd", + "path": "corpus/real-world/field-dispose-via-helper/before.cs" + }, + { + "blob": "a07539757bc6bf6ae24766092f56f72ca7bf3010", + "path": "corpus/real-world/field-noop-dispose-wrapper/after.cs" + }, + { + "blob": "8fd5c820e25bab6682f5b02e43b562d2305410a3", + "path": "corpus/real-world/field-noop-dispose-wrapper/before.cs" + }, + { + "blob": "135a360400f5da99bcf6ba5a2efcd1413833e868", + "path": "corpus/real-world/local-dispose-via-using-statement/after.cs" + }, + { + "blob": "5c93e81a1c4bc7b43fd9493a73d2227926d6c069", + "path": "corpus/real-world/local-dispose-via-using-statement/before.cs" + }, + { + "blob": "c7d52d6ead47c013d221e5a3406b98044ced70a2", + "path": "corpus/real-world/memorypool-double-dispose/after.cs" + }, + { + "blob": "b0a3acd9dced8ea7f2bb4702e92984e2be53f931", + "path": "corpus/real-world/memorypool-double-dispose/before.cs" + }, + { + "blob": "51f5e21473f3831892c82e8b35277dc91108bdcf", + "path": "corpus/real-world/memorypool-using-owner-escape/after.cs" + }, + { + "blob": "bfc1b768c48074d67f7da744a2cfd1e58b77be06", + "path": "corpus/real-world/memorypool-using-owner-escape/before.cs" + }, + { + "blob": "2466da9d86248686070994b434beca526c51fe06", + "path": "corpus/real-world/memorypool-using-statement-view-escape/after.cs" + }, + { + "blob": "afc9ea74b3e8c407c06d7a797ba3673a926f5c3c", + "path": "corpus/real-world/memorypool-using-statement-view-escape/before.cs" + }, + { + "blob": "499ce51f09325341ddbbb8236944fa9bc2158eac", + "path": "corpus/real-world/memorypool-using-view-escape/after.cs" + }, + { + "blob": "45437c15fa6ec4e2b5f28f16cfc41155866f00ae", + "path": "corpus/real-world/memorypool-using-view-escape/before.cs" + }, + { + "blob": "7327ffa1666b4ba534fbb9a3f0d5f9d4a9e1b628", + "path": "corpus/real-world/memorypool-view-after-dispose/after.cs" + }, + { + "blob": "072dfa923df7e919913fc69e0d676e5ce2ebafa5", + "path": "corpus/real-world/memorypool-view-after-dispose/before.cs" + }, + { + "blob": "78eb173af727d40d4477ebb313cfcbf5291068c2", + "path": "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs" + }, + { + "blob": "a4deffc410b2dedfc5edb61cec3ef6f1777d0adf", + "path": "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs" + }, + { + "blob": "f2a81599a30d95c539b3918aeef3d4213e50c721", + "path": "corpus/real-world/ownership-handoff-consume/after.cs" + }, + { + "blob": "d65ba7b9424e36eb2c5e7e8fc7b390bdb2f6bfff", + "path": "corpus/real-world/ownership-handoff-consume/before.cs" + }, + { + "blob": "91134e9bd2cc709b0174e20c31e43b76b297df66", + "path": "corpus/real-world/ownership-handoff-use-transitive/after.cs" + }, + { + "blob": "2ed2ca15dfdea27d0f1a072d3b569eea7596b0b1", + "path": "corpus/real-world/ownership-handoff-use-transitive/before.cs" + }, + { + "blob": "8aacb78586d8441ea060a6fcac1590bb7c4e824e", + "path": "corpus/real-world/ownership-handoff-use/after.cs" + }, + { + "blob": "e4a61bf6023f4e32f54a1c4887e26c844f757f42", + "path": "corpus/real-world/ownership-handoff-use/before.cs" + }, + { + "blob": "a4f71bc85fc6219e309a7ffb2fe4659c7ba647cd", + "path": "corpus/real-world/pool-transfer-via-wrapper-local/after.cs" + }, + { + "blob": "004dfda6385ff8697c8c16aeb844bcfb46ca9a2a", + "path": "corpus/real-world/pool-transfer-via-wrapper-local/before.cs" + }, + { + "blob": "48fea235d362012f5482abbe598a69ba513f598a", + "path": "corpus/real-world/screentogif-loaded-subscription/after.cs" + }, + { + "blob": "f531ea536868381417fef0d8392bf956802ea194", + "path": "corpus/real-world/screentogif-loaded-subscription/before.cs" + }, + { + "blob": "f353a95c721347d12317acd7ea4b089495c9ec1a", + "path": "corpus/real-world/screentogif-systemevents-leak/after.cs" + }, + { + "blob": "f531e57e99f32029d1ae7b3df183c2785ef85714", + "path": "corpus/real-world/screentogif-systemevents-leak/before.cs" + }, + { + "blob": "671e8c665df0f4a951fd14002b056355b37019ea", + "path": "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs" + }, + { + "blob": "09dbfd123416af89eff3f8e301ec300f184a2d8d", + "path": "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs" + }, + { + "blob": "37eabf992f0e083364d20160a1ddf0c82c28b768", + "path": "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs" + }, + { + "blob": "2355f37e9fc8fc6b63e5023a2a2a18265b16d669", + "path": "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs" + }, + { + "blob": "74a99ffd338ef3cbf853cf2804c3a3ece8ed42a7", + "path": "corpus/real-world/socket-accept-leak/after.cs" + }, + { + "blob": "18a721ce6d07b7eed6cf97afef578d97e7ba2744", + "path": "corpus/real-world/socket-accept-leak/before.cs" + }, + { + "blob": "3be8156197c7e76fe60eee06028c65fe03407254", + "path": "corpus/real-world/subscription-self-owned-property/after.cs" + }, + { + "blob": "53ec5ba89ca9eb3791bcc7c2489c5884dd0acad7", + "path": "corpus/real-world/subscription-self-owned-property/before.cs" + }, + { + "blob": "601976e5600d97d6184fe5dc44b957c985a97115", + "path": "corpus/real-world/tcplistener-accept-leak/after.cs" + }, + { + "blob": "ab88672d4e90e99b7a8fb2a061d533a5a5ef0072", + "path": "corpus/real-world/tcplistener-accept-leak/before.cs" + }, + { + "blob": "dce3d96a463068f59288176541d5c75befa570b8", + "path": "corpus/real-world/tcplistener-acceptsocket-leak/after.cs" + }, + { + "blob": "6ae9c4c8faef9559b9ac4de4da1ba03c4acada5e", + "path": "corpus/real-world/tcplistener-acceptsocket-leak/before.cs" + }, + { + "blob": "b54a2b87b1f584a9a857c5f311d5874099910643", + "path": "corpus/real-world/using-statement-throw-releases/after.cs" + }, + { + "blob": "acc415ddf95c058de642d3a13e39226570ebf6e0", + "path": "corpus/real-world/using-statement-throw-releases/before.cs" + }, + { + "blob": "ef464e6cf0f0bb0c9d3941fa0fce881b78011bcb", + "path": "corpus/wpf/custom-weak-wrapper/after.cs" + }, + { + "blob": "d255613e1dbf311f93c34cbabc1ae304b648ea2b", + "path": "corpus/wpf/custom-weak-wrapper/before.cs" + }, + { + "blob": "30697c7b21435ea03352b9f1826938c88a60d3d9", + "path": "corpus/wpf/field-use-after-dispose/after.cs" + }, + { + "blob": "79fdb97a6375c5b1b6df5be6967bd22c738e9cce", + "path": "corpus/wpf/field-use-after-dispose/before.cs" + }, + { + "blob": "242fec8ebaf85ea83df4a0a27c9f1e6cac80a9b8", + "path": "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs" + }, + { + "blob": "445968e5bc0d6bb77950196774b5f645c6d56459", + "path": "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs" + }, + { + "blob": "2aaf3b53fba9dd98a72cbe7c2caed65cf89262fd", + "path": "corpus/wpf/handler-use-after-dispose/after.cs" + }, + { + "blob": "68e25c6b763c122df627b3e7847f548524db9d21", + "path": "corpus/wpf/handler-use-after-dispose/before.cs" + }, + { + "blob": "b62ced3b658f10929e98d5fca7c65401b4fc0aea", + "path": "corpus/wpf/pooled-view-after-dispose/after.cs" + }, + { + "blob": "4731249cfee1b47a750fbc11ac66b598b17453ae", + "path": "corpus/wpf/pooled-view-after-dispose/before.cs" + }, + { + "blob": "9b093f5e39f7087333b7f8f2c89a4b155e078edd", + "path": "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs" + }, + { + "blob": "e7d5904e1c32d78a267309faf6717be59a374aec", + "path": "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs" + }, + { + "blob": "cb3ed69a917c9516ddcafa5c7c55cc8467739fe5", + "path": "corpus/wpf/subscription-disposing-else-branch-release/after.cs" + }, + { + "blob": "d0e1dc7929300bc60f4349a7e0df29ca87d018ce", + "path": "corpus/wpf/subscription-disposing-else-branch-release/before.cs" + }, + { + "blob": "bae861a35a441a2fc7714d9904883bd576182ed4", + "path": "corpus/wpf/subscription-explicit-delegate-release/after.cs" + }, + { + "blob": "e86bb4d5ff49116c6fd49c045b7d4f5136add534", + "path": "corpus/wpf/subscription-explicit-delegate-release/before.cs" + }, + { + "blob": "8299b26e3d1d9ec7c15673ba148199aafac6c6ef", + "path": "corpus/wpf/subscription-finalizer-release/after.cs" + }, + { + "blob": "3d03e2c90b8c8cacd68ef93cf44587f3d299288d", + "path": "corpus/wpf/subscription-finalizer-release/before.cs" + }, + { + "blob": "622e8cd997b9d2acf731c3b415166568339adf3a", + "path": "corpus/wpf/subscription-nonteardown-release/after.cs" + }, + { + "blob": "54f7969790b8daa82b498f795e1341e63fc1dd89", + "path": "corpus/wpf/subscription-nonteardown-release/before.cs" + }, + { + "blob": "934577f5c5c294d77029d816908b69f276c6583c", + "path": "corpus/wpf/subscription-overload-conflated-cleanup/after.cs" + }, + { + "blob": "1a0462ebd958a6e7d1a23dae2b8c99a1fdf48700", + "path": "corpus/wpf/subscription-overload-conflated-cleanup/before.cs" + }, + { + "blob": "b1b9faf7f5ce931bc89316e239ec03b482cc6700", + "path": "corpus/wpf/subscription-param-guarded-unregister/after.cs" + }, + { + "blob": "015343c46671afe384fd1a60d38c107426a01420", + "path": "corpus/wpf/subscription-param-guarded-unregister/before.cs" + }, + { + "blob": "f57d5340e25a55538de23892e29c1718d3042e8f", + "path": "corpus/wpf/subscription-target-typed-delegate-release/after.cs" + }, + { + "blob": "b6ada87556cf82ab68f6c58afdfec9d85daa93ef", + "path": "corpus/wpf/subscription-target-typed-delegate-release/before.cs" + }, + { + "blob": "0cab64b233266ef06e6988f27326eded395271e3", + "path": "corpus/wpf/subscription-teardown-early-return-guard/after.cs" + }, + { + "blob": "85d32821de0a02990a5e1abf87eccc986bac6b93", + "path": "corpus/wpf/subscription-teardown-early-return-guard/before.cs" + }, + { + "blob": "23bd620a57b1a68d0cf6569125817caf3fb47efc", + "path": "corpus/wpf/subscription-uncalled-local-function/after.cs" + }, + { + "blob": "2e129b6bb1e183443a073bf083a3a04b844d9a98", + "path": "corpus/wpf/subscription-uncalled-local-function/before.cs" + }, + { + "blob": "292c674a95a34ddff1f9eace96bbd316dabafff5", + "path": "corpus/wpf/subscription-xaml-name-only-release/after.cs" + }, + { + "blob": "59c8548878d13a026de9ddc65534b38ae94f8864", + "path": "corpus/wpf/subscription-xaml-name-only-release/before.cs" + }, + { + "blob": "3062b7e371fb709c622ef5ac918f4682df990b3b", + "path": "corpus/wpf/systemevents-region-escape/after.cs" + }, + { + "blob": "5a89237790ae5b12d64a680288196c6ead8c6662", + "path": "corpus/wpf/systemevents-region-escape/before.cs" + }, + { + "blob": "4ab388af8e8ea1b1faaf154f0f878db498fce704", + "path": "corpus/wpf/timer-stop-disposing-else-branch/after.cs" + }, + { + "blob": "5c1a7e991a861b316bf08869ef425583d26da556", + "path": "corpus/wpf/timer-stop-disposing-else-branch/before.cs" + }, + { + "blob": "a8a4d710a2f06c25e43a106c1410800369696d74", + "path": "corpus/wpf/timer-stop-early-return-guard/after.cs" + }, + { + "blob": "2e8e5e241d7980c65a70857fa128400c23331fed", + "path": "corpus/wpf/timer-stop-early-return-guard/before.cs" + }, + { + "blob": "743a4fab56737068377dbc553a030cc87273a465", + "path": "corpus/wpf/timer-stop-finalizer-release/after.cs" + }, + { + "blob": "973df1396ee32098c045e55dff973b979f13c1fc", + "path": "corpus/wpf/timer-stop-finalizer-release/before.cs" + }, + { + "blob": "d8e77d9849476e5491b4dcc19a9e53e48ff39795", + "path": "corpus/wpf/timer-stop-nonteardown-release/after.cs" + }, + { + "blob": "a2b1699fa2ce74a8bfab34c8d63a2374a9696723", + "path": "corpus/wpf/timer-stop-nonteardown-release/before.cs" + }, + { + "blob": "d59b693ecf990fd43d60a1051544f40e1ad2c818", + "path": "corpus/wpf/timer-stop-param-guarded/after.cs" + }, + { + "blob": "012854a1e19f04133dc78ecbbd14a1cef8044622", + "path": "corpus/wpf/timer-stop-param-guarded/before.cs" + }, + { + "blob": "e76351d486fd80e1037a4bca2ab9783c7ae4c1fd", + "path": "corpus/wpf/timer-stop-uncalled-helper/after.cs" + }, + { + "blob": "42a743ff9743fd38551eaf687b0a96ac874f0eb8", + "path": "corpus/wpf/timer-stop-uncalled-helper/before.cs" + }, + { + "blob": "0a65c2215f03fc979d71d4f91458043e2b02a143", + "path": "corpus/wpf/timer-stop-uncalled-lambda/after.cs" + }, + { + "blob": "3c29d5f0fe3f49b79244fd482e18bc9a39b1bb52", + "path": "corpus/wpf/timer-stop-uncalled-lambda/before.cs" + }, + { + "blob": "39bef7650422dfbac6319adbf0a82a99105a9ee6", + "path": "corpus/wpf/timer-stop-unwired-lifecycle/after.cs" + }, + { + "blob": "0d5062f2477f382150b32b286aa8726e51170200", + "path": "corpus/wpf/timer-stop-unwired-lifecycle/before.cs" + }, + { + "blob": "b2b6b657b0da7947086911cd2833278e1ca926c2", + "path": "corpus/wpf/timer-stop-wrong-receiver/after.cs" + }, + { + "blob": "d781717509873e414e92801419decddb32e0f826", + "path": "corpus/wpf/timer-stop-wrong-receiver/before.cs" + }, + { + "blob": "82f57d8b91534fd08c54f1b1f0857c3f8c76d46e", + "path": "corpus/wpf/viewmodel-escapes-to-app/after.cs" + }, + { + "blob": "ae52b324a6e428015fc5974bd11d60f8bfe3e4d0", + "path": "corpus/wpf/viewmodel-escapes-to-app/before.cs" + }, + { + "blob": "1f96bb7c57b978ff329761ca730a7d975b39fba9", + "path": "corpus/wpf/zombie-viewmodel/after.cs" + }, + { + "blob": "e9e4d0700a5abff8114dbe619993069b05bd6fc2", + "path": "corpus/wpf/zombie-viewmodel/before.cs" + } + ], + "analysis_manifest_sha256": "97ea59f4b4e7409597cdc00bf0e7d6496397b5c24f8c7785a063c507a23d5397", + "artifacts": { + "own-cli": { + "binary": "own-cli", + "bytes": 1842008, + "cargo": "cargo 1.94.1 (29ea6fb6a 2026-03-24)", + "cargo_argv": [ + "cargo", + "build", + "--locked", + "--release", + "--message-format=json", + "-p", + "own-cli", + "--bin", + "own-cli" + ], + "cargo_clean_argv": [ + "cargo", + "clean", + "--release", + "-p", + "own-cli" + ], + "cargo_lock_blob": "d8adbb1dc4d90da0c80aa1a2d8ba85bef805620f", + "cargo_lock_sha256": "17553420691d96febcfac54bd8f530b4f9e2a1ad7c79e6aaa022510e56692f45", + "dirty": false, + "executable": "/home/tandem/cargo-target/release/own-cli", + "executed": { + "bytes": 1842008, + "post_run_intact": true, + "sealed_path": "/home/tandem/owen-p037-a2/tmp/p037-take-8hn4yd5g/own-cli", + "sha256": "8373f5f58a8dda4c2fe552185364c4c0c1834149d7b8865fa643a88b7d7cc4b8" + }, + "host": "x86_64-unknown-linux-gnu", + "package": "own-cli", + "profile": "release", + "rebuilt_by_this_call": true, + "repo_path": null, + "rustc": "rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8", + "sha256": "8373f5f58a8dda4c2fe552185364c4c0c1834149d7b8865fa643a88b7d7cc4b8", + "source_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2" + } + }, + "corpus": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "dirty": false, + "engine": "rust", + "execution_profile": { + "dotnet": { + "runtimes": [ + "Microsoft.AspNetCore.App 8.0.31", + "Microsoft.NETCore.App 8.0.31" + ], + "sdk": "8.0.425" + }, + "platform": { + "machine": "x86_64", + "system": "Linux" + }, + "python": { + "implementation": "CPython", + "version": "3.11.15 (main, Sep 19 2026, 00:18:08) [GCC 16.1.1 20260625]" + }, + "rust": { + "cargo": "cargo 1.94.1 (29ea6fb6a 2026-03-24)", + "host": "x86_64-unknown-linux-gnu", + "rustc": "rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8" + } + }, + "files": { + "corpus/di/singleton-captures-scoped-dbcontext/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/di/singleton-captures-scoped-dbcontext/before.cs": { + "exit": 0, + "findings": [ + { + "code": "DI001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/fixtures/systemevents-console/Program.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 43 + }, + { + "code": "OWN001", + "level": "warning", + "line": 54 + }, + { + "code": "OWN001", + "level": "warning", + "line": 77 + } + ] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-early-return/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-flag-branch/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-negation-wrapper/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/guarded-consume-wrapper-forward/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/p036-bakeoff/gv4-control-aliased-self-null/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-mutated-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 38 + } + ] + }, + "corpus/p036-bakeoff/gv4-control-ref-alias-guard/control.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 35 + } + ] + }, + "corpus/p036-bakeoff/legacy-honesty-else-unresolved-forward/control.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ado-executereader-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/arraypool-aliased-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-aliased-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/arraypool-double-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-double-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-field-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-field-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 46 + } + ] + }, + "corpus/real-world/arraypool-fullspan-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-fullspan-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 24 + }, + { + "code": "OWN025", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/arraypool-length-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-length-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/arraypool-memory-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-memory-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-span-view-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-span-view-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/arraypool-use-after-return/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-use-after-return/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/real-world/arraypool-view-into-field-overread/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/arraypool-view-into-field-overread/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN025", + "level": "warning", + "line": 40 + }, + { + "code": "OWN025", + "level": "warning", + "line": 41 + } + ] + }, + "corpus/real-world/field-dispose-via-exchange/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-exchange/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/real-world/field-dispose-via-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-dispose-via-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/field-noop-dispose-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/field-noop-dispose-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 9 + } + ] + }, + "corpus/real-world/local-dispose-via-using-statement/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/local-dispose-via-using-statement/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-double-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-double-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN003", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-owner-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-owner-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-statement-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-statement-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/memorypool-using-view-escape/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-using-view-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/real-world/memorypool-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/memorypool-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/nethermind-patriciatree-arraypool-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/real-world/ownership-handoff-consume/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-consume/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN002", + "level": "warning", + "line": 28 + } + ] + }, + "corpus/real-world/ownership-handoff-use-transitive/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use-transitive/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/real-world/ownership-handoff-use/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/ownership-handoff-use/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/pool-transfer-via-wrapper-local/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 21 + } + ] + }, + "corpus/real-world/screentogif-loaded-subscription/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 25 + }, + { + "code": "OWN001", + "level": "warning", + "line": 26 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 12 + }, + { + "code": "OWN050", + "level": "note", + "line": 13 + } + ] + }, + "corpus/real-world/screentogif-systemevents-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-rfc2898-derivebytes-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 24 + }, + { + "code": "OWN001", + "level": "warning", + "line": 27 + } + ] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/sharex-shapemanager-menuform-leak/before.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/socket-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/subscription-self-owned-property/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/subscription-self-owned-property/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/real-world/tcplistener-accept-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-accept-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 11 + } + ] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/tcplistener-acceptsocket-leak/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 10 + } + ] + }, + "corpus/real-world/using-statement-throw-releases/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/real-world/using-statement-throw-releases/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/custom-weak-wrapper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/custom-weak-wrapper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + }, + "corpus/wpf/field-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/field-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose-wrapped-delegate/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 15 + } + ] + }, + "corpus/wpf/handler-use-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/handler-use-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/pooled-view-after-dispose/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/pooled-view-after-dispose/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN002", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-ambiguous-overload-wiring/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 26 + }, + { + "code": "OWN050", + "level": "note", + "line": 27 + } + ] + }, + "corpus/wpf/subscription-disposing-else-branch-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-disposing-else-branch-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-explicit-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-explicit-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/subscription-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 22 + } + ] + }, + "corpus/wpf/subscription-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 21 + } + ] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-overload-conflated-cleanup/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/subscription-param-guarded-unregister/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-param-guarded-unregister/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 25 + } + ] + }, + "corpus/wpf/subscription-target-typed-delegate-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-target-typed-delegate-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 14 + } + ] + }, + "corpus/wpf/subscription-teardown-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-teardown-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 31 + } + ] + }, + "corpus/wpf/subscription-uncalled-local-function/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-uncalled-local-function/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + }, + { + "code": "OWN001", + "level": "warning", + "line": 42 + } + ] + }, + "corpus/wpf/subscription-xaml-name-only-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/subscription-xaml-name-only-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 23 + } + ] + }, + "corpus/wpf/systemevents-region-escape/after.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 15 + }, + { + "code": "OWN050", + "level": "note", + "line": 16 + } + ] + }, + "corpus/wpf/systemevents-region-escape/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 26 + } + ] + }, + "corpus/wpf/timer-stop-disposing-else-branch/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-disposing-else-branch/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 20 + } + ] + }, + "corpus/wpf/timer-stop-early-return-guard/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-early-return-guard/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 19 + } + ] + }, + "corpus/wpf/timer-stop-finalizer-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-finalizer-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-nonteardown-release/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-nonteardown-release/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 18 + } + ] + }, + "corpus/wpf/timer-stop-param-guarded/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-param-guarded/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-helper/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-helper/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-uncalled-lambda/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-uncalled-lambda/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-unwired-lifecycle/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 17 + } + ] + }, + "corpus/wpf/timer-stop-wrong-receiver/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/timer-stop-wrong-receiver/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 16 + } + ] + }, + "corpus/wpf/viewmodel-escapes-to-app/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/viewmodel-escapes-to-app/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN050", + "level": "note", + "line": 14 + } + ] + }, + "corpus/wpf/zombie-viewmodel/after.cs": { + "exit": 0, + "findings": [] + }, + "corpus/wpf/zombie-viewmodel/before.cs": { + "exit": 0, + "findings": [ + { + "code": "OWN001", + "level": "warning", + "line": 13 + } + ] + } + }, + "input_roots": [ + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff" + ], + "instrument_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py" + ], + "is_evidence": true, + "materialization_root": ".p037-population/4a8e6582e10222403cd40adc9e95db7e0228a1c2/97ea59f4b4e74095", + "population_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "post_run_population_intact": true, + "reference_profile": { + "OWN_EXTRA_REF_DIRS": "removed-from-child-environment", + "observed_extra_reference_lines": 0 + }, + "schema": "p037-verdict-snapshot/3", + "source_commit": "4a8e6582e10222403cd40adc9e95db7e0228a1c2", + "subject_paths": [ + "ownlang/", + "rust/", + "scripts/own-check.sh", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py", + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ], + "support_manifest": [], + "support_manifest_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "treatment_paths": [ + "frontend/roslyn/OwnSharp.Extractor/", + "spec/" + ] +} diff --git a/docs/notes/p037-formal-kernel.md b/docs/notes/p037-formal-kernel.md index 4cb92ca5..8058a86e 100644 --- a/docs/notes/p037-formal-kernel.md +++ b/docs/notes/p037-formal-kernel.md @@ -630,3 +630,120 @@ preference: that check and is unaffected; it was run and is green. 3. **Three citations of `p036-bakeoff.md` now name the branch and commit** they live at, per §9.1. + + +## 10. A2 execution governance freeze + +This section is the implementation-governance checkpoint for A2.0 through +A2.2. It records owner rulings that were made after A1.1-a1 and before the +first guarded-fact vocabulary change. These are not new semantics: they are +the staging rules required to implement the already-frozen P-037 contract +without moving the semantic boundary accidentally. + +### 10.1 New-finding classification + +After this freeze, a new implementation finding belongs to exactly one of +these classes: + +1. it contradicts the frozen P-037 contract -> **implementation defect**; +2. it exposes an unrecorded theorem assumption -> **proof-boundary manifest + amendment**; +3. it exposes an unrepresented syntax/fact shape -> **shape-census + addition**; +4. it exposes a missing test/control -> **evidence-infrastructure + addition**; +5. it requires new semantics or changes a frozen rule -> **STOP: explicit + contract amendment before implementation continues**. + +Cases 1--4 do not reopen the architecture. Case 5 is the only architecture +door. + +### 10.2 A2 raw-fact boundary + +The Roslyn frontend reports source facts; it does not run P-037 summary +semantics in order to describe them. + +For boolean arguments the raw vocabulary distinguishes literal true, literal +false, a stable parameter, a single negation of a stable parameter, and +opaque. + +For reference arguments the raw vocabulary distinguishes: + +- `NullLiteral`; +- `ObjectCreation`; +- `StableParam(parameter_id)`; +- `CallResult(callee_id, signature)`; +- `Opaque`. + +The frontend never emits `fresh_owned`. Freshness of a call result is a +summary conclusion, not a Roslyn fact. A `CallResult(F)` may therefore select +the positive nullness cell only at G-A1 application, after summaries are +finalized and only when `F` is proven to return fresh; otherwise it is +opaque/collapsed. Using `CallResult` to choose a solver-edge transform would +make the pre-solver system depend on the value solver's own output and is a +case-5 STOP. + +For a nullness guard, forwarding the same stable nullable reference is +identity of the predicate, not truth of it: it is an `id` relation, never +`const-pos`. `const-pos` is reserved for statically proven non-null +arguments under G-A1: object creation, or a call result whose finalized return +summary proves fresh. `null` is `const-neg`. No Roslyn nullable-flow +judgment is part of this contract. + +### 10.3 A2 staging invariant + +A2.1 makes the guarded-fact sidecar a known, fail-loud OwnIR vocabulary on +both Python and Rust doors. A2.2 emits honest facts for every relevant call, +including calls the legacy `ConsumesParam` path currently classifies as +consuming. The legacy body remains authoritative through A2: the sidecar is +validated but semantically inert. + +Therefore A2's three evidence layers are: + +- fact shape: expected, deliberate change; +- whole MOS document: no change; +- public verdict: no change. + +A valid but deliberately contradictory sidecar is the named inertness +control: in A2 it must alter neither MOS nor verdict. In phase B the same +fixture flips to a required-read control for the guarded shadow path. + +### 10.4 Phase-B proof boundary + +Phase B may not begin semantic wiring until the P-037 proof-boundary audit is +green. The audit must derive the Kani harness inventory from source/Kani, +check that the fast and heavy CI sets are disjoint and their union equals the +source set, record the human claim and production subject for every harness, +and make every load-bearing assumption traceable to either a production +guarantor or an explicit `OUTSIDE_KANI_BOUNDARY` entry. + +The bounded formal model is intentionally not the production storage model: +the current harness system uses three coordinates and two edges per +coordinate. Production reuses the same guarded algebra and one-step +semantics through a dynamic driver; the bounded adapter remains the model +checker instance. The production-size bound is therefore explicit outside +the proof boundary, not implied to have been proved. + +Non-vacuity is required per load-bearing restriction, not mechanically one +`kani::cover` per `kani::assume`. Negative controls must pin the production +guarantors for well-formedness and application ordering. + +### 10.5 Governance before the semantic cut + +Before phase C makes guarded Rust summaries authoritative, two P-022 policies +must be re-scoped explicitly: + +- shadow compare may accept only machine-classified, per-document P-037 + differences in the three declared classes + (`APPLICATION_REFINEMENT`, `SUMMARY_REFINEMENT`, + `LEGACY_HONESTY`); every other difference remains + acceptance-unexplained and fails; +- the Stage-3 rollback contract separates rollback mechanics, exact parity on + an unaffected sample, and classified intentional P-037 divergence. Python + remains the legacy/reference/explicit rollback engine; it does not gain a + second guarded implementation merely to preserve zero-diff. + +After the semantic cut, a separate C+ checkpoint canonicalizes the temporary +double representation of call facts. A stable call-site identity is introduced +in A2 so the legacy and sidecar views cannot silently drift before that +canonicalization. diff --git a/frontend/roslyn/OwnSharp.Extractor/Program.cs b/frontend/roslyn/OwnSharp.Extractor/Program.cs index 39f565c3..33bd542e 100644 --- a/frontend/roslyn/OwnSharp.Extractor/Program.cs +++ b/frontend/roslyn/OwnSharp.Extractor/Program.cs @@ -3441,8 +3441,29 @@ or ImplicitObjectCreationExpressionSyntax // fresh-factory transfer — emit it as the return's `var` so the core models the // escape (a discharge: ownership moves to the caller) and classifies the method // `returnsOwned: fresh`. A non-identifier / non-tracked return is a bare CFG exit. + // + // P-037 A1.1-a1: "tracked LOCAL" is the rule as written above, and it held for + // free until a1 put owned PARAMETERS into the same set. Returning a parameter is + // not a fresh factory: the resource belongs to the caller and outlives the call. + // Modelled as a fresh return it reads as an escaping borrow — measured, on + // samples/OverloadSigSample.cs `Open(FileStream existing, bool flush)`: + // `[OWN004] 'parg_59' is a borrow and cannot be returned`. + // + // What this return actually IS is an ALIAS of the parameter, and OwnIR has no + // way to say that: `aliasOf`/`aliased` are reserved in the schema and the + // production skeleton builder has never emitted them (own-bridge/src/mos.rs + // says so in its own header). So the frontend keeps the silence it has always + // kept here — a bare CFG exit, claiming no owned return — rather than asserting + // a kind that is false. Closing that gap means teaching the IR alias returns, + // which is a semantic change and not this step's business. + // + // The parameter test is semantic on purpose: a parameter symbol resolves from + // source even when its TYPE does not (single-file runs see little of the BCL), + // and a local never resolves to IParameterSymbol, so no local loses its fresh + // return to this. var rvar = rs.Expression is IdentifierNameSyntax rid && tracked.Contains(rid.Identifier.Text) + && model.GetSymbolInfo(rid).Symbol is not IParameterSymbol ? rid.Identifier.Text : (string?)null; nodes.Add(new { op = "return", var = rvar, line = LineOf(rs) }); } @@ -6447,6 +6468,46 @@ when model.GetSymbolInfo(asg.Left).Symbol is IFieldSymbol { if (method.Body is not { } mbody) continue; + // P-037 A1.1-a1 (#304): this method's OWNERSHIP-RELEVANT parameters. + // + // Why this exists: `build_skeletons` (own-bridge/src/lower.rs and its Python + // twin) reads `functions[].params` to derive each parameter's transfer, and the + // C# frontend has never emitted that field. The MOS layer — solver, transfer + // lattice, the whole INF rule set — has therefore had NO parameter input from + // C#, and "does this call consume its argument?" was answered instead by + // `ConsumesParam`: syntactically, flow-insensitively, inside the extractor. + // Measured: fed the same shapes, the inference layer already discriminates + // `if (g) release p` -> may, `release p` -> must, `use p` -> no, correctly and + // without flattening. It was simply never asked. + // + // This step only makes the frontend SAY what a callee does with its parameters. + // Nothing reads the new field to change a verdict yet and `ConsumesParam` is + // untouched — the semantic cut is a later step, deliberately, so a verdict + // movement HERE is a defect rather than a feature. + // + // The predicate is `IsOwnedDisposableType`, the same one locals use, and NOT + // `ConsumesParam`'s stricter `ImplementsIDisposable`. That matters: the strict + // form demands a resolved symbol and silently answers false for a type the + // compilation cannot see, which on a single-file run is most of the BCL. A + // frontend that tracks a `Stream` local but not a `Stream` parameter would be + // inconsistent about one type for no reason a reader could defend. + var ownedParams = new List(); + var ownedParamNames = new HashSet(StringComparer.Ordinal); + foreach (var psyn in method.ParameterList.Parameters) + { + // By-value only, like `ConsumesParam`: a `ref`/`out`/`in` parameter is not + // an ownership handoff. Read off the SYNTAX so this agrees with itself when + // the symbol does not resolve. + if (psyn.Modifiers.Any(SyntaxKind.RefKeyword) + || psyn.Modifiers.Any(SyntaxKind.OutKeyword) + || psyn.Modifiers.Any(SyntaxKind.InKeyword)) + continue; + if (psyn.Type is { } ptype && IsOwnedDisposableType(ptype, model)) + { + ownedParams.Add(new { name = psyn.Identifier.Text, line = LineOf(psyn) }); + ownedParamNames.Add(psyn.Identifier.Text); + } + } var candidates = new HashSet(); var poolBuffers = new HashSet(); // candidates that are ArrayPool buffers var usingMemoryOwners = new HashSet(); // `using`-declared MemoryPool owners @@ -6506,7 +6567,17 @@ or ImplicitObjectCreationExpressionSyntax } init candidates.Add(v.Identifier.Text); usingMemoryOwners.Add(v.Identifier.Text); } - if (candidates.Count == 0) + // Eligibility, NOT a deleted guard. This is the gate that drops a method + // whose only ownership-relevant thing is a PARAMETER — `Close(Stream s, bool + // keep)` never reached the second gate below, it exited here. Removing the test + // outright would emit every method in the compilation, most carrying nothing an + // ownership analysis can read: a five-figure fact diff bought with one line that + // looked suspicious. A method earns a record by having something to say — + // tracked locals, or a parameter whose ownership a caller must reason about. + // (The third case the design names, "required as an interprocedural summary + // target", is subsumed: a summary is consulted for its PARAMETERS, so a method + // with none has no summary anyone can read.) + if (candidates.Count == 0 && ownedParamNames.Count == 0) continue; // A local that escapes (returned / assigned out) is conservatively not // tracked — its release may be the caller's job. For an IDisposable, @@ -6618,10 +6689,18 @@ or ImplicitObjectCreationExpressionSyntax } init } var tracked = new HashSet(candidates); tracked.ExceptWith(escapedLocals); - if (tracked.Count == 0) + if (tracked.Count == 0 && ownedParamNames.Count == 0) continue; statMethodsWithLocal++; - var fbody = LowerFlowBody(mbody, tracked, model); + // Lower over locals AND owned parameters, so `param_signals` / + // `definite_release` / `forward_targets` have a body to read. A parameter has no + // declarator in this body and every `acquire` site is gated on a declarator + // (checked, not assumed), so no acquire is emitted for it: it appears only as + // the `use` / `release` / `call` ops describing its fate, which is exactly the + // shape `params[]` is paired with. + var flowNames = new HashSet(tracked, StringComparer.Ordinal); + flowNames.UnionWith(ownedParamNames); + var fbody = LowerFlowBody(mbody, flowNames, model); if (fbody is null || fbody.Count == 0) { statMethodsSkipped++; // unmodelled construct -> honestly skipped @@ -6632,19 +6711,22 @@ or ImplicitObjectCreationExpressionSyntax } init // symbol resolves, so an overloaded method gets its own summary beside // the name-merge; an unresolved symbol omits the field (the bridge then // keeps the merged-fallback behaviour — degraded, never mis-keyed). - flowFunctions.Add(model.GetDeclaredSymbol(method) is IMethodSymbol msym - ? new + // `params` rides only when non-empty: a method with no owned parameter keeps + // byte-for-byte the record shape it had before this change, so the fact-stream + // diff is confined to the methods this step is actually about. + var fname = model.GetDeclaredSymbol(method) is IMethodSymbol msym + ? $"{msym.ContainingType.ToDisplayString()}.{msym.Name}" + : FlowFunctionName(method, cls.Identifier.Text, model); + var fsig = model.GetDeclaredSymbol(method) is IMethodSymbol sigsym + ? CanonicalSig(sigsym) + : null; + flowFunctions.Add( + (fsig, ownedParams.Count > 0) switch { - name = $"{msym.ContainingType.ToDisplayString()}.{msym.Name}", - file, - sig = CanonicalSig(msym), - body = fbody, - } - : (object)new - { - name = FlowFunctionName(method, cls.Identifier.Text, model), - file, - body = fbody, + (not null, true) => new { name = fname, file, sig = fsig, @params = ownedParams, body = fbody }, + (not null, false) => (object)new { name = fname, file, sig = fsig, body = fbody }, + (null, true) => new { name = fname, file, @params = ownedParams, body = fbody }, + (null, false) => new { name = fname, file, body = fbody }, }); } diff --git a/pyproject.toml b/pyproject.toml index fad0ed60..7cd05f29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,10 @@ files = [ "tests/test_obligation_fact_parity.py", "scripts/perf_baseline.py", "scripts/p037_controls.py", + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/p037_fact_shapes.py", "scripts/round7/classify.py", "scripts/round7/elfread.py", "scripts/round7/preflight.py", diff --git a/scripts/p037_evidence.py b/scripts/p037_evidence.py new file mode 100755 index 00000000..1160d7c4 --- /dev/null +++ b/scripts/p037_evidence.py @@ -0,0 +1,1191 @@ +#!/usr/bin/env python3 +"""Shared provenance contract for P-037 step evidence (A2.0 hardening). + +The A2.1 claim is "richer facts, zero MOS/verdict movement". A differential can +only carry that claim when before and after measured ONE frozen population with +ONE measuring instrument in ONE qualified execution environment, and only the +treatment under test moved between them. This module is that contract, in +executable form, shared by both P-037 snapshot tools. + +Instrument vs treatment + INSTRUMENT_PATHS is what we measure WITH (engines, launcher, capture and + compare plumbing, these tools). It may not move between before and after. + TREATMENT_PATHS is what A2.1 intentionally changes (the extractor and the + OwnIR schema). It may move between before and after; it may not move + between a record's source commit and the HEAD that record is a claim about. + +Frozen population + A record names a ``population_commit``. Its primary inputs are the tracked + ``.cs`` blobs under the input roots AT THAT COMMIT, materialized from git + into a deterministic ignored directory under the checkout, never read from + the working tree. Both sides of a comparison must name the same population. + +Explicit-file semantic filesystem closure + The extractor, fed explicit ``.cs`` paths, reads more than those paths: + the sibling ``.xaml`` of a ``*.xaml.cs`` and any ``FodyWeavers.xml`` on a + file's ancestor chain. Those committed side inputs are the SUPPORT manifest, + materialized with the same adjacency. The ancestor walk continues above the + materialization root to the filesystem root, so an external weaver config + there is refused before extraction. Project/solution input modes are NOT + certified here. + +Execution environment + Both Rust executables are built qualified (cargo --locked --release, path + from cargo's compiler-artifact message, digest recorded) and only those are + executed. Python/.NET/Rust identities are recorded and must be equal across + a comparison. ``OWN_EXTRA_REF_DIRS`` is removed from every child environment + and the extractor's own stderr attests that no extra reference was loaded. + +Snapshot validity vs differential eligibility + ``record_problems`` one record is self-consistent at its own commit + ``provenance_problems`` ...and fresh at a given HEAD + ``comparison_problems`` before is self-valid, after is fresh at HEAD, the + instrument, population, support closure and + execution profile are identical, and before is an + ancestor of after +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import platform +import re +import shutil +import subprocess +import sys +import tempfile +from collections.abc import Iterable +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parent.parent + + +class EvidenceRefused(RuntimeError): + """The requested evidence claim cannot be checked honestly.""" + + +# -------------------------------------------------------------------------- +# Measurement contract +# -------------------------------------------------------------------------- + +# The launcher path is provenance DATA: it names a file inside the instrument +# closure and nothing in this module executes it. The Stage-3 launcher census +# exempts exactly this assignment shape, on this marker, in this file only. +OWN_CHECK_PATH = "scripts/own-check.sh" # p037-stage3: launcher-literal-is-provenance-data + +# What we measure WITH. Frozen across a before/after pair. +INSTRUMENT_PATHS: tuple[str, ...] = ( + "ownlang/", + "rust/", + OWN_CHECK_PATH, + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py", +) + +# What A2.1 is allowed to change between before and after. +TREATMENT_PATHS: tuple[str, ...] = ( + "frontend/roslyn/OwnSharp.Extractor/", + "spec/", +) + +# The full closure a record is fresh against: neither half may move between a +# record's source commit and the HEAD it is used at. +SUBJECT_PATHS: tuple[str, ...] = INSTRUMENT_PATHS + TREATMENT_PATHS + +# Repo-local paths the snapshot programs execute or import directly. The +# self-check proves every one is inside SUBJECT_PATHS and exists in HEAD. +RUNTIME_REPO_PATHS: tuple[str, ...] = ( + "frontend/roslyn/OwnSharp.Extractor/", + "ownlang/", + "rust/", + OWN_CHECK_PATH, + "scripts/p037_evidence.py", + "scripts/p037_mos_snapshot.py", + "scripts/p037_verdict_snapshot.py", + "scripts/shadow_compare.py", + "spec/", +) + +CORPUS_DIRS: tuple[str, ...] = ( + "corpus/real-world", + "corpus/wpf", + "corpus/di", + "corpus/fixtures", + "corpus/p036-bakeoff", +) + +# The independent syntax-shape source that caught A1's return-parameter defect. +REPO_TREE_DIRS: tuple[str, ...] = ("frontend", "audit") + +# Frozen populations are materialized here, one directory per population commit. +# Ignored by git, so materializing never dirties the tree; deterministic, so the +# extractor's cwd-relative file paths are identical on both sides of a pair. +POPULATION_DIR = ".p037-population" + +# The extractor widens its Roslyn reference set from this variable. An evidence +# run removes it from the child environment AND reads the extractor's stderr for +# the line it prints whenever it did load extra references. +EXTRA_REF_ENV = "OWN_EXTRA_REF_DIRS" +EXTRA_REF_LINE = re.compile(r"^extractor: \+\d+ extra references from ") +REFERENCE_PROFILE_CLEAN = "removed-from-child-environment" + +RUST_ARTIFACTS: dict[str, tuple[str, str]] = { + "own-shadow-engine": ("own-shadow", "own-shadow-engine"), + "own-cli": ("own-cli", "own-cli"), +} + +# The semantic filesystem mechanisms of the extractor's EXPLICIT-FILE input +# mode, each anchored to the construct that implements it. tests/ +# test_p037_evidence.py requires every anchor to match and every filesystem +# read site in the extractor to be classified, so a new side input cannot enter +# explicit-file analysis without this closure being updated on purpose. +EXPLICIT_FILE_SEMANTIC_FS_DEPENDENCIES: tuple[dict[str, str], ...] = ( + { + "mechanism": "explicit-input-existence", + "closure": "analysis_manifest", + "anchor": r"if \(!File\.Exists\(path\)\)", + }, + { + "mechanism": "explicit-cs-contents", + "closure": "analysis_manifest", + "anchor": r"text = File\.ReadAllText\(path\);", + }, + { + "mechanism": "sibling-xaml", + "closure": "support_manifest", + "anchor": ( + r"File\.Exists\(xamlPath\) && " + r"XamlDeclaresOwnedDataContext\(File\.ReadAllText\(xamlPath\)\)" + ), + }, + { + "mechanism": "ancestor-fody", + "closure": "support_manifest + external_ancestor_problems", + "anchor": r"Path\.Combine\(dir, \"FodyWeavers\.xml\"\)", + }, +) + + +# -------------------------------------------------------------------------- +# git +# -------------------------------------------------------------------------- + +def _git( + *args: str, repo: Path = ROOT, stdin: bytes | None = None +) -> subprocess.CompletedProcess[bytes]: + try: + return subprocess.run( + ["git", "-C", str(repo), *args], + capture_output=True, + check=False, + input=stdin, + timeout=300, + ) + except (OSError, subprocess.SubprocessError) as exc: + raise EvidenceRefused(f"git {' '.join(args)} failed: {exc}") from exc + + +def _git_text(*args: str, repo: Path = ROOT) -> str: + proc = _git(*args, repo=repo) + if proc.returncode != 0: + detail = proc.stderr.decode("utf-8", "replace").strip() + raise EvidenceRefused( + f"git {' '.join(args)} exited {proc.returncode}" + + (f": {detail}" if detail else "") + ) + return proc.stdout.decode("utf-8").strip() + + +def commit_exists(rev: str, *, repo: Path = ROOT) -> bool: + return _git("cat-file", "-e", f"{rev}^{{commit}}", repo=repo).returncode == 0 + + +def resolve_commit(rev: str, *, repo: Path = ROOT) -> str: + return _git_text("rev-parse", "--verify", f"{rev}^{{commit}}", repo=repo) + + +def is_ancestor(older: str, newer: str, *, repo: Path = ROOT) -> bool: + return _git("merge-base", "--is-ancestor", older, newer, repo=repo).returncode == 0 + + +def paths_differ(a: str, b: str, paths: Iterable[str], *, repo: Path = ROOT) -> bool: + proc = _git("diff", "--quiet", a, b, "--", *paths, repo=repo) + if proc.returncode == 0: + return False + if proc.returncode == 1: + return True + raise EvidenceRefused( + f"git could not compare {a[:12]}..{b[:12]}: " + f"{proc.stderr.decode('utf-8', 'replace').strip()}" + ) + + +def current_commit(*, repo: Path = ROOT) -> str: + return _git_text("rev-parse", "HEAD", repo=repo) + + +def tree_is_dirty(*, repo: Path = ROOT) -> bool: + return bool(_git_text("status", "--porcelain", repo=repo)) + + +def _norm(path: str) -> str: + return path.replace("\\", "/").strip("/") + + +def _covered(path: str, roots: Iterable[str]) -> bool: + p = _norm(path) + for root in roots: + r = _norm(root) + if p == r or p.startswith(r + "/"): + return True + return False + + +def closure_problems(*, repo: Path = ROOT) -> list[str]: + """Static self-check: every repo-local runtime path is in the closure.""" + problems: list[str] = [] + for path in RUNTIME_REPO_PATHS: + if not _covered(path, SUBJECT_PATHS): + problems.append( + f"runtime path {path!r} is outside SUBJECT_PATHS; a measurement " + "could change without invalidating its evidence" + ) + if _git("cat-file", "-e", f"HEAD:{_norm(path)}", repo=repo).returncode != 0: + problems.append( + f"runtime path {path!r} is declared but does not exist in HEAD; " + "a misspelled dependency would otherwise protect an empty path" + ) + if len(set(SUBJECT_PATHS)) != len(SUBJECT_PATHS): + problems.append("SUBJECT_PATHS contains duplicate entries") + if set(INSTRUMENT_PATHS) & set(TREATMENT_PATHS): + problems.append("a path is declared as both instrument and treatment") + return problems + + +# -------------------------------------------------------------------------- +# Frozen population: manifests, digests, materialization +# -------------------------------------------------------------------------- + +def _tree_blobs(commit: str, paths: tuple[str, ...], *, repo: Path = ROOT) -> dict[str, str]: + """path -> blob for every blob at ``commit`` under ``paths`` (all, if empty).""" + proc = _git("ls-tree", "-r", "-z", commit, "--", *paths, repo=repo) + if proc.returncode != 0: + detail = proc.stderr.decode("utf-8", "replace").strip() + raise EvidenceRefused( + f"cannot enumerate {list(paths) or 'the tree'} at {commit[:12]}" + + (f": {detail}" if detail else "") + ) + out: dict[str, str] = {} + for raw in proc.stdout.split(b"\0"): + if not raw: + continue + try: + meta, path_raw = raw.split(b"\t", 1) + _mode, kind, blob = meta.decode("ascii").split() + path = path_raw.decode("utf-8") + except (ValueError, UnicodeDecodeError) as exc: + raise EvidenceRefused(f"cannot parse git ls-tree record {raw!r}: {exc}") from exc + if kind == "blob": + out[path.replace("\\", "/")] = blob + return out + + +def _sorted_entries(entries: Iterable[dict[str, str]]) -> list[dict[str, str]]: + return sorted(entries, key=lambda e: e["path"].encode("utf-8")) + + +def analysis_manifest( + commit: str, roots: tuple[str, ...], *, repo: Path = ROOT +) -> list[dict[str, str]]: + """Exact committed C# primary input set at ``commit``: path and git blob.""" + if not roots: + raise EvidenceRefused("an evidence input set may not have zero roots") + blobs = _tree_blobs(commit, roots, repo=repo) + out = _sorted_entries( + {"path": p, "blob": b} for p, b in blobs.items() if p.endswith(".cs") + ) + if not out: + raise EvidenceRefused( + f"input roots {list(roots)!r} contain no committed .cs files at {commit[:12]}" + ) + return out + + +def support_manifest( + commit: str, analysis: list[dict[str, str]], *, repo: Path = ROOT +) -> list[dict[str, str]]: + """Committed side inputs the extractor reads BECAUSE of the primary inputs. + + Explicit-file mode only: the sibling ``.xaml`` of every ``*.xaml.cs``, and + every ``FodyWeavers.xml`` on a primary file's ancestor chain up to the repo + root. Project/solution expansion (``WeaverOwnedFiles`` via a ``.csproj``) is + not part of this closure and is not certified by it. + """ + tree = _tree_blobs(commit, (), repo=repo) + out: dict[str, dict[str, str]] = {} + for entry in analysis: + path = entry["path"] + if path.endswith(".xaml.cs"): + sibling = path[:-3] + if sibling in tree: + out[sibling] = {"path": sibling, "blob": tree[sibling], + "mechanism": "sibling-xaml"} + parts = path.split("/")[:-1] + for depth in range(len(parts), -1, -1): + candidate = "/".join([*parts[:depth], "FodyWeavers.xml"]) + if candidate in tree: + out[candidate] = {"path": candidate, "blob": tree[candidate], + "mechanism": "ancestor-fody"} + return _sorted_entries(out.values()) + + +def _manifest_digest(entries: list[dict[str, str]]) -> str: + """Stable identity of a manifest, independent of JSON layout.""" + h = hashlib.sha256() + for entry in entries: + for field in ("path", "blob", "mechanism"): + value = entry.get(field, "").encode("utf-8") + h.update(len(value).to_bytes(8, "big")) + h.update(value) + return h.hexdigest() + + +def population_fields( + population_commit: str, roots: tuple[str, ...], *, repo: Path = ROOT +) -> dict[str, Any]: + commit = resolve_commit(population_commit, repo=repo) + analysis = analysis_manifest(commit, roots, repo=repo) + support = support_manifest(commit, analysis, repo=repo) + return { + "population_commit": commit, + "input_roots": list(roots), + "analysis_manifest": analysis, + "analysis_manifest_sha256": _manifest_digest(analysis), + "support_manifest": support, + "support_manifest_sha256": _manifest_digest(support), + } + + +def materialization_root( + population_commit: str, analysis_digest: str, *, repo: Path = ROOT +) -> Path: + """One directory per (population commit, primary manifest): the corpus and + the repo populations of the same commit never share a tree, so a take of + one cannot rewrite the files a take of the other is reading.""" + return repo / POPULATION_DIR / population_commit / analysis_digest[:16] + + +def acquire_population(root: Path) -> Path: + """One take per population at a time. The extractor reads side inputs + lazily (the weaver walk runs after parsing), so a concurrent rewrite of the + same directory changes facts without failing anything visible; the lease + refuses that up front and population_intact() refuses it after the fact.""" + lock = root.with_name(root.name + ".lock") + lock.parent.mkdir(parents=True, exist_ok=True) + try: + fd = os.open(lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY) + except FileExistsError: + raise EvidenceRefused( + f"another take holds this population ({lock}); takes run one at a time. " + "Remove the lease only if no take is running" + ) from None + with os.fdopen(fd, "w", encoding="utf-8") as handle: + handle.write(f"{os.getpid()}\n") + return lock + + +def release_population(lock: Path) -> None: + lock.unlink(missing_ok=True) + + +def _manifest_entries(record: dict[str, Any], key: str) -> list[dict[str, str]]: + raw = record.get(key) + if not isinstance(raw, list): + raise EvidenceRefused(f"record carries no {key} list") + out: list[dict[str, str]] = [] + for i, entry in enumerate(raw): + if not ( + isinstance(entry, dict) + and isinstance(entry.get("path"), str) + and isinstance(entry.get("blob"), str) + ): + raise EvidenceRefused(f"{key}[{i}] is not a path/blob record") + clean = {"path": str(entry["path"]), "blob": str(entry["blob"])} + if isinstance(entry.get("mechanism"), str): + clean["mechanism"] = str(entry["mechanism"]) + out.append(clean) + return out + + +def materialize_population(record: dict[str, Any], *, repo: Path = ROOT) -> Path: + """Write the frozen population's exact blobs under the deterministic root. + + Fresh every time (the directory is removed first), verified afterwards by + re-hashing every written file through git so the bytes on disk ARE the + committed blobs, and checked to contain nothing else. + """ + commit = record.get("population_commit") + if not isinstance(commit, str) or not re.fullmatch(r"[0-9a-f]{40}", commit): + raise EvidenceRefused("record carries no full population_commit") + entries = _manifest_entries(record, "analysis_manifest") + _manifest_entries( + record, "support_manifest" + ) + digest = record.get("analysis_manifest_sha256") + if not isinstance(digest, str) or not digest: + raise EvidenceRefused("record carries no analysis_manifest_sha256") + root = materialization_root(commit, digest, repo=repo) + if root.exists(): + shutil.rmtree(root) + root.mkdir(parents=True) + for entry in entries: + rel = _norm(entry["path"]) + if rel.startswith("../") or "/../" in rel or Path(rel).is_absolute(): + raise EvidenceRefused(f"refusing to materialize a non-relative path {rel!r}") + proc = _git("cat-file", "blob", entry["blob"], repo=repo) + if proc.returncode != 0: + raise EvidenceRefused( + f"blob {entry['blob'][:12]} for {rel} is not in this repository" + ) + target = root / rel + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(proc.stdout) + problems = population_intact(record, root, repo=repo) + if problems: + raise EvidenceRefused("; ".join(problems)) + return root + + +def population_intact(record: dict[str, Any], root: Path, *, repo: Path = ROOT) -> list[str]: + """Every materialized file still re-hashes to its blob and nothing else is + there. Run after materializing AND after measuring: the extractor reads + side inputs lazily, so a population that changed under a run produced facts + about a population nobody named.""" + entries = _manifest_entries(record, "analysis_manifest") + _manifest_entries( + record, "support_manifest" + ) + missing = [e["path"] for e in entries if not (root / _norm(e["path"])).is_file()] + if missing: + return [f"{len(missing)} population file(s) are missing; first: {missing[0]}"] + listing = "\n".join(str(root / _norm(e["path"])) for e in entries) + "\n" + proc = _git("hash-object", "--stdin-paths", repo=repo, stdin=listing.encode("utf-8")) + if proc.returncode != 0: + return ["git could not re-hash the materialized population"] + hashes = proc.stdout.decode("ascii").split() + problems: list[str] = [] + changed = [e["path"] for e, h in zip(entries, hashes, strict=True) if h != e["blob"]] + if changed: + problems.append( + f"{len(changed)} population file(s) do not re-hash to their blobs; " + f"first: {changed[0]}" + ) + on_disk = sum(1 for p in root.rglob("*") if p.is_file()) + if on_disk != len(entries): + problems.append( + f"materialization root holds {on_disk} file(s), manifest names {len(entries)}" + ) + return problems + + +def analysis_paths(record: dict[str, Any], root: Path) -> list[Path]: + return [root / _norm(e["path"]) for e in _manifest_entries(record, "analysis_manifest")] + + +def _fody_probe(candidate: Path) -> str: + """Mirror of the extractor's ancestor walk: File.GetAttributes semantics. + + FileNotFound / DirectoryNotFound keep the extractor walking; any other + failure makes it grant the weaver exemption. So: absent, present, or + uninspectable, and only absent is acceptable outside the population. + """ + try: + os.lstat(candidate) + except (FileNotFoundError, NotADirectoryError): + return "absent" + except OSError: + return "uninspectable" + return "present" + + +def external_ancestor_problems(root: Path) -> list[str]: + """No FodyWeavers.xml may exist, or be uninspectable, above the population. + + The extractor walks from each file's directory to the filesystem root; + inside the materialized population that walk is deterministic (only + committed blobs exist there), above it the environment decides. The + exemption a stray external config would grant changes facts with no change + to any commit, so it is refused before extraction, not discovered after. + """ + problems: list[str] = [] + for ancestor in root.resolve().parents: + state = _fody_probe(ancestor / "FodyWeavers.xml") + if state == "present": + problems.append( + f"external FodyWeavers.xml at {ancestor} would grant the extractor's weaver " + "exemption to every materialized file; remove it or move the checkout" + ) + elif state == "uninspectable": + problems.append( + f"cannot prove FodyWeavers.xml absent at {ancestor}; the extractor fails " + "closed toward an exemption there" + ) + return problems + + +# -------------------------------------------------------------------------- +# Execution environment: profile, qualified artifacts, reference sanitation +# -------------------------------------------------------------------------- + +def _tool_text(argv: list[str], *, cwd: Path = ROOT, timeout: float = 120) -> str: + """Run one tool and return non-empty stdout, or refuse the evidence.""" + try: + proc = subprocess.run( + argv, cwd=cwd, capture_output=True, text=True, check=False, timeout=timeout + ) + except (OSError, subprocess.SubprocessError) as exc: + raise EvidenceRefused(f"{argv[0]} could not run: {exc}") from exc + if proc.returncode != 0: + detail = proc.stderr.strip()[-800:] + raise EvidenceRefused( + f"{' '.join(argv)} exited {proc.returncode}" + (f": {detail}" if detail else "") + ) + value = proc.stdout.strip() + if not value: + raise EvidenceRefused(f"{' '.join(argv)} returned no output") + return value + + +def _dotnet_runtimes() -> list[str]: + runtimes: list[str] = [] + for line in _tool_text(["dotnet", "--list-runtimes"]).splitlines(): + parts = line.split() + if len(parts) >= 2: + runtimes.append(f"{parts[0]} {parts[1]}") + if not runtimes: + raise EvidenceRefused("dotnet --list-runtimes named no runtime") + return sorted(runtimes) + + +def rust_identity() -> dict[str, str]: + rustc = _tool_text(["rustc", "-vV"]) + host = "" + for line in rustc.splitlines(): + if line.startswith("host:"): + host = line.split(":", 1)[1].strip() + if not host: + raise EvidenceRefused("rustc -vV did not report a host triple") + return {"rustc": rustc, "cargo": _tool_text(["cargo", "-V"]), "host": host} + + +def execution_profile(*, include_rust: bool) -> dict[str, Any]: + """Identities that change what a run measures; an eligibility field, not + decoration. The reference engine is Python, the extractor's reference set + is the .NET runtime's trusted platform assemblies, the port is Rust.""" + profile: dict[str, Any] = { + "python": { + "implementation": platform.python_implementation(), + "version": sys.version, + }, + "platform": {"system": platform.system(), "machine": platform.machine()}, + "dotnet": {"sdk": _tool_text(["dotnet", "--version"]), "runtimes": _dotnet_runtimes()}, + } + if include_rust: + profile["rust"] = rust_identity() + return profile + + +def build_rust_artifact(package: str, binary: str, *, repo: Path = ROOT) -> dict[str, Any]: + """Build the exact Rust executable an evidence run will execute, qualified. + + The path comes from cargo's own compiler-artifact message, never from a + guessed target/ layout; the digest is taken from that file; the lock file, + toolchain and source commit are recorded next to it. + """ + # The package's own artifacts are removed first so that the executable this + # call qualifies is the one THIS build produced from HEAD's sources: cargo + # judges freshness by source fingerprints, never by the output's bytes, so + # a target/ file rewritten by anyone would otherwise be "fresh" and qualified + # as is. Dependencies stay cached; only the package is recompiled and linked. + clean = ["cargo", "clean", "--release", "-p", package] + argv = [ + "cargo", "build", "--locked", "--release", "--message-format=json", + "-p", package, "--bin", binary, + ] + try: + cleaned = subprocess.run( + clean, cwd=repo / "rust", capture_output=True, text=True, check=False, timeout=600, + ) + if cleaned.returncode != 0: + raise EvidenceRefused( + f"{' '.join(clean)} failed: {cleaned.stderr.strip()[-800:]}" + ) + proc = subprocess.run( + argv, cwd=repo / "rust", capture_output=True, text=True, check=False, + timeout=1800, + ) + except (OSError, subprocess.SubprocessError) as exc: + raise EvidenceRefused(f"cannot build {package}/{binary}: {exc}") from exc + if proc.returncode != 0: + raise EvidenceRefused( + f"{' '.join(argv)} failed: {proc.stderr.strip()[-1200:]}" + ) + executable: str | None = None + fresh: bool | None = None + for line in proc.stdout.splitlines(): + try: + message = json.loads(line) + except ValueError: + continue + if not isinstance(message, dict) or message.get("reason") != "compiler-artifact": + continue + target = message.get("target") + if not isinstance(target, dict): + continue + kinds = target.get("kind") + if ( + target.get("name") == binary + and isinstance(kinds, list) + and "bin" in kinds + and isinstance(message.get("executable"), str) + ): + executable = str(message["executable"]) + fresh = bool(message.get("fresh")) + if executable is None: + raise EvidenceRefused( + f"cargo reported no compiler-artifact executable for {package}/{binary}" + ) + if fresh: + raise EvidenceRefused( + f"cargo did not rebuild {package}/{binary} after cleaning it; refusing to " + "qualify an executable this build did not produce" + ) + path = Path(executable) + try: + raw = path.read_bytes() + except OSError as exc: + raise EvidenceRefused(f"built {package}/{binary} but cannot read {path}: {exc}") from exc + rust = rust_identity() + lock = repo / "rust" / "Cargo.lock" + try: + lock_sha = hashlib.sha256(lock.read_bytes()).hexdigest() + except OSError as exc: + raise EvidenceRefused(f"cannot read {lock}: {exc}") from exc + try: + repo_path: str | None = path.resolve().relative_to(repo.resolve()).as_posix() + except ValueError: + repo_path = None + return { + "package": package, + "binary": binary, + "profile": "release", + "executable": str(path), + "repo_path": repo_path, + "sha256": hashlib.sha256(raw).hexdigest(), + "bytes": len(raw), + "source_commit": current_commit(repo=repo), + "dirty": tree_is_dirty(repo=repo), + "cargo_argv": argv, + "cargo_clean_argv": clean, + "rebuilt_by_this_call": True, + "rustc": rust["rustc"], + "cargo": rust["cargo"], + "host": rust["host"], + "cargo_lock_blob": _git_text("rev-parse", "HEAD:rust/Cargo.lock", repo=repo), + "cargo_lock_sha256": lock_sha, + } + + +def artifact_problems(artifact: dict[str, Any]) -> list[str]: + """The file about to be executed IS the qualified build the record names.""" + problems: list[str] = [] + for key in ("package", "binary", "executable", "sha256", "bytes", "source_commit", + "rustc", "cargo", "host", "cargo_lock_blob"): + if key not in artifact: + problems.append(f"artifact record lacks {key}") + if problems: + return problems + if artifact.get("dirty") is not False: + problems.append("artifact was built on a dirty tree") + try: + raw = Path(str(artifact["executable"])).read_bytes() + except OSError as exc: + return [*problems, f"qualified executable cannot be read: {exc}"] + if hashlib.sha256(raw).hexdigest() != artifact["sha256"] or len(raw) != artifact["bytes"]: + problems.append( + f"executable {artifact['executable']} does not match the qualified build's digest" + ) + return problems + + +def new_take_dir() -> Path: + """A private, unique directory for one take's sealed executables. Outside + the checkout on purpose: nothing that runs against the tree can reach it.""" + return Path(tempfile.mkdtemp(prefix="p037-take-")) + + +def seal_artifact(artifact: dict[str, Any], take_dir: Path) -> dict[str, Any]: + """Copy the qualified executable into the take's private directory; the run + executes ONLY that copy. + + target/release/ is shared mutable state: any cargo build, anyone's, + can replace it while a take is running, and the launcher would open the new + file under the old digest on record. Sealing prevents that; finalize_run's + re-hash of the sealed copy afterwards attests that prevention held. + """ + source = Path(str(artifact["executable"])) + try: + raw = source.read_bytes() + except OSError as exc: + raise EvidenceRefused(f"qualified executable cannot be read for sealing: {exc}") from exc + if hashlib.sha256(raw).hexdigest() != artifact["sha256"] or len(raw) != artifact["bytes"]: + raise EvidenceRefused( + f"{source} no longer matches the qualified build at sealing time" + ) + take_dir.mkdir(parents=True, exist_ok=True) + sealed = take_dir / source.name + sealed.write_bytes(raw) + sealed.chmod(0o700) + check = sealed.read_bytes() + if hashlib.sha256(check).hexdigest() != artifact["sha256"] or len(check) != artifact["bytes"]: + raise EvidenceRefused("the sealed copy does not match the qualified build") + artifact["executed"] = { + "sealed_path": str(sealed), + "sha256": artifact["sha256"], + "bytes": len(check), + } + return artifact + + +def executed_artifact_problems(artifact: dict[str, Any]) -> list[str]: + """Post-run attestation: the file that ran still IS the qualified build.""" + executed = artifact.get("executed") + if not isinstance(executed, dict) or not isinstance(executed.get("sealed_path"), str): + return ["artifact was never sealed for execution"] + try: + raw = Path(str(executed["sealed_path"])).read_bytes() + except OSError as exc: + return [f"the sealed executable cannot be read after the run: {exc}"] + digest = hashlib.sha256(raw).hexdigest() + if digest != artifact.get("sha256") or len(raw) != artifact.get("bytes"): + return ["the executable that ran no longer matches the qualified build's digest"] + return [] + + +def finalize_run( + snapshot: dict[str, Any], provenance: dict[str, Any], root: Path, *, repo: Path = ROOT +) -> None: + """The post-run attestations every take makes before writing its record. + + The population must still re-hash to its blobs, every sealed executable + must still re-hash to its qualified build, and the tree must still be + clean. Any failure makes the snapshot not evidence; the reasons are kept. + """ + tampered = population_intact(provenance, root, repo=repo) + snapshot["post_run_population_intact"] = not tampered + if tampered: + snapshot["is_evidence"] = False + snapshot["population_tampered"] = tampered + artifacts = snapshot.get("artifacts") + if isinstance(artifacts, dict): + for name, artifact in artifacts.items(): + if not isinstance(artifact, dict): + continue + problems = executed_artifact_problems(artifact) + executed = artifact.get("executed") + if not isinstance(executed, dict): + executed = {} + artifact["executed"] = executed + executed["post_run_intact"] = not problems + if problems: + snapshot["is_evidence"] = False + tampered_artifacts = snapshot.setdefault("artifact_tampered", {}) + tampered_artifacts[name] = problems + if tree_is_dirty(repo=repo): + snapshot["is_evidence"] = False + snapshot["post_run_dirty"] = True + + +def sanitized_env(**overrides: str) -> dict[str, str]: + """The child environment for every launcher/extractor process.""" + env = {k: v for k, v in os.environ.items() if k != EXTRA_REF_ENV} + env.update(overrides) + return env + + +def reference_contamination(stderr_text: str) -> list[str]: + """The extractor's own attestation that extra references were loaded.""" + return [line.strip() for line in stderr_text.splitlines() if EXTRA_REF_LINE.match(line.strip())] + + +def clean_reference_profile() -> dict[str, Any]: + return {EXTRA_REF_ENV: REFERENCE_PROFILE_CLEAN, "observed_extra_reference_lines": 0} + + +def reference_profile_problems(record: dict[str, Any]) -> list[str]: + profile = record.get("reference_profile") + if not isinstance(profile, dict): + return ["record carries no reference_profile"] + problems: list[str] = [] + if profile.get(EXTRA_REF_ENV) != REFERENCE_PROFILE_CLEAN: + problems.append(f"{EXTRA_REF_ENV} was not removed from the child environment") + if profile.get("observed_extra_reference_lines") != 0: + problems.append("the extractor reported loading extra references during the run") + return problems + + +def scratch_problems(out: Path, *, repo: Path = ROOT) -> list[str]: + """Evidence is written outside the checkout or into an ignored path only.""" + try: + rel = out.resolve().relative_to(repo.resolve()) + except ValueError: + return [] + if _git("check-ignore", "-q", "--", rel.as_posix(), repo=repo).returncode == 0: + return [] + return [ + f"--out {out} is inside the checkout and not git-ignored; write evidence outside " + "the tree (or to an ignored scratch path) and copy it into docs/evidence in a " + "separate record commit" + ] + + +# -------------------------------------------------------------------------- +# Records +# -------------------------------------------------------------------------- + +def evidence_fields( + input_roots: tuple[str, ...], + *, + population_commit: str = "HEAD", + source_commit: str | None = None, + repo: Path = ROOT, +) -> dict[str, Any]: + """Provenance fields of a snapshot taken at ``source_commit`` (HEAD).""" + problems = closure_problems(repo=repo) + if problems: + raise EvidenceRefused("; ".join(problems)) + source = resolve_commit(source_commit or "HEAD", repo=repo) + dirty = tree_is_dirty(repo=repo) + population = population_fields(population_commit, input_roots, repo=repo) + if not is_ancestor(population["population_commit"], source, repo=repo): + raise EvidenceRefused( + f"population commit {population['population_commit'][:12]} is not an ancestor " + f"of (or equal to) source commit {source[:12]}" + ) + return { + "source_commit": source, + "dirty": dirty, + "is_evidence": not dirty, + "instrument_paths": list(INSTRUMENT_PATHS), + "treatment_paths": list(TREATMENT_PATHS), + "subject_paths": list(SUBJECT_PATHS), + **population, + } + + +def record_problems(record: dict[str, Any], *, repo: Path = ROOT) -> list[str]: + """Self-consistency of one evidence record at its OWN source commit. + + This is what a historical ``before`` has to prove: honest bits, the + closure this tool defines, a population that re-derives from its commit + byte for byte, a clean reference profile, a recorded execution profile, + artifacts built from the same commit. + """ + problems: list[str] = [] + source = record.get("source_commit") + if not isinstance(source, str) or not source: + return ["evidence records no source_commit"] + if record.get("dirty") is not False: + problems.append("evidence was taken on a dirty tree") + if record.get("is_evidence") is not True: + problems.append("record does not mark itself is_evidence=true") + if record.get("post_run_dirty"): + problems.append("the tree was dirty after the measurement") + if record.get("post_run_population_intact") is not True: + problems.append("record does not attest that the population stayed intact through the run") + if record.get("instrument_paths") != list(INSTRUMENT_PATHS): + problems.append("recorded instrument_paths differ from this tool's instrument closure") + if record.get("treatment_paths") != list(TREATMENT_PATHS): + problems.append("recorded treatment_paths differ from this tool's treatment closure") + if record.get("subject_paths") != list(SUBJECT_PATHS): + problems.append("recorded subject_paths differ from this tool's measurement closure") + + roots_raw = record.get("input_roots") + roots: tuple[str, ...] = () + if ( + isinstance(roots_raw, list) + and roots_raw + and all(isinstance(x, str) and x for x in roots_raw) + ): + roots = tuple(str(x) for x in roots_raw) + else: + problems.append("record carries no valid input_roots") + + if not commit_exists(source, repo=repo): + return [*problems, f"source commit {source[:12]} is not present in this checkout"] + + population = record.get("population_commit") + if not isinstance(population, str) or not commit_exists(population, repo=repo): + problems.append("record names no population_commit present in this checkout") + else: + if not is_ancestor(population, source, repo=repo): + problems.append( + f"population commit {population[:12]} is not an ancestor of (or equal to) " + f"source commit {source[:12]}" + ) + try: + recorded_analysis = _manifest_entries(record, "analysis_manifest") + recorded_support = _manifest_entries(record, "support_manifest") + except EvidenceRefused as exc: + problems.append(str(exc)) + else: + if roots: + try: + analysis = analysis_manifest(population, roots, repo=repo) + support = support_manifest(population, analysis, repo=repo) + except EvidenceRefused as exc: + problems.append(str(exc)) + else: + if recorded_analysis != analysis: + problems.append( + "recorded analysis_manifest does not match the population " + "commit's exact C# input set" + ) + if recorded_support != support: + problems.append( + "recorded support_manifest does not match the population " + "commit's semantic support closure" + ) + if record.get("analysis_manifest_sha256") != _manifest_digest(recorded_analysis): + problems.append("analysis_manifest_sha256 does not name the carried manifest") + if record.get("support_manifest_sha256") != _manifest_digest(recorded_support): + problems.append("support_manifest_sha256 does not name the carried manifest") + + problems.extend(reference_profile_problems(record)) + + profile = record.get("execution_profile") + if not isinstance(profile, dict) or not profile: + problems.append("record carries no execution_profile") + + artifacts = record.get("artifacts", {}) + if not isinstance(artifacts, dict): + problems.append("artifacts is not an object") + else: + for name, artifact in artifacts.items(): + if not isinstance(artifact, dict): + problems.append(f"artifact {name!r} is not an object") + continue + if artifact.get("source_commit") != source: + problems.append(f"artifact {name!r} was not built from the record's source commit") + if artifact.get("dirty") is not False: + problems.append(f"artifact {name!r} was built on a dirty tree") + if not isinstance(artifact.get("sha256"), str): + problems.append(f"artifact {name!r} carries no sha256") + executed = artifact.get("executed") + if not isinstance(executed, dict): + problems.append(f"artifact {name!r} carries no executed attestation") + else: + if executed.get("sha256") != artifact.get("sha256"): + problems.append( + f"artifact {name!r} executed a file other than the qualified build" + ) + if executed.get("post_run_intact") is not True: + problems.append( + f"artifact {name!r} does not attest it stayed intact through the run" + ) + return problems + + +def provenance_problems( + record: dict[str, Any], *, against: str = "HEAD", repo: Path = ROOT +) -> list[str]: + """Whether ``record`` is fresh evidence at ``against``: self-valid, an + ancestor, and neither instrument nor treatment moved in between.""" + problems = [*closure_problems(repo=repo), *record_problems(record, repo=repo)] + source = record.get("source_commit") + if not isinstance(source, str) or not source or not commit_exists(source, repo=repo): + return problems + if not commit_exists(against, repo=repo): + return [*problems, f"comparison commit {against!r} is not present in this checkout"] + if not is_ancestor(source, against, repo=repo): + problems.append( + f"source commit {source[:12]} is not an ancestor of {against}; " + "the evidence describes a history this tree does not contain" + ) + return problems + try: + if paths_differ(source, against, INSTRUMENT_PATHS, repo=repo): + problems.append( + f"the measurement instrument changed between {source[:12]} and {against}; " + "re-take the evidence" + ) + if paths_differ(source, against, TREATMENT_PATHS, repo=repo): + problems.append( + f"the treatment changed between {source[:12]} and {against}; this record " + "does not describe the analyzer at that commit" + ) + except EvidenceRefused as exc: + problems.append(str(exc)) + return problems + + +def comparison_problems( + before: dict[str, Any], + after: dict[str, Any], + *, + against: str = "HEAD", + repo: Path = ROOT, +) -> list[str]: + """Differential eligibility: may these two records be read as one + before/after experiment whose result is a claim about ``against``? + + before: self-valid at its own commit (it predates the treatment change on + purpose, so it is NOT required to be fresh at HEAD). + after: self-valid AND fresh at ``against``. + pair: ancestry, identical instrument, identical frozen population and + support closure, identical execution profile. + """ + problems = [f"before: {p}" for p in record_problems(before, repo=repo)] + problems += [f"after: {p}" for p in provenance_problems(after, against=against, repo=repo)] + + before_source = before.get("source_commit") + after_source = after.get("source_commit") + if ( + isinstance(before_source, str) + and isinstance(after_source, str) + and commit_exists(before_source, repo=repo) + and commit_exists(after_source, repo=repo) + ): + if not is_ancestor(before_source, after_source, repo=repo): + problems.append( + f"before source {before_source[:12]} is not an ancestor of " + f"after source {after_source[:12]}" + ) + else: + try: + if paths_differ(before_source, after_source, INSTRUMENT_PATHS, repo=repo): + problems.append( + "the measurement instrument differs between before and after; " + "only the treatment may move across a comparison" + ) + except EvidenceRefused as exc: + problems.append(str(exc)) + + if before.get("population_commit") != after.get("population_commit"): + problems.append("before/after name different frozen populations") + if before.get("input_roots") != after.get("input_roots"): + problems.append("before/after input_roots differ") + if before.get("analysis_manifest") != after.get("analysis_manifest"): + problems.append("before/after primary population manifests differ") + if before.get("support_manifest") != after.get("support_manifest"): + problems.append("before/after semantic support manifests differ") + + before_profile = before.get("execution_profile") + after_profile = after.get("execution_profile") + if ( + isinstance(before_profile, dict) + and isinstance(after_profile, dict) + and before_profile + and after_profile + and before_profile != after_profile + ): + problems.append("before/after execution profiles differ") + return problems + + +# -------------------------------------------------------------------------- +# CLI: exercise the environment-facing machinery where cargo, git and dotnet +# are real (the Linux dogfood job), without taking any baseline. +# -------------------------------------------------------------------------- + +def _cli_profile() -> int: + include_rust = shutil.which("cargo") is not None + print(json.dumps(execution_profile(include_rust=include_rust), indent=1, sort_keys=True)) + return 0 + + +def _cli_artifacts() -> int: + rc = 0 + take_dir = new_take_dir() + try: + for name, (package, binary) in RUST_ARTIFACTS.items(): + artifact = build_rust_artifact(package, binary) + problems = artifact_problems(artifact) + if not problems: + seal_artifact(artifact, take_dir) + problems = executed_artifact_problems(artifact) + for problem in problems: + print(f"FAIL[{name}]: {problem}") + rc = 1 + print( + f"{'ok' if not problems else 'FAIL'}[{name}] {artifact['executable']} " + f"sha256={artifact['sha256']} bytes={artifact['bytes']} " + f"source={artifact['source_commit'][:12]} host={artifact['host']}" + + (f" sealed={artifact['executed']['sealed_path']}" if "executed" in artifact + else "") + ) + finally: + shutil.rmtree(take_dir, ignore_errors=True) + return rc + + +def _cli_population(source: str, commit: str, materialize: bool, cleanup: bool) -> int: + roots = {"corpus": CORPUS_DIRS, "repo": REPO_TREE_DIRS}[source] + fields = population_fields(commit, roots) + analysis = fields["analysis_manifest"] + support = fields["support_manifest"] + print( + f"population {fields['population_commit'][:12]} source={source}: " + f"{len(analysis)} primary .cs, {len(support)} support file(s)" + ) + for entry in support: + print(f" support {entry['mechanism']:14s} {entry['path']}") + if not materialize: + return 0 + lock = acquire_population( + materialization_root(fields["population_commit"], fields["analysis_manifest_sha256"]) + ) + try: + root = materialize_population(fields) + problems = external_ancestor_problems(root) + population_intact(fields, root) + for problem in problems: + print(f"FAIL[population]: {problem}") + print(f"materialized {len(analysis) + len(support)} file(s) under {root}") + if cleanup: + shutil.rmtree(root) + print("removed the materialization again (cleanup requested)") + finally: + release_population(lock) + return 1 if problems else 0 + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + sub = ap.add_subparsers(dest="cmd", required=True) + sub.add_parser("profile", help="print the execution profile of this machine") + sub.add_parser("artifacts", help="build both qualified Rust executables and verify them") + p = sub.add_parser("population", help="derive (and optionally materialize) a frozen population") + p.add_argument("--source", required=True, choices=("corpus", "repo")) + p.add_argument("--commit", default="HEAD") + p.add_argument("--materialize", action="store_true") + p.add_argument("--cleanup", action="store_true", + help="remove the materialization after verifying it") + args = ap.parse_args(argv) + try: + if args.cmd == "profile": + return _cli_profile() + if args.cmd == "artifacts": + return _cli_artifacts() + return _cli_population(args.source, args.commit, args.materialize, args.cleanup) + except EvidenceRefused as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/scripts/p037_fact_shapes.py b/scripts/p037_fact_shapes.py new file mode 100755 index 00000000..fce9c68e --- /dev/null +++ b/scripts/p037_fact_shapes.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 +"""The P-037 FACT-SHAPE census: what the extractor emits for shapes A1.1 touches. + +`corpus/p037-shapes//case.cs` is one minimal program per C# shape the +A1.1 steps are known to be sensitive to; `expected.json` beside it records what +the facts must look like and what the verdict must be. + +WHY A SECOND CENSUS EXISTS. The 137-file verdict corpus reported UNCHANGED for +a version of A1.1-a1 that turned six CI jobs red: it contains no method that +returns its own disposable parameter, and the repository's own tree does. The +corpus is labelled for VERDICTS; these steps change the FACT SURFACE. + + verdict coverage != syntax / fact-shape coverage + +Two hundred more random C# files would not have closed that gap. One fixture +per shape does, and it fails by NAME instead of as a number that moved. + +STATUS per shape: + +* ``anchored`` — the facts are what they must stay. A change is a regression. +* ``pending_a2`` — the shape belongs to a step that has not landed. The record + pins TODAY's facts anyway, so the diff a2 produces is visible per shape + rather than aggregated away, and ``a2_contract`` states in prose what a2 owes. + +ENGINE is explicit (#262 Stage 3): the verdict layer is engine-visible, and a +bare invocation resolves the Rust candidate or exits 2 having measured nothing. +The FACT layer is engine-independent by construction — it is the extractor's +output, read before any engine runs. + +Usage: + p037_fact_shapes.py check [--engine rust|python|both] [--only NAME,...] + p037_fact_shapes.py record [--only NAME,...] # regenerate expected.json facts +""" + +from __future__ import annotations + +import argparse +import json +import os +import subprocess +import sys +import tempfile +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parent.parent +SHAPES = ROOT / "corpus" / "p037-shapes" +SCHEMA = "p037-fact-shape/1" + + +def extractor_facts(case: Path, out: Path) -> tuple[int, str]: + """Run the Roslyn extractor alone — no engine, no verdict.""" + cmd = ["dotnet", "run", "--project", + str(ROOT / "frontend" / "roslyn" / "OwnSharp.Extractor"), "--", + str(case), "--flow-locals", "-o", str(out)] + proc = subprocess.run(cmd, capture_output=True, text=True, check=False, cwd=ROOT) + return proc.returncode, proc.stderr.strip()[-400:] + + +def flatten(nodes: list[Any]) -> list[str]: + """A body's ops as stable strings, recursing into branch and loop bodies. + + Deliberately lossy in one direction only: it keeps op, subject and line, and + it keeps NESTING as an explicit `then:`/`else:` prefix, so a fact that moves + between branches is a difference rather than a coincidence. + """ + out: list[str] = [] + for n in nodes: + if not isinstance(n, dict): + continue + subject = n.get("var") if n.get("var") is not None else n.get("callee") + head = f"{n.get('op')}:{subject}@{n.get('line')}" + extras = [] + if "args" in n: + extras.append(f"args={n.get('args')}") + if "arg_bindings" in n: # a2 + extras.append(f"arg_bindings={n.get('arg_bindings')}") + if "guard" in n: # a2 + extras.append(f"guard={n.get('guard')}") + if extras: + head += "[" + " ".join(extras) + "]" + out.append(head) + for key in ("then", "else", "body"): + inner = n.get(key) + if isinstance(inner, list): + out.extend(f"{key}:{s}" for s in flatten(inner)) + return out + + +def observe_facts(case: Path) -> dict[str, Any]: + with tempfile.TemporaryDirectory() as tmp: + facts = Path(tmp) / "facts.json" + rc, err = extractor_facts(case, facts) + if rc != 0 or not facts.exists(): + return {"extractor_failed": {"rc": rc, "stderr_tail": err}} + doc: dict[str, Any] = json.loads(facts.read_text(encoding="utf-8")) + return { + fn["name"]: { + "params": fn.get("params"), + "body": flatten(fn.get("body", [])), + } + for fn in doc.get("functions", []) + } + + +def observe_verdict(case: Path, engine: str) -> list[str]: + cmd = [str(ROOT / "scripts" / "own-check.sh"), "--engine", engine, + "--format", "sarif", "--severity", "warning", str(case)] + proc = subprocess.run(cmd, capture_output=True, text=True, check=False) + try: + doc = json.loads(proc.stdout) + except json.JSONDecodeError: + return [f"UNREADABLE-SARIF rc={proc.returncode} {proc.stderr.strip()[-200:]}"] + out: list[str] = [] + for run in doc.get("runs", []): + for r in run.get("results", []): + loc = (r.get("locations") or [{}])[0] + line = loc.get("physicalLocation", {}).get("region", {}).get("startLine", 0) + out.append(f"{r.get('ruleId')}:{r.get('level')}@{line}") + return sorted(out) + + +def cases(only: set[str]) -> list[Path]: + return sorted(p for p in SHAPES.iterdir() + if p.is_dir() and (p / "case.cs").exists() + and (not only or p.name in only)) + + +def record(only: set[str]) -> int: + for c in cases(only): + spec_path = c / "expected.json" + spec: dict[str, Any] = (json.loads(spec_path.read_text(encoding="utf-8")) + if spec_path.exists() else {}) + spec.setdefault("schema", SCHEMA) + spec.setdefault("shape", c.name) + spec.setdefault("status", "pending_a2") + spec.setdefault("why", "TODO: why this shape is in the census") + spec["facts"] = observe_facts(c / "case.cs") + spec["verdict"] = {e: observe_verdict(c / "case.cs", e) for e in ("rust", "python")} + spec_path.write_text(json.dumps(spec, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8") + print(f"recorded {c.name}: {len(spec['facts'])} function record(s), " + f"verdict rust={spec['verdict']['rust']}") + return 0 + + +def check(only: set[str], engines: list[str]) -> int: + failures = 0 + for c in cases(only): + spec_path = c / "expected.json" + if not spec_path.exists(): + print(f"MISSING {c.name}: no expected.json (run `record` and annotate it)") + failures += 1 + continue + spec: dict[str, Any] = json.loads(spec_path.read_text(encoding="utf-8")) + tag = "anchor" if spec.get("status") == "anchored" else "pending-a2" + facts = observe_facts(c / "case.cs") + ok = facts == spec["facts"] + if not ok: + failures += 1 + print(f"FACTS MOVED {c.name} [{tag}]") + for k in sorted(set(facts) | set(spec["facts"])): + if facts.get(k) != spec["facts"].get(k): + print(f" {k}") + print(f" recorded: {json.dumps(spec['facts'].get(k))}") + print(f" observed: {json.dumps(facts.get(k))}") + for e in engines: + got = observe_verdict(c / "case.cs", e) + want = spec["verdict"][e] + if got != want: + failures += 1 + ok = False + print(f"VERDICT MOVED {c.name} [{tag}] engine={e}: " + f"recorded {want}, observed {got}") + if ok: + print(f"ok {c.name:28} [{tag}] {len(facts)} record(s)") + total = len(cases(only)) + if failures: + print(f"\nRESULT: {failures} difference(s) over {total} shape(s). A shape that " + f"moved without a step meaning to move it is a regression; a shape a step " + f"MEANT to move is re-recorded deliberately, never quietly.") + return 1 + print(f"\nRESULT: all {total} shape(s) match their recorded facts and verdicts") + return 0 + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + sub = ap.add_subparsers(dest="cmd", required=True) + for name in ("check", "record"): + p = sub.add_parser(name) + p.add_argument("--only", default="", help="comma-separated shape names") + if name == "check": + p.add_argument("--engine", default="both", + choices=("rust", "python", "both")) + args = ap.parse_args(argv) + only = {n for n in args.only.split(",") if n} + path_dirs = os.environ.get("PATH", "").split(os.pathsep) + if not os.environ.get("DOTNET_ROOT") and not any( + os.access(os.path.join(p, "dotnet"), os.X_OK) for p in path_dirs): + print("dotnet is not on PATH and DOTNET_ROOT is unset: the extractor cannot run", + file=sys.stderr) + return 2 + if args.cmd == "record": + return record(only) + engines = ["rust", "python"] if args.engine == "both" else [args.engine] + return check(only, engines) + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/scripts/p037_mos_snapshot.py b/scripts/p037_mos_snapshot.py new file mode 100755 index 00000000..e0f8c373 --- /dev/null +++ b/scripts/p037_mos_snapshot.py @@ -0,0 +1,492 @@ +#!/usr/bin/env python3 +"""P-037 level-2 evidence: whole MOS snapshots over two independent C# sources. + +This tool deliberately reuses P-022's capture protocol on both engines. It does +not implement a second summaries reader or a second Rust dump path: + +* facts are extracted once through ``own-check.sh --emit-facts``; +* Python is captured through ``ownlang.repro.capture`` (via run_reference); +* Rust is captured through the existing dev-only ``own-shadow-engine`` adapter; +* one ``summary_surface`` function reads the identical layer envelope from both. + +A2 requires richer facts with ZERO MOS movement. The comparison is therefore +whole-document equality, not a projection to transfer: returns/source/degraded/ +unresolved are part of the summary surface and a1 already demonstrated why a +returns-shape change cannot be treated as decoration. + +A2.0 hardening (scripts/p037_evidence.py holds the contract): a snapshot +analyses a FROZEN population materialized from a named commit, never the working +tree; runs only the qualified own-shadow-engine build; removes OWN_EXTRA_REF_DIRS +from the extractor's environment and reads its stderr for the attestation that +no extra reference was loaded; records the execution profile; checks the tree +clean before and after; and refuses to write evidence into a tracked location. + +Usage: + p037_mos_snapshot.py take --source repo --out /scratch/mos-repo.json + p037_mos_snapshot.py take --source repo --population-commit --out ... + p037_mos_snapshot.py compare --before base.json --after new.json [--against ] + p037_mos_snapshot.py verify snapshot.json [--against ] +""" + +from __future__ import annotations + +import argparse +import json +import os +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parent.parent +SCRIPTS = ROOT / "scripts" +sys.path.insert(0, str(SCRIPTS)) +sys.path.insert(0, str(ROOT)) + +import p037_evidence as ev # noqa: E402 +from shadow_compare import ( # noqa: E402 + DEFAULT_TIMEOUT_SECONDS, + ExecutionFailure, + engine_identity, + run_port, + run_reference, +) + +from ownlang.repro import ENGINE_PYTHON, ENGINE_RUST, hash_bytes # noqa: E402 + +SCHEMA = "p037-mos-snapshot/2" +SOURCES: dict[str, tuple[str, ...]] = { + "corpus": ev.CORPUS_DIRS, + "repo": ev.REPO_TREE_DIRS, +} + + +class ReferenceContamination(RuntimeError): + """The extractor attested that it loaded references from the environment.""" + + def __init__(self, document: str, lines: list[str]) -> None: + super().__init__(f"{document}: the extractor loaded extra references: {lines}") + self.lines = lines + + +def _bash() -> str: + if os.name != "nt": + return "bash" + for candidate in ( + os.environ.get("SHELL"), + r"C:\Program Files\Git\bin\bash.exe", + r"C:\Program Files\Git\usr\bin\bash.exe", + ): + if candidate and Path(candidate).is_file(): + return candidate + raise RuntimeError("p037_mos_snapshot requires a real bash (Git Bash on Windows)") + + +def extract_facts(paths: list[Path], document: str) -> bytes: + """One extractor execution; the emitted facts are the bytes both engines see. + + The child environment is sanitized (no OWN_EXTRA_REF_DIRS) and the + launcher's stderr, which carries the extractor's own messages, is read for + the line the extractor prints when it did widen its reference set. + """ + if not paths: + raise RuntimeError(f"{document}: zero source files") + with tempfile.TemporaryDirectory(prefix="p037-mos-") as td: + facts = Path(td) / "facts.json" + cmd = [ + _bash(), str(ROOT / "scripts" / "own-check.sh"), + "--engine", "python", + "--format", "sarif", + "--severity", "warning", + "--emit-facts", str(facts), + "--", *(str(path) for path in paths), + ] + proc = subprocess.run( + cmd, cwd=ROOT, capture_output=True, check=False, env=ev.sanitized_env() + ) + stderr = proc.stderr.decode("utf-8", "replace") + contamination = ev.reference_contamination(stderr) + if contamination: + raise ReferenceContamination(document, contamination) + if proc.returncode != 0: + raise RuntimeError( + f"extractor/launcher failed for {document}: " + f"exit {proc.returncode}; stderr={stderr[-800:]}" + ) + try: + return facts.read_bytes() + except OSError as exc: + raise RuntimeError(f"no emitted facts for {document}: {exc}") from exc + + +def source_documents( + source: str, files: list[Path], root: Path +) -> list[tuple[str, list[Path]]]: + """The two independent source semantics. + + The labelled corpus is a set of independent programs and is therefore + measured one file at a time, matching its verdict labels. The repository + tree is one program: all tracked C# files are handed to one Roslyn + compilation so inter-file calls and summaries remain observable. Document + ids are population-relative, so they are identical across a pair. + """ + if source == "corpus": + return [(path.relative_to(root).as_posix(), [path]) for path in files] + if source == "repo": + return [("repo-tree", files)] + raise RuntimeError(f"unknown source {source!r}") + + +def summary_surface(entry: dict[str, Any]) -> dict[str, Any]: + """The one reader for either engine's capture-format summaries layer.""" + layers = entry.get("layers") + if not isinstance(layers, list): + raise RuntimeError(f"engine {entry.get('id')!r} capture has no layers array") + matches = [layer for layer in layers + if isinstance(layer, dict) and layer.get("layer") == "summaries"] + if len(matches) != 1: + raise RuntimeError( + f"engine {entry.get('id')!r} capture has {len(matches)} summaries layers, expected one" + ) + layer = matches[0] + status = layer.get("status") + if status == "produced": + document = layer.get("document") + if not isinstance(document, dict): + raise RuntimeError("produced summaries layer carries no document object") + return {"status": "produced", "document": document} + if status == "refused": + return {"status": "refused", "error": layer.get("error")} + raise RuntimeError(f"summaries layer has unknown status {status!r}") + + +def capture_pair(raw: bytes, adapter: dict[str, Any], timeout: float + ) -> tuple[dict[str, Any], dict[str, Any]]: + reference = run_reference(raw) + py = reference.get("entry") + if not isinstance(py, dict): + raise RuntimeError( + "Python capture refused emitted OwnIR: " + f"{reference.get('canonical_error')}" + ) + port = run_port(raw, adapter, timeout) + envelope = port.get("envelope") + if not isinstance(envelope, dict) or not isinstance(envelope.get("engine"), dict): + raise RuntimeError("Rust adapter returned no engine capture") + rs = envelope["engine"] + identity = hash_bytes(raw) + for name, entry in ((ENGINE_PYTHON, py), (ENGINE_RUST, rs)): + if entry.get("consumed") != identity: + raise RuntimeError(f"{name} capture does not attest the exact emitted facts bytes") + return py, rs + + +def _refuse(problems: list[str]) -> None: + if problems: + raise ev.EvidenceRefused("; ".join(problems)) + + +def take(source: str, out: Path, timeout: float, population_commit: str) -> int: + roots = SOURCES[source] + try: + _refuse(ev.scratch_problems(out)) + provenance = ev.evidence_fields(roots, population_commit=population_commit) + if provenance["dirty"]: + raise ev.EvidenceRefused("the tree is dirty before the run; evidence starts clean") + profile = ev.execution_profile(include_rust=True) + artifact = ev.build_rust_artifact("own-shadow", "own-shadow-engine") + _refuse(ev.artifact_problems(artifact)) + lease = ev.acquire_population(ev.materialization_root( + provenance["population_commit"], provenance["analysis_manifest_sha256"])) + except (RuntimeError, SystemExit, ev.EvidenceRefused) as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + take_dir = ev.new_take_dir() + try: + return _measure(source, out, timeout, provenance, profile, artifact, take_dir) + finally: + ev.release_population(lease) + shutil.rmtree(take_dir, ignore_errors=True) + + +def _measure( + source: str, + out: Path, + timeout: float, + provenance: dict[str, Any], + profile: dict[str, Any], + artifact: dict[str, Any], + take_dir: Path, +) -> int: + try: + # The run executes the SEALED copy only; target/release/ is shared and + # any later cargo build may rewrite it mid-run. + ev.seal_artifact(artifact, take_dir) + adapter = engine_identity(str(artifact["executed"]["sealed_path"])) + if adapter["sha256"] != artifact["sha256"]: + raise ev.EvidenceRefused("the adapter about to run is not the qualified build") + root = ev.materialize_population(provenance) + _refuse(ev.external_ancestor_problems(root)) + files = ev.analysis_paths(provenance, root) + except ev.EvidenceRefused as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + + documents = source_documents(source, files, root) + reference_profile = ev.clean_reference_profile() + snapshot: dict[str, Any] = { + "schema": SCHEMA, + "source": source, + **provenance, + "materialization_root": root.relative_to(ROOT).as_posix(), + "execution_profile": profile, + "artifacts": {"own-shadow-engine": artifact}, + "reference_profile": reference_profile, + "documents": {}, + } + failures: list[str] = [] + parity_moved: list[str] = [] + for i, (doc_id, paths) in enumerate(documents, 1): + rels = [path.relative_to(root).as_posix() for path in paths] + try: + raw = extract_facts(paths, doc_id) + py, rs = capture_pair(raw, adapter, timeout) + py_surface = summary_surface(py) + rs_surface = summary_surface(rs) + record = { + "inputs": rels, + "facts": hash_bytes(raw), + ENGINE_PYTHON: py_surface, + ENGINE_RUST: rs_surface, + } + if py_surface != rs_surface: + parity_moved.append(doc_id) + except ReferenceContamination as exc: + reference_profile["observed_extra_reference_lines"] = ( + int(reference_profile["observed_extra_reference_lines"]) + len(exc.lines) + ) + failures.append(f"{doc_id}: {exc}") + record = {"inputs": rels, "error": str(exc)} + except (RuntimeError, ExecutionFailure) as exc: + failures.append(f"{doc_id}: {exc}") + record = {"inputs": rels, "error": str(exc)} + snapshot["documents"][doc_id] = record + print( + f" [{i:3}/{len(documents)}] {doc_id} ({len(paths)} source file(s))", + flush=True, + ) + + ev.finalize_run(snapshot, provenance, root) + if failures or parity_moved: + snapshot["is_evidence"] = False + if failures: + snapshot["failures"] = failures + if parity_moved: + snapshot["cross_engine_mismatches"] = parity_moved + + out.write_text(json.dumps(snapshot, indent=1, sort_keys=True) + "\n", encoding="utf-8") + print( + f"snapshot: {len(documents)} document(s) / {len(files)} source file(s), source={source}, " + f"population={provenance['population_commit'][:12]}, " + f"cross-engine mismatches={len(parity_moved)}, failures={len(failures)}, " + f"at {snapshot['source_commit'][:7]}" + f"{'' if snapshot['is_evidence'] else ' (NOT evidence)'}" + ) + print(f"wrote {out}") + return 0 if snapshot["is_evidence"] else 1 + + +def _load(path: Path) -> dict[str, Any]: + data = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(data, dict) or data.get("schema") != SCHEMA: + raise RuntimeError(f"{path}: not a {SCHEMA} document") + return data + + +def _snapshot_problems(record: dict[str, Any]) -> list[str]: + """The documents measured are exactly the frozen population, all of them.""" + problems: list[str] = [] + manifest = record.get("analysis_manifest") + if not isinstance(manifest, list): + return ["snapshot carries no analysis_manifest list"] + expected = { + entry["path"] + for entry in manifest + if isinstance(entry, dict) and isinstance(entry.get("path"), str) + } + documents = record.get("documents") + if not isinstance(documents, dict): + return ["snapshot carries no documents object"] + seen: list[str] = [] + for doc_id, doc in documents.items(): + if not isinstance(doc, dict): + problems.append(f"document {doc_id!r} is not an object") + continue + inputs = doc.get("inputs") + if not isinstance(inputs, list) or not all(isinstance(x, str) for x in inputs): + problems.append(f"document {doc_id!r} carries no valid inputs list") + continue + seen.extend(str(x) for x in inputs) + if "error" in doc: + problems.append(f"document {doc_id!r} records an execution error") + if len(seen) != len(set(seen)): + problems.append("a source input appears in more than one MOS document") + if set(seen) != expected: + problems.append("MOS document inputs do not equal the frozen population manifest") + if "own-shadow-engine" not in (record.get("artifacts") or {}): + problems.append("snapshot names no qualified own-shadow-engine artifact") + return problems + + +def compare(before: Path, after: Path, against: str) -> int: + try: + a, b = _load(before), _load(after) + problems = [ + *ev.comparison_problems(a, b, against=against), + *(f"before: {p}" for p in _snapshot_problems(a)), + *(f"after: {p}" for p in _snapshot_problems(b)), + ] + except (OSError, ValueError, RuntimeError, ev.EvidenceRefused) as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + if a.get("source") != b.get("source"): + problems.append(f"sources differ ({a.get('source')!r} vs {b.get('source')!r})") + if problems: + for problem in problems: + print(f"REFUSED: {problem}", file=sys.stderr) + return 2 + + moved: dict[str, list[str]] = {ENGINE_PYTHON: [], ENGINE_RUST: [], "facts": []} + names = sorted(set(a.get("documents", {})) | set(b.get("documents", {}))) + for rel in names: + left = a.get("documents", {}).get(rel) + right = b.get("documents", {}).get(rel) + if not isinstance(left, dict) or not isinstance(right, dict): + moved[ENGINE_PYTHON].append(rel) + moved[ENGINE_RUST].append(rel) + moved["facts"].append(rel) + continue + if left.get("facts") != right.get("facts"): + moved["facts"].append(rel) + for engine in (ENGINE_PYTHON, ENGINE_RUST): + if left.get(engine) != right.get(engine): + moved[engine].append(rel) + + after_parity = [ + rel for rel, rec in b.get("documents", {}).items() + if isinstance(rec, dict) and rec.get(ENGINE_PYTHON) != rec.get(ENGINE_RUST) + ] + + for engine in (ENGINE_PYTHON, ENGINE_RUST): + for rel in moved[engine]: + print(f" MOVED[{engine}] {rel}") + for rel in moved["facts"]: + print(f" FACT-DIFF {rel}") + for rel in after_parity: + print(f" PARITY-DIFF[after] {rel}") + + failed = bool(moved[ENGINE_PYTHON] or moved[ENGINE_RUST] or after_parity) + print( + "RESULT: " + + ("MOVED" if failed else "UNCHANGED") + + f" — source={a.get('source')}, population={str(a.get('population_commit'))[:12]}, " + f"documents={len(names)}, facts_moved={len(moved['facts'])}, " + f"python_mos_moved={len(moved[ENGINE_PYTHON])}, " + f"rust_mos_moved={len(moved[ENGINE_RUST])}, " + f"after_parity_moved={len(after_parity)}" + ) + return 1 if failed else 0 + + +def verify(path: Path, against: str) -> int: + try: + record = _load(path) + problems = [ + *ev.provenance_problems(record, against=against), + *_snapshot_problems(record), + ] + except (OSError, ValueError, RuntimeError, ev.EvidenceRefused) as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + if problems: + for problem in problems: + print(f"FAIL[provenance]: {problem}") + return 1 + print( + f"OK: {path} is fresh evidence at {against}; source={record['source_commit'][:12]}, " + f"population={record['population_commit'][:12]}, " + f"inputs={len(record['analysis_manifest'])}, " + f"support={len(record['support_manifest'])}" + ) + return 0 + + +def selftest() -> int: + base = { + "id": "synthetic", + "layers": [ + {"layer": "lowered", "status": "produced", "document": {}}, + {"layer": "summaries", "status": "produced", "document": { + "functions": [{ + "name": "F", "params": [{"index": 0, "transfer": "may"}], + "returns": {"owned": False, "source": None}, + "degraded": False, "unresolved": [], + }] + }}, + {"layer": "verdicts", "status": "produced", "document": {}}, + ], + } + twin = json.loads(json.dumps(base)) + if summary_surface(base) != summary_surface(twin): + print("FAIL[selftest]: identical captures differ") + return 1 + twin["layers"][1]["document"]["functions"][0]["returns"]["owned"] = True + if summary_surface(base) == summary_surface(twin): + print("FAIL[selftest]: whole-document reader missed returns.owned movement") + return 1 + twin = json.loads(json.dumps(base)) + twin["layers"][1]["document"]["functions"][0]["unresolved"].append("Extern") + if summary_surface(base) == summary_surface(twin): + print("FAIL[selftest]: whole-document reader missed unresolved movement") + return 1 + print("OK: whole summaries document is the level-2 comparison surface") + return 0 + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--selftest", action="store_true") + sub = ap.add_subparsers(dest="cmd") + t = sub.add_parser("take") + t.add_argument("--source", required=True, choices=tuple(SOURCES)) + t.add_argument("--out", required=True, type=Path) + t.add_argument("--population-commit", default="HEAD", + help="the commit whose blobs are analysed (default HEAD; the after " + "side of a pair names the baseline's commit)") + t.add_argument("--timeout", type=float, default=DEFAULT_TIMEOUT_SECONDS) + c = sub.add_parser("compare") + c.add_argument("--before", required=True, type=Path) + c.add_argument("--after", required=True, type=Path) + c.add_argument("--against", default="HEAD", + help="the commit the after side must be fresh at (default HEAD)") + v = sub.add_parser("verify") + v.add_argument("snapshot", type=Path) + v.add_argument("--against", default="HEAD") + args = ap.parse_args(argv) + if args.selftest: + return selftest() + if args.cmd == "take": + return take(args.source, args.out, args.timeout, args.population_commit) + if args.cmd == "compare": + return compare(args.before, args.after, args.against) + if args.cmd == "verify": + return verify(args.snapshot, args.against) + ap.error("one command is required (or --selftest)") + return 2 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/scripts/p037_verdict_snapshot.py b/scripts/p037_verdict_snapshot.py new file mode 100755 index 00000000..fde75d25 --- /dev/null +++ b/scripts/p037_verdict_snapshot.py @@ -0,0 +1,342 @@ +#!/usr/bin/env python3 +"""Snapshot every verdict the C# corpus produces, and diff two snapshots. + +P-037 A1.1 changes the FACT SURFACE the Roslyn extractor emits before it +changes any semantics (#304, the A1.1-a1/a2 sequence). Each of those steps +carries the same obligation — *richer facts, same verdicts* — and an obligation +nobody can check is a wish. This is the checker. + +Method, deliberately the same as ``scripts/benchmark.py``: one ``own-check`` +run per FILE, never per directory. A directory run compiles the case's +``before.cs`` and ``after.cs`` into one compilation, where each can resolve the +other's symbols; the per-file runs are what the corpus was labelled against, so +a snapshot taken any other way would measure a different program. + +Captured at ``--severity warning``, the most inclusive threshold the launcher +offers (``--severity`` takes ``error|warning`` and nothing else; there is no +``note`` level on that flag, and asking for one is a usage error that exits 2 +having analysed nothing). Whatever the core reports at that threshold is +recorded WITH its level, advisories included if they ride along, so a +comparison can be read at verdict level (error/warning) or over everything. +That separation is load-bearing for A1 — an ``OWN051`` appearing where a +fabricated ``release`` used to sit is the LEGACY_HONESTY class arriving, not a +regression, and a snapshot that had collapsed the levels could not tell the two +apart. + +ENGINE is explicit and required (#262 Stage 3). A bare invocation resolves the +Rust candidate and exits 2 on a machine without one, and the A1.1 change is in +the EXTRACTOR — shared by both engines — so a snapshot that did not name its +engine would not say which half of the seam it had measured. + +A2.0 hardening (scripts/p037_evidence.py holds the contract): the files +measured are the FROZEN population materialized from a named commit, never the +working tree; the Rust engine is the qualified own-cli build and nothing else +(OWEN_RUST_CORE is set to exactly that executable, never inherited); +OWN_EXTRA_REF_DIRS is removed from the launcher's environment and the +extractor's stderr is read for the attestation that no extra reference was +loaded; the execution profile is recorded; the tree is checked clean before and +after; evidence is never written into a tracked location. + +Usage: + p037_verdict_snapshot.py take --engine rust --out /scratch/verdict-rust.json + p037_verdict_snapshot.py take --engine rust --population-commit --out ... + p037_verdict_snapshot.py compare --before base.json --after new.json [--against ] + p037_verdict_snapshot.py compare --before base.json --after new.json --level all + p037_verdict_snapshot.py verify snapshot.json [--against ] +""" + +from __future__ import annotations + +import argparse +import json +import shutil +import subprocess +import sys +from pathlib import Path +from typing import Any + +import p037_evidence as ev + +ROOT = Path(__file__).resolve().parent.parent +SCHEMA = "p037-verdict-snapshot/3" +VERDICT_LEVELS = ("error", "warning") + + +def run_one(path: Path, engine: str, env: dict[str, str]) -> dict[str, Any]: + """One file through the launcher; SARIF in, (exit, findings) out.""" + cmd = [str(ROOT / "scripts" / "own-check.sh"), "--engine", engine, + "--format", "sarif", "--severity", "warning", "--", str(path)] + proc = subprocess.run(cmd, cwd=ROOT, capture_output=True, text=True, check=False, env=env) + findings: list[dict[str, Any]] = [] + parse_error = "" + try: + doc = json.loads(proc.stdout) + for run in doc.get("runs", []): + for res in run.get("results", []): + loc = (res.get("locations") or [{}])[0] + region = loc.get("physicalLocation", {}).get("region", {}) + findings.append({ + "code": res.get("ruleId", "?"), + "level": res.get("level", "?"), + "line": region.get("startLine", 0), + }) + except json.JSONDecodeError as exc: + # Not silently swallowed: a file whose SARIF did not parse is recorded + # as such, so it can never be mistaken for a file with no findings. + parse_error = f"{type(exc).__name__}: {exc}" + findings.sort(key=lambda f: (f["line"], f["code"], f["level"])) + rec: dict[str, Any] = {"exit": proc.returncode, "findings": findings} + if parse_error: + rec["parse_error"] = parse_error + rec["stderr_tail"] = proc.stderr.strip()[-400:] + contamination = ev.reference_contamination(proc.stderr) + if contamination: + rec["reference_contamination"] = contamination + return rec + + +def _refuse(problems: list[str]) -> None: + if problems: + raise ev.EvidenceRefused("; ".join(problems)) + + +def take(engine: str, out: Path, dirs: tuple[str, ...], population_commit: str) -> int: + try: + _refuse(ev.scratch_problems(out)) + provenance = ev.evidence_fields(dirs, population_commit=population_commit) + if provenance["dirty"]: + raise ev.EvidenceRefused("the tree is dirty before the run; evidence starts clean") + profile = ev.execution_profile(include_rust=engine == "rust") + artifacts: dict[str, Any] = {} + if engine == "rust": + artifact = ev.build_rust_artifact("own-cli", "own-cli") + _refuse(ev.artifact_problems(artifact)) + artifacts["own-cli"] = artifact + lease = ev.acquire_population(ev.materialization_root( + provenance["population_commit"], provenance["analysis_manifest_sha256"])) + except ev.EvidenceRefused as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + take_dir = ev.new_take_dir() + try: + return _measure(engine, out, dirs, provenance, profile, artifacts, take_dir) + finally: + ev.release_population(lease) + shutil.rmtree(take_dir, ignore_errors=True) + + +def _measure( + engine: str, + out: Path, + dirs: tuple[str, ...], + provenance: dict[str, Any], + profile: dict[str, Any], + artifacts: dict[str, Any], + take_dir: Path, +) -> int: + overrides: dict[str, str] = {} + try: + for artifact in artifacts.values(): + # The launcher runs the SEALED copy only; target/release/ is shared + # and any later cargo build may rewrite it mid-run. + ev.seal_artifact(artifact, take_dir) + overrides["OWEN_RUST_CORE"] = str(artifact["executed"]["sealed_path"]) + root = ev.materialize_population(provenance) + _refuse(ev.external_ancestor_problems(root)) + files = ev.analysis_paths(provenance, root) + except ev.EvidenceRefused as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + env = ev.sanitized_env(**overrides) + reference_profile = ev.clean_reference_profile() + snap: dict[str, Any] = { + "schema": SCHEMA, + "engine": engine, + **provenance, + "materialization_root": root.relative_to(ROOT).as_posix(), + "execution_profile": profile, + "artifacts": artifacts, + "reference_profile": reference_profile, + "corpus": list(dirs), + "files": {}, + } + for i, f in enumerate(files, 1): + rel = f.relative_to(root).as_posix() + rec = run_one(f, engine, env) + snap["files"][rel] = rec + if "reference_contamination" in rec: + reference_profile["observed_extra_reference_lines"] = ( + int(reference_profile["observed_extra_reference_lines"]) + + len(rec["reference_contamination"]) + ) + n = len(rec["findings"]) + print(f" [{i:3}/{len(files)}] {rel} ({n} finding(s))", flush=True) + broken = [k for k, r in snap["files"].items() + if "parse_error" in r or "reference_contamination" in r] + ev.finalize_run(snap, provenance, root) + if broken: + # A snapshot with an unreadable run is not a snapshot with fewer findings. + # The first version of this tool asked for a `--severity note` that does + # not exist, every run exited 2 having analysed nothing, and the result + # was a confident, entirely empty baseline. Fail closed: a run that could + # not be read cannot be evidence, and the exit code has to say so. + snap["is_evidence"] = False + snap["unreadable"] = broken + out.write_text(json.dumps(snap, indent=1, sort_keys=True) + "\n", encoding="utf-8") + total = sum(len(r["findings"]) for r in snap["files"].values()) + print(f"\nsnapshot: {len(files)} file(s), {total} finding(s), engine={engine}, " + f"population={provenance['population_commit'][:12]}, " + f"at {snap['source_commit'][:7]}" + f"{'' if snap['is_evidence'] else ' (NOT evidence)'}") + print(f"wrote {out}") + if broken: + print(f"\nREFUSED as evidence: {len(broken)}/{len(files)} file(s) produced " + f"unparsable SARIF or loaded extra references. First few: {broken[:5]}", + file=sys.stderr) + for k in broken[:3]: + print(f" {k}: exit={snap['files'][k]['exit']} " + f"{snap['files'][k].get('stderr_tail', '')[:160]}", file=sys.stderr) + return 1 + return 0 if snap["is_evidence"] else 1 + + +def key_set(rec: dict[str, Any], level: str) -> set[tuple[int, str, str]]: + return {(f["line"], f["code"], f["level"]) for f in rec["findings"] + if level == "all" or f["level"] in VERDICT_LEVELS} + + +def _load(path: Path) -> dict[str, Any]: + data = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(data, dict) or data.get("schema") != SCHEMA: + raise RuntimeError(f"{path}: not a {SCHEMA} document (older schemas carry no " + "A2.0 provenance closure)") + return data + + +def _snapshot_problems(record: dict[str, Any]) -> list[str]: + """The files measured are exactly the frozen population, all readable.""" + manifest = record.get("analysis_manifest") + if not isinstance(manifest, list): + return ["snapshot carries no analysis_manifest list"] + expected = { + entry["path"] + for entry in manifest + if isinstance(entry, dict) and isinstance(entry.get("path"), str) + } + files = record.get("files") + if not isinstance(files, dict): + return ["snapshot carries no files object"] + problems: list[str] = [] + if set(files) != expected: + problems.append("snapshot file keys do not equal the frozen population manifest") + if record.get("unreadable"): + problems.append("snapshot contains unreadable runs") + if any(isinstance(r, dict) and "reference_contamination" in r for r in files.values()): + problems.append("a run loaded references from the environment") + if record.get("engine") == "rust" and "own-cli" not in (record.get("artifacts") or {}): + problems.append("a rust snapshot names no qualified own-cli artifact") + return problems + + +def verify(path: Path, against: str) -> int: + try: + snap = _load(path) + problems = [ + *ev.provenance_problems(snap, against=against), + *_snapshot_problems(snap), + ] + except (OSError, ValueError, RuntimeError, ev.EvidenceRefused) as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + if problems: + for problem in problems: + print(f"FAIL[provenance]: {problem}") + return 1 + print( + f"OK: {path} is fresh evidence at {against}; " + f"source={snap['source_commit'][:12]}, population={snap['population_commit'][:12]}, " + f"inputs={len(snap['analysis_manifest'])}, support={len(snap['support_manifest'])}" + ) + return 0 + + +def compare(before: Path, after: Path, level: str, against: str) -> int: + try: + a, b = _load(before), _load(after) + problems = [ + *ev.comparison_problems(a, b, against=against), + *(f"before: {p}" for p in _snapshot_problems(a)), + *(f"after: {p}" for p in _snapshot_problems(b)), + ] + except (OSError, ValueError, RuntimeError, ev.EvidenceRefused) as exc: + print(f"REFUSED: {exc}", file=sys.stderr) + return 2 + if a["engine"] != b["engine"]: + problems.append(f"engines differ ({a['engine']} vs {b['engine']}); a comparison " + "across engines measures the engine, not the change") + if problems: + for problem in problems: + print(f"REFUSED: {problem}", file=sys.stderr) + return 2 + print(f"comparing engine={a['engine']} at {a['source_commit'][:7]} -> " + f"{b['source_commit'][:7]}, population={a['population_commit'][:12]}, level={level}") + moved = 0 + for rel in sorted(set(a["files"]) | set(b["files"])): + ra, rb = a["files"].get(rel), b["files"].get(rel) + if ra is None or rb is None: + print(f" FILE {'ADDED' if ra is None else 'REMOVED'}: {rel}") + moved += 1 + continue + ka, kb = key_set(ra, level), key_set(rb, level) + exit_moved = ra["exit"] != rb["exit"] + if ka == kb and not exit_moved: + continue + moved += 1 + print(f" MOVED {rel}") + if exit_moved: + print(f" exit {ra['exit']} -> {rb['exit']}") + for f in sorted(ka - kb): + print(f" - {f[1]} {f[2]} @{f[0]}") + for f in sorted(kb - ka): + print(f" + {f[1]} {f[2]} @{f[0]}") + files = len(set(a["files"]) | set(b["files"])) + if moved == 0: + print(f"\nRESULT: UNCHANGED — {files} file(s), no verdict moved at level={level}") + return 0 + print(f"\nRESULT: {moved} of {files} file(s) MOVED at level={level} — " + f"every one needs a declared class, or it is a defect") + return 1 + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + sub = ap.add_subparsers(dest="cmd", required=True) + t = sub.add_parser("take", help="record a snapshot") + t.add_argument("--engine", required=True, choices=("rust", "python")) + t.add_argument("--out", required=True, type=Path) + t.add_argument("--corpus", action="append", default=None, metavar="DIR") + t.add_argument("--population-commit", default="HEAD", + help="the commit whose blobs are analysed (default HEAD; the after " + "side of a pair names the baseline's commit)") + c = sub.add_parser("compare", help="diff two snapshots") + c.add_argument("--before", required=True, type=Path) + c.add_argument("--after", required=True, type=Path) + c.add_argument("--level", default="verdict", choices=("verdict", "all"), + help="verdict = error/warning only (default); all = advisories too") + c.add_argument("--against", default="HEAD", + help="the commit the after side must be fresh at (default HEAD)") + v = sub.add_parser("verify", help="prove a snapshot is still fresh evidence at a commit") + v.add_argument("snapshot", type=Path) + v.add_argument("--against", default="HEAD") + args = ap.parse_args(argv) + if args.cmd == "take": + dirs = tuple(args.corpus) if args.corpus else ev.CORPUS_DIRS + return take(args.engine, args.out, dirs, args.population_commit) + if args.cmd == "verify": + return verify(args.snapshot, args.against) + return compare(args.before, args.after, args.level, args.against) + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/tests/test_p037_evidence.py b/tests/test_p037_evidence.py new file mode 100644 index 00000000..f9f82a74 --- /dev/null +++ b/tests/test_p037_evidence.py @@ -0,0 +1,622 @@ +#!/usr/bin/env python3 +"""Hostile controls for P-037's A2.0 evidence contract. + +Fourteen negative controls and one positive control over the shared gate in +scripts/p037_evidence.py. Each negative control breaks exactly one clause of +the contract and requires the gate to refuse; the positive control proves the +gate still ADMITS the experiment it exists for (old before, current after, an +intentional treatment change in between, everything else identical). + +The controls are not vacuous: every mutation is aimed at the predicate that +owns its clause, and where a clause is about history (ancestry, staleness, +population drift) a small synthetic git history is built in a temporary clone +so the real git-backed predicate runs over real commits. + +Two fitness pins ride along: the extractor's explicit-file filesystem read +sites must all be classified against the four semantic mechanisms the support +closure covers, and the repository population's support closure must be +exactly the three files it is today. +""" + +from __future__ import annotations + +import copy +import hashlib +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT / "scripts")) + +import p037_evidence as ev # noqa: E402 + +failures = 0 + +SHAPES = ("corpus/p037-shapes",) + +SYNTHETIC_PROFILE: dict[str, Any] = { + "python": {"implementation": "CPython", "version": "3.11.0 (synthetic)"}, + "platform": {"system": "Linux", "machine": "x86_64"}, + "dotnet": {"sdk": "8.0.0", "runtimes": ["Microsoft.NETCore.App 8.0.0"]}, + "rust": {"rustc": "rustc 1.0.0 (synthetic)", "cargo": "cargo 1.0.0", + "host": "x86_64-unknown-linux-gnu"}, +} + +EXPECTED_REPO_SUPPORT = { + "frontend/roslyn/samples/InjectedDcViewSample.xaml": "sibling-xaml", + "frontend/roslyn/samples/ViewOwnsVmSample.xaml": "sibling-xaml", + "frontend/roslyn/samples/weaved/FodyWeavers.xml": "ancestor-fody", +} +# Attached to SharedEnumerator.cs only through .csproj expansion +# (WeaverOwnedFiles), which explicit-file mode never performs. +NOT_REPO_SUPPORT = "frontend/roslyn/samples/weaved-linked/Proj/FodyWeavers.xml" + +EXTRACTOR = ROOT / "frontend/roslyn/OwnSharp.Extractor/Program.cs" +FS_API = re.compile( + r"\b(File\.(?:ReadAllText|ReadAllBytes|ReadAllLines|ReadLines|Exists|GetAttributes|" + r"OpenRead|OpenText)|Directory\.(?:EnumerateFiles|Exists|GetFiles|EnumerateDirectories)|" + r"XDocument\.Load|XmlReader\.Create)\(([^,)]*)" +) +DECL = re.compile(r"^static\s+[\w<>\[\]?,. ]+?\s+(\w+)\s*\(") + +# Every filesystem read site in the extractor, classified. The explicit-file +# entries are the four semantic mechanisms the evidence closure covers; a new +# site (or a moved one) fails by NAME until someone classifies it here, and a +# classification into explicit-file analysis obliges a support-closure update +# in scripts/p037_evidence.py. Counting File.ReadAllText per file would guard +# spelling; this guards the contract. +EXTRACTOR_FS_SITES: dict[tuple[str, str, str], tuple[str, int]] = { + ("ProjectCsFiles", "File.Exists", "full"): ("project-solution-mode", 1), + ("ProjectCsFiles", "XDocument.Load", "full"): ("project-solution-mode", 1), + ("ProjectCsFiles", "Directory.EnumerateFiles", "dir"): ("project-solution-mode", 1), + ("ProjectCsFiles", "File.Exists", "path"): ("project-solution-mode", 1), + ("SolutionProjects", "File.ReadAllLines", "sln"): ("project-solution-mode", 1), + ("SolutionProjects", "File.Exists", "path"): ("project-solution-mode", 1), + ("ProjectBinDirs", "File.Exists", "full"): ("project-solution-mode", 1), + ("ProjectBinDirs", "Directory.Exists", "bin"): ("project-solution-mode", 1), + ("Expand", "Directory.Exists", "p"): ("directory-input-mode", 1), + ("Expand", "Directory.EnumerateFiles", "p"): ("directory-input-mode", 1), + ("AncestorsHaveWeaverConfig", "File.GetAttributes", "candidate"): + ("explicit-file:ancestor-fody", 1), + ("", "File.Exists", "path"): ("explicit-file:explicit-input-existence", 1), + ("", "File.ReadAllText", "path"): ("explicit-file:explicit-cs-contents", 1), + ("", "File.Exists", "xamlPath"): ("explicit-file:sibling-xaml", 1), + ("", "File.ReadAllText", "xamlPath"): ("explicit-file:sibling-xaml", 1), + ("", "Directory.Exists", "dir"): ("reference-environment", 2), + ("", "Directory.EnumerateFiles", "dir"): ("reference-environment", 2), +} + + +def ok(name: str) -> None: + print(f"ok[{name}]") + + +def fail(name: str, detail: str) -> None: + global failures + failures += 1 + print(f"FAIL[{name}]: {detail}") + + +def check(name: str, condition: bool, detail: str) -> None: + if condition: + ok(name) + else: + fail(name, detail) + + +def expect_problem(name: str, problems: list[str], needle: str) -> None: + if any(needle in p for p in problems): + ok(name) + else: + fail(name, f"expected a refusal containing {needle!r}, got {problems!r}") + + +def complete(record: dict[str, Any]) -> dict[str, Any]: + """A provenance record plus the run-time fields a take() writes.""" + full = copy.deepcopy(record) + full["execution_profile"] = copy.deepcopy(SYNTHETIC_PROFILE) + full["reference_profile"] = ev.clean_reference_profile() + full["artifacts"] = {} + full["post_run_population_intact"] = True + return full + + +# -------------------------------------------------------------------------- +# synthetic history in a temporary clone (real git, never the checkout's .git) +# -------------------------------------------------------------------------- + +class History: + def __init__(self) -> None: + self.tmp = Path(tempfile.mkdtemp(prefix="p037-hostile-")) + self.repo = self.tmp / "repo" + self.env = dict(os.environ) + self.env.update({ + "GIT_AUTHOR_NAME": "p037-control", "GIT_AUTHOR_EMAIL": "p037@example.invalid", + "GIT_COMMITTER_NAME": "p037-control", "GIT_COMMITTER_EMAIL": "p037@example.invalid", + "GIT_AUTHOR_DATE": "2000-01-01T00:00:00Z", "GIT_COMMITTER_DATE": "2000-01-01T00:00:00Z", + }) + subprocess.run( + ["git", "clone", "--quiet", "--depth=1", f"file://{ROOT.resolve()}", str(self.repo)], + check=True, capture_output=True, env=self.env, + ) + self.head_tree = self.git("rev-parse", "HEAD^{tree}") + self.index_count = 0 + + def git(self, *args: str, stdin: bytes | None = None) -> str: + proc = subprocess.run(["git", "-C", str(self.repo), *args], capture_output=True, + check=False, env=self.env, input=stdin) + if proc.returncode != 0: + raise RuntimeError(f"git {' '.join(args)}: {proc.stderr.decode('utf-8', 'replace')}") + return proc.stdout.decode("utf-8").strip() + + def show(self, path: str) -> bytes: + proc = subprocess.run(["git", "-C", str(self.repo), "cat-file", "blob", f"HEAD:{path}"], + capture_output=True, check=True, env=self.env) + return proc.stdout + + def tree_with(self, path: str, content: bytes) -> str: + """HEAD's tree with one path replaced, built through a private index.""" + blob = self.git("hash-object", "-w", "--stdin", stdin=content) + self.index_count += 1 + index = self.tmp / f"index-{self.index_count}" + env = {**self.env, "GIT_INDEX_FILE": str(index)} + for argv in ( + ["read-tree", self.head_tree], + ["update-index", "--add", "--cacheinfo", f"100644,{blob},{path}"], + ): + subprocess.run(["git", "-C", str(self.repo), *argv], check=True, + capture_output=True, env=env) + proc = subprocess.run(["git", "-C", str(self.repo), "write-tree"], check=True, + capture_output=True, env=env) + return proc.stdout.decode("ascii").strip() + + def commit(self, tree: str, parents: list[str], message: str) -> str: + args = ["commit-tree", tree, "-m", message] + for parent in parents: + args += ["-p", parent] + return self.git(*args) + + def cleanup(self) -> None: + shutil.rmtree(self.tmp, ignore_errors=True) + + +# -------------------------------------------------------------------------- +# fitness pins +# -------------------------------------------------------------------------- + +def _extractor_fs_sites() -> dict[tuple[str, str, str], int]: + sites: dict[tuple[str, str, str], int] = {} + enclosing: str | None = None + for line in EXTRACTOR.read_text(encoding="utf-8").splitlines(): + m = DECL.match(line) + if m: + enclosing = m.group(1) + code = line.split("//", 1)[0] + if not code.strip(): + if line.startswith("}"): + enclosing = None + continue + for api, arg in FS_API.findall(code): + key = (enclosing or "", api, arg.strip()) + sites[key] = sites.get(key, 0) + 1 + if line.startswith("}"): + enclosing = None + return sites + + +def fitness_pins() -> None: + source = EXTRACTOR.read_text(encoding="utf-8") + for dep in ev.EXPLICIT_FILE_SEMANTIC_FS_DEPENDENCIES: + hits = len(re.findall(dep["anchor"], source)) + check(f"mechanism-anchored:{dep['mechanism']}", hits == 1, + f"anchor matched {hits} time(s) in Program.cs; the mechanism moved or was removed") + classified = {c for c, _ in EXTRACTOR_FS_SITES.values()} + for dep in ev.EXPLICIT_FILE_SEMANTIC_FS_DEPENDENCIES: + check(f"mechanism-has-classified-site:{dep['mechanism']}", + f"explicit-file:{dep['mechanism']}" in classified, + "no read site is classified under this mechanism") + sites = _extractor_fs_sites() + unclassified = sorted(k for k in sites if k not in EXTRACTOR_FS_SITES) + check("extractor-fs-sites-all-classified", not unclassified, + "unclassified filesystem read site(s) in Program.cs: " + f"{unclassified}; classify each in tests/test_p037_evidence.py and, if it " + "belongs to explicit-file analysis, extend the support closure") + moved = sorted( + f"{k}: expected {n}, found {sites.get(k, 0)}" + for k, (_, n) in EXTRACTOR_FS_SITES.items() if sites.get(k, 0) != n + ) + check("extractor-fs-sites-counts-pinned", not moved, + f"read-site multiplicity moved: {moved}") + + fields = ev.population_fields("HEAD", ev.REPO_TREE_DIRS) + support = {e["path"]: e["mechanism"] for e in fields["support_manifest"]} + check("repo-support-closure-is-exactly-three", support == EXPECTED_REPO_SUPPORT, + f"support closure {support!r} != {EXPECTED_REPO_SUPPORT!r}") + check("linked-project-fody-is-not-explicit-file-support", NOT_REPO_SUPPORT not in support, + f"{NOT_REPO_SUPPORT} is a project-mode dependency, not an explicit-file one") + print(f" repo population at HEAD: {len(fields['analysis_manifest'])} primary .cs, " + f"{len(support)} support file(s)") + + +# -------------------------------------------------------------------------- +# controls +# -------------------------------------------------------------------------- + +def record_level_controls() -> None: + base = complete(ev.evidence_fields(SHAPES)) + live = ev.provenance_problems(base) + if live: + fail("fresh-record-valid", "; ".join(live)) + return + ok("fresh-record-valid") + allowed = ev.comparison_problems(base, copy.deepcopy(base)) + check("same-commit-pair-allowed", not allowed, "; ".join(allowed)) + + def pair() -> tuple[dict[str, Any], dict[str, Any]]: + return copy.deepcopy(base), copy.deepcopy(base) + + before, after = pair() + before["is_evidence"] = False + expect_problem("control-01-before-not-evidence", ev.comparison_problems(before, after), + "before: record does not mark itself is_evidence=true") + before, after = pair() + before["dirty"] = True + expect_problem("control-02-before-dirty", ev.comparison_problems(before, after), + "before: evidence was taken on a dirty tree") + before, after = pair() + after["is_evidence"] = False + expect_problem("control-03-after-not-evidence", ev.comparison_problems(before, after), + "after: record does not mark itself is_evidence=true") + before, after = pair() + after["dirty"] = True + expect_problem("control-04-after-dirty", ev.comparison_problems(before, after), + "after: evidence was taken on a dirty tree") + before, after = pair() + after["post_run_dirty"] = True + expect_problem("control-04b-after-post-run-dirty", ev.comparison_problems(before, after), + "dirty after the measurement") + before, after = pair() + after["post_run_population_intact"] = False + expect_problem("control-09c-population-tampered-during-run", + ev.comparison_problems(before, after), + "population stayed intact through the run") + + before, after = pair() + before["analysis_manifest"][0]["blob"] = "0" * 40 + expect_problem("control-06-before-manifest-tampered", ev.comparison_problems(before, after), + "before: recorded analysis_manifest does not match") + before, after = pair() + after["analysis_manifest"][0]["blob"] = "0" * 40 + expect_problem("control-07-after-manifest-tampered", ev.comparison_problems(before, after), + "after: recorded analysis_manifest does not match") + before, after = pair() + after["analysis_manifest_sha256"] = "0" * 64 + expect_problem("control-07b-after-digest-tampered", ev.comparison_problems(before, after), + "analysis_manifest_sha256") + + before, after = pair() + after["execution_profile"]["python"]["version"] = "3.13.0 (another interpreter)" + expect_problem("control-11-execution-profile-mismatch", + ev.comparison_problems(before, after), + "execution profiles differ") + before, after = pair() + after["execution_profile"] = {} + expect_problem("control-11b-execution-profile-missing", + ev.comparison_problems(before, after), + "carries no execution_profile") + + # 12: semantic support drift, on the population that HAS a support closure. + repo_base = complete(ev.evidence_fields(ev.REPO_TREE_DIRS)) + before, after = copy.deepcopy(repo_base), copy.deepcopy(repo_base) + after["support_manifest"][0]["blob"] = "0" * 40 + expect_problem("control-12-support-manifest-drift", + ev.comparison_problems(before, after), + "after: recorded support_manifest does not match") + before, after = copy.deepcopy(repo_base), copy.deepcopy(repo_base) + after["support_manifest"] = after["support_manifest"][1:] + expect_problem("control-12b-support-file-dropped", + ev.comparison_problems(before, after), + "support_manifest") + + # 13: ambient reference profile, three layers. + saved = os.environ.get(ev.EXTRA_REF_ENV) + os.environ[ev.EXTRA_REF_ENV] = "/nonexistent/ref-pack" + try: + child = ev.sanitized_env(OWEN_RUST_CORE="/qualified/own-cli") + finally: + if saved is None: + os.environ.pop(ev.EXTRA_REF_ENV, None) + else: + os.environ[ev.EXTRA_REF_ENV] = saved + check("control-13a-extra-ref-dirs-removed-from-child-env", + ev.EXTRA_REF_ENV not in child and child.get("OWEN_RUST_CORE") == "/qualified/own-cli", + f"child env still carries {ev.EXTRA_REF_ENV} or lost the override") + seen = ev.reference_contamination( + "extractor: analysing 3 file(s)\nextractor: +12 extra references from /x/ref\n" + ) + check("control-13b-extractor-attestation-read", + seen == ["extractor: +12 extra references from /x/ref"], + f"contamination lines {seen!r}") + check("control-13b-clean-stderr-is-clean", + ev.reference_contamination("extractor: analysing 3 file(s)\n") == [], + "a clean stderr was reported as contaminated") + before, after = pair() + after["reference_profile"]["observed_extra_reference_lines"] = 1 + expect_problem("control-13c-observed-extra-references-refused", + ev.comparison_problems(before, after), + "loading extra references") + before, after = pair() + after["reference_profile"][ev.EXTRA_REF_ENV] = "inherited" + expect_problem("control-13d-inherited-env-refused", + ev.comparison_problems(before, after), + "was not removed from the child environment") + + # 10: the file about to run must be the qualified build the record names. + with tempfile.TemporaryDirectory(prefix="p037-artifact-") as td: + exe = Path(td) / "own-cli" + exe.write_bytes(b"qualified build bytes\n") + artifact: dict[str, Any] = { + "package": "own-cli", "binary": "own-cli", "executable": str(exe), + "sha256": hashlib.sha256(exe.read_bytes()).hexdigest(), "bytes": exe.stat().st_size, + "source_commit": base["source_commit"], "dirty": False, + "rustc": "rustc", "cargo": "cargo", "host": "x86_64", "cargo_lock_blob": "0" * 40, + } + check("control-10-qualified-artifact-accepted", not ev.artifact_problems(artifact), + "; ".join(ev.artifact_problems(artifact))) + attested = {**artifact, "executed": {"sealed_path": str(exe), "sha256": artifact["sha256"], + "bytes": artifact["bytes"], "post_run_intact": True}} + before, after = pair() + after["artifacts"] = {"own-cli": copy.deepcopy(attested)} + check("control-10-attested-artifact-record-accepted", + not ev.comparison_problems(before, after), + "; ".join(ev.comparison_problems(before, after))) + exe.write_bytes(b"some other binary that happened to be lying around\n") + expect_problem("control-10-artifact-digest-mismatch-refused", + ev.artifact_problems(artifact), "does not match the qualified build") + before, after = pair() + after["artifacts"] = {"own-cli": {**attested, "source_commit": "0" * 40}} + expect_problem("control-10b-artifact-from-other-commit-refused", + ev.comparison_problems(before, after), + "was not built from the record's source commit") + before, after = pair() + after["artifacts"] = {"own-cli": {**attested, "dirty": True}} + expect_problem("control-10c-artifact-from-dirty-tree-refused", + ev.comparison_problems(before, after), "built on a dirty tree") + before, after = pair() + after["artifacts"] = {"own-cli": {**attested, "executed": {**attested["executed"], + "sha256": "f" * 64}}} + expect_problem("control-10d-executed-other-than-qualified-refused", + ev.comparison_problems(before, after), + "executed a file other than the qualified build") + before, after = pair() + after["artifacts"] = {"own-cli": {**attested, "executed": {**attested["executed"], + "post_run_intact": False}}} + expect_problem("control-10d-not-intact-through-run-refused", + ev.comparison_problems(before, after), + "does not attest it stayed intact through the run") + before, after = pair() + after["artifacts"] = {"own-cli": {k: v for k, v in attested.items() if k != "executed"}} + expect_problem("control-10d-unsealed-artifact-refused", + ev.comparison_problems(before, after), "no executed attestation") + + # 10d, through the real lifecycle: seal, mutate, finalize_run flips is_evidence. + with tempfile.TemporaryDirectory(prefix="p037-seal-") as td: + built = Path(td) / "target" / "own-cli" + built.parent.mkdir() + built.write_bytes(b"qualified build bytes\n") + artifact = { + "package": "own-cli", "binary": "own-cli", "executable": str(built), + "sha256": hashlib.sha256(built.read_bytes()).hexdigest(), + "bytes": built.stat().st_size, "source_commit": base["source_commit"], + "dirty": False, "rustc": "rustc", "cargo": "cargo", "host": "x86_64", + "cargo_lock_blob": "0" * 40, + } + take_dir = Path(td) / "take" + ev.seal_artifact(artifact, take_dir) + sealed = Path(artifact["executed"]["sealed_path"]) + check("control-10d-sealed-copy-is-private-and-identical", + sealed.parent == take_dir and sealed != built + and sealed.read_bytes() == b"qualified build bytes\n" + and not ev.executed_artifact_problems(artifact), + "the sealed copy is not a private, verified copy of the qualified build") + # a rebuild of the shared target/ path after sealing must not reach the run + built.write_bytes(b"a later cargo build of somebody else\n") + check("control-10d-rebuild-after-sealing-does-not-reach-the-run", + not ev.executed_artifact_problems(artifact), + "; ".join(ev.executed_artifact_problems(artifact))) + # the sealed copy itself rewritten under the run: the record cannot be evidence + sealed.chmod(0o600) + with sealed.open("ab") as handle: + handle.write(b"tampered under the run\n") + expect_problem("control-10d-post-run-artifact-integrity-fails", + ev.executed_artifact_problems(artifact), + "no longer matches the qualified build") + snapshot: dict[str, Any] = {**copy.deepcopy(base), "artifacts": {"own-cli": artifact}} + pop_root = ev.materialize_population(snapshot) + try: + ev.finalize_run(snapshot, snapshot, pop_root) + finally: + shutil.rmtree(pop_root, ignore_errors=True) + check("control-10d-finalize-run-drops-evidence", + snapshot["is_evidence"] is False + and snapshot["artifacts"]["own-cli"]["executed"]["post_run_intact"] is False + and "own-cli" in snapshot.get("artifact_tampered", {}), + f"finalize_run kept is_evidence={snapshot.get('is_evidence')}") + expect_problem("control-10d-tampered-run-refused-as-evidence", + ev.record_problems(snapshot), + "does not attest it stayed intact through the run") + + # 14: an external weaver config above the population, present or unprovable. + with tempfile.TemporaryDirectory(prefix="p037-ancestors-") as td: + pop = Path(td) / "a" / "b" / "population" + pop.mkdir(parents=True) + (pop / "FodyWeavers.xml").write_text("") # INSIDE: allowed + clean = [p for p in ev.external_ancestor_problems(pop) if td in p] + check("control-14-clean-ancestors-pass", not clean, "; ".join(clean)) + (Path(td) / "a" / "FodyWeavers.xml").write_text("") + expect_problem("control-14-external-ancestor-fody-refused", + ev.external_ancestor_problems(pop), "external FodyWeavers.xml") + (Path(td) / "a" / "FodyWeavers.xml").unlink() + real_probe = ev._fody_probe + blocked = (Path(td) / "a" / "FodyWeavers.xml").resolve() + + def blocked_probe(candidate: Path) -> str: + return "uninspectable" if candidate.resolve() == blocked else real_probe(candidate) + + ev._fody_probe = blocked_probe + try: + expect_problem("control-14-uninspectable-ancestor-refused", + ev.external_ancestor_problems(pop), + "cannot prove FodyWeavers.xml absent") + finally: + ev._fody_probe = real_probe + + # output location: evidence never lands in a tracked place. + expect_problem("evidence-output-in-tracked-tree-refused", + ev.scratch_problems(ROOT / "docs" / "evidence" / "p037-a2-probe.json"), + "not git-ignored") + check("evidence-output-outside-tree-allowed", + not ev.scratch_problems(Path(tempfile.gettempdir()) / "p037-a2-probe.json"), + "a path outside the checkout was refused") + + +def history_controls() -> None: + hist = History() + try: + treatment = "frontend/roslyn/OwnSharp.Extractor/Program.cs" + instrument = "scripts/p037_evidence.py" + first_shape = ev.analysis_manifest("HEAD", SHAPES, repo=hist.repo)[0]["path"] + + a = hist.commit(hist.tree_with(treatment, hist.show(treatment) + b"\n// old treatment\n"), + [], "A: old treatment (root)") + c = hist.commit(hist.head_tree, [a], "C: new treatment") + x = hist.commit(hist.head_tree, [], "X: unrelated root") + d = hist.commit(hist.tree_with(instrument, hist.show(instrument) + b"\n# drift\n"), + [c], "D: instrument moved") + e = hist.commit(hist.tree_with(treatment, hist.show(treatment) + b"\n// newer\n"), + [c], "E: treatment moved again") + p = hist.commit(hist.tree_with(first_shape, hist.show(first_shape) + b"\n// drift\n"), + [], "P: population drift (root)") + m = hist.commit(hist.head_tree, [a, p], "M: merges the drifted population") + + check("synthetic-history-non-vacuous", + ev.paths_differ(a, c, ev.TREATMENT_PATHS, repo=hist.repo) + and not ev.paths_differ(a, c, ev.INSTRUMENT_PATHS, repo=hist.repo) + and ev.paths_differ(c, d, ev.INSTRUMENT_PATHS, repo=hist.repo) + and ev.paths_differ(c, e, ev.TREATMENT_PATHS, repo=hist.repo), + "the synthetic commits do not move what they are meant to move") + + before = complete(ev.evidence_fields(SHAPES, population_commit=a, source_commit=a, + repo=hist.repo)) + after = complete(ev.evidence_fields(SHAPES, population_commit=a, source_commit=c, + repo=hist.repo)) + positive = ev.comparison_problems(before, after, against=c, repo=hist.repo) + check("positive-control-allowed-treatment-change-admitted", not positive, + "; ".join(positive)) + + before_x = complete(ev.evidence_fields(SHAPES, population_commit=x, source_commit=x, + repo=hist.repo)) + expect_problem("control-05-before-not-ancestor-of-after", + ev.comparison_problems(before_x, after, against=c, repo=hist.repo), + "is not an ancestor of after source") + + expect_problem("control-08-after-stale-instrument-moved-since", + ev.comparison_problems(before, after, against=d, repo=hist.repo), + "the measurement instrument changed between") + expect_problem("control-08-after-stale-treatment-moved-since", + ev.comparison_problems(before, after, against=e, repo=hist.repo), + "the treatment changed between") + expect_problem("control-08-verify-alone-refuses-stale", + ev.provenance_problems(after, against=d, repo=hist.repo), + "the measurement instrument changed between") + + after_m = complete(ev.evidence_fields(SHAPES, population_commit=p, source_commit=m, + repo=hist.repo)) + drift = ev.comparison_problems(before, after_m, against=m, repo=hist.repo) + expect_problem("control-09-frozen-population-drift", drift, + "name different frozen populations") + expect_problem("control-09-primary-manifests-differ", drift, + "primary population manifests differ") + check("control-09-drift-is-the-only-refusal", + all("population" in p_ for p_ in drift), + f"unexpected extra refusals: {drift!r}") + + # instrument drift BETWEEN before and after, ancestry intact + after_d = complete(ev.evidence_fields(SHAPES, population_commit=a, source_commit=d, + repo=hist.repo)) + expect_problem("control-08b-instrument-differs-across-pair", + ev.comparison_problems(before, after_d, against=d, repo=hist.repo), + "instrument differs between before and after") + + # materialization of a frozen population, verified byte for byte + root = ev.materialize_population(before, repo=hist.repo) + try: + paths = ev.analysis_paths(before, root) + check("frozen-population-materialized", + root.is_dir() and all(p_.is_file() for p_ in paths) + and root.parent.parent.name == ev.POPULATION_DIR, + "materialization did not produce the population's files") + drifted = hist.show(first_shape) + b"\n// drift\n" + check("frozen-population-is-the-named-commit-not-the-tree", + paths[0].read_bytes() != drifted + and paths[0].read_bytes() == hist.show(first_shape), + "materialized bytes are not the population commit's blob") + check("materialization-is-ignored-by-git", + not ev.tree_is_dirty(repo=hist.repo), + "materializing the population dirtied the tree") + check("population-intact-after-materialization", + not ev.population_intact(before, root, repo=hist.repo), + "; ".join(ev.population_intact(before, root, repo=hist.repo))) + with paths[0].open("ab") as handle: + handle.write(b"// a concurrent writer\n") + expect_problem("control-09c-population-rewritten-under-the-run", + ev.population_intact(before, root, repo=hist.repo), + "do not re-hash to their blobs") + paths[1].unlink() + expect_problem("control-09c-population-file-vanished-under-the-run", + ev.population_intact(before, root, repo=hist.repo), + "are missing") + lease = ev.acquire_population(root) + try: + try: + ev.acquire_population(root) + fail("population-lease-is-exclusive", "a second lease was granted") + except ev.EvidenceRefused as exc: + expect_problem("population-lease-is-exclusive", [str(exc)], + "another take holds this population") + finally: + ev.release_population(lease) + finally: + shutil.rmtree(root, ignore_errors=True) + finally: + hist.cleanup() + + +def main() -> int: + problems = ev.closure_problems() + check("runtime-closure-covered", not problems, "; ".join(problems)) + if problems: + return 1 + fitness_pins() + record_level_controls() + history_controls() + if failures: + print(f"RESULT: {failures} P-037 evidence control(s) failed") + return 1 + print("RESULT: all P-037 evidence controls passed (14 negative, 1 positive, fitness pins)") + return 0 + + +def run() -> int: + """Entry point required by tests/run_tests.py's test_*.py census.""" + return main() + + +if __name__ == "__main__": + raise SystemExit(run()) diff --git a/tests/test_stage3_surfaces.py b/tests/test_stage3_surfaces.py index b92dd6e1..7f34432e 100644 --- a/tests/test_stage3_surfaces.py +++ b/tests/test_stage3_surfaces.py @@ -142,6 +142,18 @@ def _code_only(text: str) -> list[str]: # That choice has to be stated at the call site, in these words. DECLARES_DEFAULT = re.compile(r"no --engine here on purpose") +# P-037's evidence contract names the launcher as DATA (a path inside its +# measurement closure) and never runs it. That literal is exempted from this +# census on three conditions, all local: the file is the one evidence module, +# the statement is a bare assignment of exactly that literal, and the exact +# marker sits on that line or the one beside it. A subprocess call cannot take +# the shape, so the marker cannot hide an invocation, and the census requires +# the exemption to match exactly once so it cannot spread. +PROVENANCE_LITERAL_FILE = "scripts/p037_evidence.py" +PROVENANCE_LITERAL_MARKER = "p037-stage3: launcher-literal-is-provenance-data" +PROVENANCE_LITERAL_SHAPE = re.compile( + r'^\s*[A-Z][A-Z0-9_]*\s*=\s*"scripts/own-check\.sh"\s*(#.*)?$') + # A job that installs the tool rather than building it is served by whichever # job in the same workflow packed it. INSTALLS_PACKAGE = re.compile(r"dotnet tool install.*Owen\.Cli", re.I) @@ -249,9 +261,49 @@ def _action_build_is_reproducible() -> int: return failures +def _provenance_literal_exempt(name: str, raw_lines: list[str], i: int) -> bool: + """The one launcher literal this census reads as data, not as a call.""" + if name != PROVENANCE_LITERAL_FILE or i >= len(raw_lines): + return False + if not PROVENANCE_LITERAL_SHAPE.match(raw_lines[i]): + return False + window = raw_lines[max(0, i - 1):i + 2] + return any(PROVENANCE_LITERAL_MARKER in ln for ln in window) + + +def _provenance_marker_selftest() -> int: + """The exemption admits exactly the provenance shape and nothing else.""" + marked = f'OWN_CHECK_PATH = "scripts/own-check.sh" # {PROVENANCE_LITERAL_MARKER}' + cases: list[tuple[str, str, list[str], int, bool]] = [ + ("assignment+marker in the evidence module", PROVENANCE_LITERAL_FILE, [marked], 0, True), + ("marker on the line before", PROVENANCE_LITERAL_FILE, + [f"# {PROVENANCE_LITERAL_MARKER}", 'OWN_CHECK_PATH = "scripts/own-check.sh"'], 1, True), + ("same shape in any other script", "scripts/benchmark.py", [marked], 0, False), + ("assignment without the marker", PROVENANCE_LITERAL_FILE, + ['OWN_CHECK_PATH = "scripts/own-check.sh"'], 0, False), + ("a real launch wearing the marker", PROVENANCE_LITERAL_FILE, + [f'subprocess.run(["bash", "scripts/own-check.sh"]) # {PROVENANCE_LITERAL_MARKER}'], + 0, False), + ("a path built for launching, marker adjacent", PROVENANCE_LITERAL_FILE, + [f"# {PROVENANCE_LITERAL_MARKER}", + 'cmd = [str(ROOT / "scripts/own-check.sh"), "--engine", "rust"]'], 1, False), + ("marker too far away", PROVENANCE_LITERAL_FILE, + [f"# {PROVENANCE_LITERAL_MARKER}", "", 'OWN_CHECK_PATH = "scripts/own-check.sh"'], + 2, False), + ] + failures = 0 + for label, name, lines, i, want in cases: + got = _provenance_literal_exempt(name, lines, i) + if got != want: + failures += _fail( + f"provenance-literal exemption: {label}: expected {want}, got {got}", + check="provenance-literal-exemption-is-narrow") + return failures + + def run() -> int: - failures = _action_build_is_reproducible() - bare = explicit = ignored_ok = 0 + failures = _action_build_is_reproducible() + _provenance_marker_selftest() + bare = explicit = ignored_ok = provenance_exempt = 0 checked_files = 0 # The workflows, and then the SCRIPTS the workflows call. Two of the three @@ -274,6 +326,7 @@ def run() -> int: if False: continue text = open(path, encoding="utf-8").read() + raw_lines = text.splitlines() checked_files += 1 jobs = _jobs(text) workflow_packs = bool(re.search(r"OwenRustCoreDir", text)) @@ -293,6 +346,9 @@ def run() -> int: matcher = SCRIPT_INVOCATION if is_script else INVOCATION if not matcher.search(line): continue + if is_script and _provenance_literal_exempt(name, raw_lines, i): + provenance_exempt += 1 + continue if is_script: stmt = "\n".join( ln for ln in scan_lines[max(0, i - 2):i + 30] if ln.strip()) @@ -395,6 +451,13 @@ def run() -> int: else: ignored_ok += 1 + if provenance_exempt != 1: + failures += _fail( + f"the provenance-literal exemption matched {provenance_exempt} site(s); exactly one " + f"is allowed (the OWN_CHECK_PATH assignment in {PROVENANCE_LITERAL_FILE}). It is a " + f"local declaration for one datum, not an ignore list", + check="provenance-literal-exemption-is-singular") + if not bare and not explicit: return _fail( "no launcher invocation was found in any workflow — the matcher stopped matching, "