diff --git a/docs/notes/precision-remeasure-2026-07-12-data/AvalonEdit.json b/docs/notes/precision-remeasure-2026-07-12-data/AvalonEdit.json new file mode 100644 index 00000000..87c5ed1d --- /dev/null +++ b/docs/notes/precision-remeasure-2026-07-12-data/AvalonEdit.json @@ -0,0 +1,97 @@ +{ + "target": "AvalonEdit", + "target_commit": "ed0bd149059469ac9bd39b13cf8a341b12a6c1da", + "ownnet_commit": "4c5a86b176b04c42f7c1cc9e51aef545a3586cc9", + "ownnet_baseline_commit": "c029e8da59a60298eece7b1fbb5708a9886f55ee", + "command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning -- ", + "extractor_mode": "--flow-locals (own-check.sh default)", + "reference_resolution": "microsoft.windowsdesktop.app.ref 8.0.28/ref/net8.0 (47 dlls) via OWN_EXTRA_REF_DIRS, materialized identically to ci.yml corpus-benchmark job", + "baseline_source": "self-regenerated: OwnSharp.Extractor built at Own.NET commit c029e8da59a60298eece7b1fbb5708a9886f55ee (main, right after PR #226 merged the original oracle-sweep-2026-07-10.md sweep, before any of #218-#225's fixes), run with the identical command/flags against the same pinned target commit -- not copied from prose notes, to guarantee apples-to-apples inputs across the full #218-#240 batch", + "counts": { + "baseline_total": 29, + "current_total": 22, + "baseline_by_rule": { + "OWN001": 23, + "OWN014": 1, + "OWN050": 5 + }, + "current_by_rule": { + "OWN001": 17, + "OWN050": 5 + } + }, + "added": [], + "removed": [ + { + "rule": "OWN001", + "level": "warning", + "path": "ICSharpCode.AvalonEdit/CodeCompletion/OverloadViewer.cs", + "line": 58, + "message": "event 'upButton.Click' is subscribed (handler '(sender, e) => {\n\t\t\t\te.Handled = true;\n\t\t\t\tChangeIndex(-1);\n\t\t\t}') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'OverloadViewer' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#222", + "explained_by_pr": "#231", + "shape": "template-part local (FindName pattern-var)" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ICSharpCode.AvalonEdit/CodeCompletion/OverloadViewer.cs", + "line": 64, + "message": "event 'downButton.Click' is subscribed (handler '(sender, e) => {\n\t\t\t\te.Handled = true;\n\t\t\t\tChangeIndex(+1);\n\t\t\t}') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'OverloadViewer' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#222", + "explained_by_pr": "#231", + "shape": "template-part local (FindName pattern-var)" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ICSharpCode.AvalonEdit/Editing/AbstractMargin.cs", + "line": 99, + "message": "event 'newTextView.DocumentChanged' is subscribed (handler 'TextViewDocumentChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'AbstractMargin' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ICSharpCode.AvalonEdit/Editing/LineNumberMargin.cs", + "line": 114, + "message": "event 'newTextView.VisualLinesChanged' is subscribed (handler 'TextViewVisualLinesChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'LineNumberMargin' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ICSharpCode.AvalonEdit/Folding/FoldingMargin.cs", + "line": 218, + "message": "event 'newTextView.VisualLinesChanged' is subscribed (handler 'TextViewVisualLinesChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'FoldingMargin' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ICSharpCode.AvalonEdit/Search/DropDownButton.cs", + "line": 78, + "message": "event 'DropDownContent.Closed' is subscribed (handler 'DropDownContent_Closed') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'DropDownButton' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#224", + "explained_by_pr": "#231", + "shape": "self-detaching handler" + }, + { + "rule": "OWN014", + "level": "warning", + "path": "ICSharpCode.AvalonEdit/Editing/ImeSupport.cs", + "line": 47, + "message": "event 'CommandManager.RequerySuggested' is subscribed (handler 'requerySuggestedHandler') to a static (process-lived) event source that outlives 'ImeSupport'; the strong subscription promotes 'ImeSupport' to the source's lifetime, so it can never be collected \u2014 a region escape (leak, no release path) [resource: subscription token]", + "explained_by_issue": "#223", + "explained_by_pr": "#231", + "shape": "CommandManager.RequerySuggested weak-event allowlist" + } + ], + "changed": [] +} \ No newline at end of file diff --git a/docs/notes/precision-remeasure-2026-07-12-data/ClosedXML.json b/docs/notes/precision-remeasure-2026-07-12-data/ClosedXML.json new file mode 100644 index 00000000..d3636a4c --- /dev/null +++ b/docs/notes/precision-remeasure-2026-07-12-data/ClosedXML.json @@ -0,0 +1,23 @@ +{ + "target": "ClosedXML", + "target_commit": "4e89dcedd83cad553e84d2d97f77fc3d7deb630f", + "ownnet_commit": "4c5a86b176b04c42f7c1cc9e51aef545a3586cc9", + "ownnet_baseline_commit": "c029e8da59a60298eece7b1fbb5708a9886f55ee", + "command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning -- ", + "extractor_mode": "--flow-locals (own-check.sh default)", + "reference_resolution": "microsoft.windowsdesktop.app.ref 8.0.28/ref/net8.0 (47 dlls) via OWN_EXTRA_REF_DIRS, materialized identically to ci.yml corpus-benchmark job", + "baseline_source": "self-regenerated: OwnSharp.Extractor built at Own.NET commit c029e8da59a60298eece7b1fbb5708a9886f55ee (main, right after PR #226 merged the original oracle-sweep-2026-07-10.md sweep, before any of #218-#225's fixes), run with the identical command/flags against the same pinned target commit -- not copied from prose notes, to guarantee apples-to-apples inputs across the full #218-#240 batch", + "counts": { + "baseline_total": 270, + "current_total": 270, + "baseline_by_rule": { + "OWN001": 270 + }, + "current_by_rule": { + "OWN001": 270 + } + }, + "added": [], + "removed": [], + "changed": [] +} \ No newline at end of file diff --git a/docs/notes/precision-remeasure-2026-07-12-data/MahApps.Metro.json b/docs/notes/precision-remeasure-2026-07-12-data/MahApps.Metro.json new file mode 100644 index 00000000..59006944 --- /dev/null +++ b/docs/notes/precision-remeasure-2026-07-12-data/MahApps.Metro.json @@ -0,0 +1,55 @@ +{ + "target": "MahApps.Metro", + "target_commit": "72099e310bac2d12ac98fd7560b69679252519f5", + "ownnet_commit": "4c5a86b176b04c42f7c1cc9e51aef545a3586cc9", + "ownnet_baseline_commit": "c029e8da59a60298eece7b1fbb5708a9886f55ee", + "command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning -- ", + "extractor_mode": "--flow-locals (own-check.sh default)", + "reference_resolution": "microsoft.windowsdesktop.app.ref 8.0.28/ref/net8.0 (47 dlls) via OWN_EXTRA_REF_DIRS, materialized identically to ci.yml corpus-benchmark job", + "baseline_source": "self-regenerated: OwnSharp.Extractor built at Own.NET commit c029e8da59a60298eece7b1fbb5708a9886f55ee (main, right after PR #226 merged the original oracle-sweep-2026-07-10.md sweep, before any of #218-#225's fixes), run with the identical command/flags against the same pinned target commit -- not copied from prose notes, to guarantee apples-to-apples inputs across the full #218-#240 batch", + "counts": { + "baseline_total": 63, + "current_total": 60, + "baseline_by_rule": { + "OWN001": 3, + "OWN050": 60 + }, + "current_by_rule": { + "OWN050": 60 + } + }, + "added": [], + "removed": [ + { + "rule": "OWN001", + "level": "warning", + "path": "src/MahApps.Metro/Actions/CommandTriggerAction.cs", + "line": 116, + "message": "event 'newCommand.CanExecuteChanged' is subscribed (handler 'action.OnCommandCanExecuteChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'CommandTriggerAction' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "src/MahApps.Metro/Behaviors/TiltBehavior.cs", + "line": 70, + "message": "event 'panel.Loaded' is subscribed (handler '(sl, el) =>\n {\n var elements = panel.Children.OfType().ToList();\n\n elements.ForEach(element =>\n Interaction.GetBehaviors(element).Add(\n new TiltBehavior\n {\n KeepDragging = this.KeepDragging,\n TiltFactor = this.TiltFactor\n }));\n }') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'TiltBehavior' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#227", + "explained_by_pr": "#237", + "shape": "Behavior.AssociatedObject self-owned source" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "src/MahApps.Metro/Controls/MetroWindow.cs", + "line": 1448, + "message": "event 'metroContentControl.TransitionCompleted' is subscribed (handler '(_, _) => this.RaiseEvent(new RoutedEventArgs(WindowTransitionCompletedEvent))') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'MetroWindow' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#222", + "explained_by_pr": "#231", + "shape": "template-part local (GetTemplateChild pattern-var)" + } + ], + "changed": [] +} \ No newline at end of file diff --git a/docs/notes/precision-remeasure-2026-07-12-data/MaterialDesignInXamlToolkit.json b/docs/notes/precision-remeasure-2026-07-12-data/MaterialDesignInXamlToolkit.json new file mode 100644 index 00000000..0e7fdb7e --- /dev/null +++ b/docs/notes/precision-remeasure-2026-07-12-data/MaterialDesignInXamlToolkit.json @@ -0,0 +1,76 @@ +{ + "target": "MaterialDesignInXamlToolkit", + "target_commit": "ef3a5ea434e39182b1848f5e11aaea6b3890581f", + "ownnet_commit": "4c5a86b176b04c42f7c1cc9e51aef545a3586cc9", + "ownnet_baseline_commit": "c029e8da59a60298eece7b1fbb5708a9886f55ee", + "command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning -- ", + "extractor_mode": "--flow-locals (own-check.sh default)", + "reference_resolution": "microsoft.windowsdesktop.app.ref 8.0.28/ref/net8.0 (47 dlls) via OWN_EXTRA_REF_DIRS, materialized identically to ci.yml corpus-benchmark job", + "baseline_source": "self-regenerated: OwnSharp.Extractor built at Own.NET commit c029e8da59a60298eece7b1fbb5708a9886f55ee (main, right after PR #226 merged the original oracle-sweep-2026-07-10.md sweep, before any of #218-#225's fixes), run with the identical command/flags against the same pinned target commit -- not copied from prose notes, to guarantee apples-to-apples inputs across the full #218-#240 batch", + "counts": { + "baseline_total": 153, + "current_total": 148, + "baseline_by_rule": { + "OWN001": 23, + "OWN050": 130 + }, + "current_by_rule": { + "OWN001": 18, + "OWN050": 130 + } + }, + "added": [], + "removed": [ + { + "rule": "OWN001", + "level": "warning", + "path": "src/MahMaterialDragablzMashUp/App.xaml.cs", + "line": 22, + "message": "event 'themeManager.ThemeChanged' is subscribed (handler 'ThemeManager_ThemeChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'App' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#228", + "explained_by_pr": "#232", + "shape": "curated app-scoped source (PaletteHelper.GetThemeManager)" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "src/MaterialDesignThemes.Wpf/SmartHint.cs", + "line": 205, + "message": "event 'newHintProxy.IsVisibleChanged' is subscribed (handler 'smartHint.OnHintProxyIsVisibleChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'SmartHint' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "src/MaterialDesignThemes.Wpf/SmartHint.cs", + "line": 206, + "message": "event 'newHintProxy.ContentChanged' is subscribed (handler 'smartHint.OnHintProxyContentChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'SmartHint' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "src/MaterialDesignThemes.Wpf/SmartHint.cs", + "line": 207, + "message": "event 'newHintProxy.Loaded' is subscribed (handler 'smartHint.OnHintProxyContentChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'SmartHint' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "src/MaterialDesignThemes.Wpf/SmartHint.cs", + "line": 208, + "message": "event 'newHintProxy.FocusedChanged' is subscribed (handler 'smartHint.OnHintProxyFocusedChanged') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'SmartHint' alive (possible leak) [resource: subscription token]", + "explained_by_issue": "#218", + "explained_by_pr": "#230", + "shape": "DP/property-changed old->new subscription rotation" + } + ], + "changed": [] +} \ No newline at end of file diff --git a/docs/notes/precision-remeasure-2026-07-12-data/ShareX.json b/docs/notes/precision-remeasure-2026-07-12-data/ShareX.json new file mode 100644 index 00000000..4ee56340 --- /dev/null +++ b/docs/notes/precision-remeasure-2026-07-12-data/ShareX.json @@ -0,0 +1,386 @@ +{ + "target": "ShareX", + "target_commit": "0df9ca4d83eed9d2489048c539d7d1fc2860fdec", + "ownnet_commit": "4c5a86b176b04c42f7c1cc9e51aef545a3586cc9", + "ownnet_baseline_commit": "c029e8da59a60298eece7b1fbb5708a9886f55ee", + "command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning -- ", + "extractor_mode": "--flow-locals (own-check.sh default)", + "reference_resolution": "microsoft.windowsdesktop.app.ref 8.0.28/ref/net8.0 (47 dlls) via OWN_EXTRA_REF_DIRS, materialized identically to ci.yml corpus-benchmark job", + "baseline_source": "self-regenerated: OwnSharp.Extractor built at Own.NET commit c029e8da59a60298eece7b1fbb5708a9886f55ee (main, right after PR #226 merged the original oracle-sweep-2026-07-10.md sweep, before any of #218-#225's fixes), run with the identical command/flags against the same pinned target commit -- not copied from prose notes, to guarantee apples-to-apples inputs across the full #218-#240 batch", + "counts": { + "baseline_total": 350, + "current_total": 314, + "baseline_by_rule": { + "OWN001": 235, + "OWN050": 115 + }, + "current_by_rule": { + "OWN001": 199, + "OWN050": 115 + } + }, + "added": [], + "removed": [ + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Colors/ColorPicker.cs", + "line": 84, + "message": "IDisposable field 'colorBox' (type 'ColorBox') is never disposed \u2014 its owner 'ColorPicker' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Colors/ColorPicker.cs", + "line": 85, + "message": "IDisposable field 'colorSlider' (type 'ColorSlider') is never disposed \u2014 its owner 'ColorPicker' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Cryptographic/HashChecker.cs", + "line": 42, + "message": "IDisposable field 'cts' (type 'CancellationTokenSource') is never disposed \u2014 its owner 'HashChecker' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#220", + "explained_by_pr": "#231", + "shape": "using (field = new T()) release" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ClipboardViewerForm.designer.cs", + "line": 107, + "message": "IDisposable field 'txtSelectedClipboardContent' (type 'System.Windows.Forms.TextBox') is never disposed \u2014 its owner 'ClipboardViewerForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ClipboardViewerForm.designer.cs", + "line": 108, + "message": "IDisposable field 'btnRefresh' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'ClipboardViewerForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ClipboardViewerForm.designer.cs", + "line": 109, + "message": "IDisposable field 'btnClearClipboard' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'ClipboardViewerForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ClipboardViewerForm.designer.cs", + "line": 110, + "message": "IDisposable field 'lvClipboardContentList' (type 'System.Windows.Forms.ListView') is never disposed \u2014 its owner 'ClipboardViewerForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ClipboardViewerForm.designer.cs", + "line": 112, + "message": "IDisposable field 'pbSelectedClipboardContent' (type 'MyPictureBox') is never disposed \u2014 its owner 'ClipboardViewerForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ImageViewer.cs", + "line": 396, + "message": "IDisposable field 'pbPreview' (type 'MyPictureBox') is never disposed \u2014 its owner 'ImageViewer' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ImageViewer.cs", + "line": 397, + "message": "IDisposable field 'lblStatus' (type 'Label') is never disposed \u2014 its owner 'ImageViewer' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ImageViewer.cs", + "line": 398, + "message": "IDisposable field 'lblLeft' (type 'Label') is never disposed \u2014 its owner 'ImageViewer' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/ImageViewer.cs", + "line": 399, + "message": "IDisposable field 'lblRight' (type 'Label') is never disposed \u2014 its owner 'ImageViewer' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/InputBox.cs", + "line": 145, + "message": "IDisposable field 'btnOK' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'InputBox' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/InputBox.cs", + "line": 146, + "message": "IDisposable field 'btnCancel' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'InputBox' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/InputBox.cs", + "line": 147, + "message": "IDisposable field 'txtInputText' (type 'System.Windows.Forms.TextBox') is never disposed \u2014 its owner 'InputBox' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/Forms/TrayForm.cs", + "line": 33, + "message": "IDisposable field 'TrayIcon' (type 'NotifyIcon') is never disposed \u2014 its owner 'TrayForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms IContainer registration (new T(components))" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.HelpersLib/TaskEx.cs", + "line": 41, + "message": "IDisposable field 'cts' (type 'CancellationTokenSource') is never disposed \u2014 its owner 'TaskEx' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#220", + "explained_by_pr": "#231", + "shape": "using (field = new T()) release" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.IndexerLib/IndexerJson.cs", + "line": 35, + "message": "IDisposable field 'jsonWriter' (type 'JsonWriter') is never disposed \u2014 its owner 'IndexerJson' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#220", + "explained_by_pr": "#231", + "shape": "using (field = new T()) release" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs", + "line": 369, + "message": "event 'control.MouseDown' is subscribed (handler '(sender, e) => Form.SetHandCursor(true)') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'ShapeManager' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#229", + "explained_by_pr": "#239", + "shape": "self-populated owned-collection element (DrawableObjects)" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs", + "line": 370, + "message": "event 'control.MouseUp' is subscribed (handler '(sender, e) =>\r\n {\r\n if (control.IsCursorHover)\r\n {\r\n Form.SetHandCursor(false);\r\n }\r\n else\r\n {\r\n Form.SetDefaultCursor();\r\n }\r\n }') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'ShapeManager' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#229", + "explained_by_pr": "#239", + "shape": "self-populated owned-collection element (DrawableObjects)" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs", + "line": 381, + "message": "event 'control.MouseEnter' is subscribed (handler '() => Form.SetHandCursor(false)') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'ShapeManager' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#229", + "explained_by_pr": "#239", + "shape": "self-populated owned-collection element (DrawableObjects)" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs", + "line": 382, + "message": "event 'control.MouseLeave' is subscribed (handler '() => Form.SetDefaultCursor()') but never unsubscribed; its source is an injected dependency whose lifetime is unknown, so it may outlive and keep 'ShapeManager' alive (possible leak \u2014 and being an inline lambda it has no '-=' handle, so it could never be detached) [resource: subscription token]", + "explained_by_issue": "#229", + "explained_by_pr": "#239", + "shape": "self-populated owned-collection element (DrawableObjects)" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/ActionsToolbarForm.cs", + "line": 56, + "message": "IDisposable field 'tsMain' (type 'ToolStripEx') is never disposed \u2014 its owner 'ActionsToolbarForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/ActionsToolbarForm.cs", + "line": 57, + "message": "IDisposable field 'ttMain' (type 'ToolTip') is never disposed \u2014 its owner 'ActionsToolbarForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms IContainer registration (new T(components))" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/ActionsToolbarForm.cs", + "line": 58, + "message": "IDisposable field 'cmsTitle' (type 'ContextMenuStrip') is never disposed \u2014 its owner 'ActionsToolbarForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms IContainer registration (new T(components))" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 150, + "message": "IDisposable field 'pbPreview' (type 'HelpersLib.MyPictureBox') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 151, + "message": "IDisposable field 'tmrClose' (type 'System.Windows.Forms.Timer') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms IContainer registration (new T(components))" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 152, + "message": "IDisposable field 'btnOpenFolder' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 153, + "message": "IDisposable field 'btnCopyImage' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 154, + "message": "IDisposable field 'btnOpenLink' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 155, + "message": "IDisposable field 'btnCopyLink' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 156, + "message": "IDisposable field 'btnOpenFile' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 157, + "message": "IDisposable field 'btnClose' (type 'System.Windows.Forms.Button') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/AfterUploadForm.designer.cs", + "line": 158, + "message": "IDisposable field 'lvClipboardFormats' (type 'HelpersLib.MyListView') is never disposed \u2014 its owner 'AfterUploadForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms Controls.Add disposal channel" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/NotificationForm.cs", + "line": 430, + "message": "IDisposable field 'tDuration' (type 'Timer') is never disposed \u2014 its owner 'NotificationForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms IContainer registration (new T(components))" + }, + { + "rule": "OWN001", + "level": "warning", + "path": "ShareX/Forms/NotificationForm.cs", + "line": 431, + "message": "IDisposable field 'tOpacity' (type 'Timer') is never disposed \u2014 its owner 'NotificationForm' leaks it (leak) [resource: disposable field]", + "explained_by_issue": "#219", + "explained_by_pr": "#236", + "shape": "WinForms IContainer registration (new T(components))" + } + ], + "changed": [] +} \ No newline at end of file diff --git a/docs/notes/precision-remeasure-2026-07-12.md b/docs/notes/precision-remeasure-2026-07-12.md new file mode 100644 index 00000000..1fc0cf77 --- /dev/null +++ b/docs/notes/precision-remeasure-2026-07-12.md @@ -0,0 +1,191 @@ +# Full post-batch oracle remeasure — 2026-07-12 + +Follow-up to [`oracle-sweep-2026-07-10.md`](oracle-sweep-2026-07-10.md) (issue +\#201), [`oracle-sweep-rerun-2026-07-11.md`](oracle-sweep-rerun-2026-07-11.md), +and [`precision-remeasure-2026-07-11.md`](precision-remeasure-2026-07-11.md). +Those covered partial slices of the follow-up batch (#218/#220/#222/#223/#224, +then #225/#228). This note remeasures all **5** pinned targets on current +`main` after the **complete** batch — #218, #219, #220, #222, #223, #224, +\#227, #228, #229 — and the #238 soundness regression + #240 hotfix. + +## Method + +- **Targets and pinned commits** — same as the established sweep, reused + verbatim (no re-resolution against upstream HEAD): ShareX `0df9ca4`, + MahApps.Metro `72099e3`, MaterialDesignInXamlToolkit `ef3a5ea`, AvalonEdit + `ed0bd14`, ClosedXML `4e89dce`. All five were re-cloned and checked out at + exactly these SHAs; `git rev-parse HEAD` confirmed an exact match for each + before scanning (no upstream drift possible since these are fixed commits, + not branches). +- **Own.NET commit (current)** — `main` at `4c5a86b` (merge of PR #240, the + tip of `main` at measurement time — the branch used for this note's own + doc-only PR is `9d39b8c`, identical analyzer code to `4c5a86b` since Phase 1 + of this cleanup touched no analyzer source). +- **Baseline** — *self-regenerated*, not copied from prose. `OwnSharp.Extractor` + was also built at Own.NET commit `c029e8d` (`main`, the merge of PR #226 — + right after `oracle-sweep-2026-07-10.md` landed, before **any** of + #218-#225's fixes), and run with the identical command against the same + pinned target commits. This guarantees an apples-to-apples diff across the + *entire* #218-#240 batch in one pass, rather than stitching together + partial deltas from three different historical notes that each used + slightly different repo subsets and Own.NET commits. (Spot check: the + regenerated baseline's raw SARIF counts exactly match every previously + published raw-SARIF count where one exists — MahApps.Metro 3, MaterialDesign + 23, AvalonEdit 24, ShareX 235 OWN001 findings match + `oracle-sweep-rerun-2026-07-11.md`'s "before" column; ClosedXML 270 matches + `precision-remeasure-2026-07-11.md`'s pre-#233 count. The *hand-triaged* + "own leak" counts in the original 2026-07-10 table (18, 14, 5) are smaller + because that table counted post-triage "obvious" sites, not raw SARIF + results — confirmed by `oracle-sweep-rerun-2026-07-11.md`'s own caveat: "Raw + finding counts here are literal SARIF result counts, not the hand-grouped + 'own-only' site counts in the 2026-07-10 table".) +- **Command** (identical for baseline and current, both builds): + ``` + OWN_EXTRA_REF_DIRS= \ + scripts/own-check.sh --format sarif --severity warning -- + ``` +- **Extractor mode** — `--flow-locals` (own-check.sh's default; not + `--legacy`), matching `oracle-sweep-rerun-2026-07-11.md`'s stated method. +- **Reference resolution** — `microsoft.windowsdesktop.app.ref` 8.0.28, + `ref/net8.0` (47 DLLs), materialized via a scratch `net8.0-windows` + `UseWPF`/`UseWindowsForms`/`EnableWindowsTargeting` csproj + `dotnet + restore`, then exported as `OWN_EXTRA_REF_DIRS` — the exact mechanism + `ci.yml`'s `corpus-benchmark` job and the established sweep methodology + both use. OWN050 (unresolved-reference advisory) counts are byte-for-byte + identical between baseline and current for all 5 targets (confirmed below), + so reference coverage did not shift — only the fixes' targets did. +- **Diffing** — SARIF results matched by `(ruleId, normalized path, line)`. + Paths normalized to be relative to each target's repo root (the + `../targets//` prefix `own-check` emits is stripped). Deterministic + ordering: sorted by `(rule, path, line)`. + +## Headline numbers + +| target | baseline (pre-#218..#240) | current (post-batch) | Δ | added | removed | OWN050 (unchanged) | +|---|---:|---:|---:|---:|---:|---:| +| ShareX | 350 (235 OWN001 + 115 OWN050) | 314 (199 OWN001 + 115 OWN050) | **−36** | 0 | 36 | 115 = 115 | +| MahApps.Metro | 63 (3 OWN001 + 60 OWN050) | 60 (0 OWN001 + 60 OWN050) | **−3** | 0 | 3 | 60 = 60 | +| MaterialDesignInXamlToolkit | 153 (23 OWN001 + 130 OWN050) | 148 (18 OWN001 + 130 OWN050) | **−5** | 0 | 5 | 130 = 130 | +| AvalonEdit | 29 (23 OWN001 + 1 OWN014 + 5 OWN050) | 22 (17 OWN001 + 0 OWN014 + 5 OWN050) | **−7** | 0 | 7 | 5 = 5 | +| ClosedXML | 270 (270 OWN001) | 270 (270 OWN001) | **0** | 0 | 0 | n/a | +| **total** | **865** | **814** | **−51** | **0** | **51** | | + +Zero new findings anywhere (no regressions). Every removed finding is +classified below against a specific merged issue/PR — **0 UNEXPLAINED**. + +**ClosedXML is the load-bearing result of this remeasure.** Delta is +identically zero against the *pre-#225* baseline: the #238 soundness +regression (263 findings silently swallowed by the source-empty-Dispose +exemption trusting `XLWorkbook.Dispose()` despite `Janitor.Fody` weaving real +cleanup into it) is fully closed by #240's `IEnumerator`-only narrowing — +confirmed here independently of #240's own PR-description remeasure (which +used a narrower `--flow-locals`-only, loose-file-resolution setup against a +newer HEAD, by its own admission not a full `own-check` sweep). This run used +the full `own-check.sh --format sarif` sweep against the exact pinned commit +and got the same qualitative answer: **nothing silently disappeared.** + +## Classification of every removed finding + +### ShareX (36 removed) + +| shape | issue / PR | count | example | +|---|---|---:|---| +| WinForms `Controls.Add`/`IContainer` disposal channel | #219 / PR #236 | 29 | `Forms/ImageViewer.cs:396-399`, `Forms/TrayForm.cs:33` | +| `using (field = new T())` release | #220 / PR #231 | 3 | `Cryptographic/HashChecker.cs:42`, `TaskEx.cs:41`, `IndexerLib/IndexerJson.cs:35` | +| self-populated owned-collection element | #229 / PR #239 | 4 | `Shapes/ShapeManager.cs:369-382` (`DrawableObjects` — populated by `ShapeManager` itself, then iterated with `+=` in the same ctor) | + +### MahApps.Metro (3 removed) + +| shape | issue / PR | count | example | +|---|---|---:|---| +| DP/property-changed old→new subscription rotation | #218 / PR #230 | 1 | `Actions/CommandTriggerAction.cs:116` | +| `Behavior.AssociatedObject` self-owned source | #227 / PR #237 | 1 | `Behaviors/TiltBehavior.cs:70` | +| template-part local (`GetTemplateChild` pattern-var) | #222 / PR #231 | 1 | `Controls/MetroWindow.cs:1448` | + +### MaterialDesignInXamlToolkit (5 removed) + +| shape | issue / PR | count | example | +|---|---|---:|---| +| curated app-scoped source (`PaletteHelper.GetThemeManager`) | #228 / PR #232 | 1 | `MahMaterialDragablzMashUp/App.xaml.cs:22` | +| DP/property-changed old→new subscription rotation | #218 / PR #230 | 4 | `MaterialDesignThemes.Wpf/SmartHint.cs:205-208` | + +### AvalonEdit (7 removed) + +| shape | issue / PR | count | example | +|---|---|---:|---| +| template-part local (`FindName` pattern-var) | #222 / PR #231 | 2 | `CodeCompletion/OverloadViewer.cs:58,64` | +| DP/property-changed old→new subscription rotation | #218 / PR #230 | 3 | `Editing/AbstractMargin.cs:99`, `Editing/LineNumberMargin.cs:114`, `Folding/FoldingMargin.cs:218` | +| self-detaching handler | #224 / PR #231 | 1 | `Search/DropDownButton.cs:78` | +| `CommandManager.RequerySuggested` weak-event allowlist | #223 / PR #231 | 1 | `Editing/ImeSupport.cs:47` (OWN014) | + +### ClosedXML (0 removed) + +Nothing removed. See "load-bearing result" above. + +Every classification above was verified by reading the actual current source +at the cited location (not inferred from the shape's name) — e.g. confirming +`ShapeManager.cs`'s `DrawableObjects` is populated only by +`DrawableObjects = new List()` / `.Add(node)` inside +`ShapeManager` itself before the `foreach` that subscribes, and that +`HashChecker.cs`'s `cts` field is the direct target of `using (cts = new +CancellationTokenSource())`. + +## Previously confirmed true positives — preserved + +Spot-checked directly against the current SARIF (not assumed from the +"removed" list being empty at these sites): + +- ShareX flagship: `ShareX.ScreenCaptureLib/Shapes/ShapeManagerMenu.cs:47` + (`menuForm`, the corpus-reduced flagship leak) — **present**. The + `HistoryItemManager`/`HistoryItemManager_ContextMenu.cs` cluster (~50 + `ToolStripMenuItem`/`ToolStripSeparator` fields) — **present**, all of them. +- AvalonEdit: `Rendering/TextView.cs:1843` (`services`), `:1946` + (`hoverLogic`) — **present**, both. +- ClosedXML: `ClosedXML.Tests/Excel/CalcEngine/FunctionsTests.cs:285` (`cts`, + genuine undisposed `CancellationTokenSource`), `ClosedXML.Tests/Excel/Ranges/ + UsedAndUnusedCellsTests.cs:10` (`workbook` field) — **present**, both. + +No previously confirmed true positive disappeared in this remeasure. + +## Stop-condition checklist + +- Confirmed true positive disappearing? **No** — all spot-checked above. +- Command/corpus differs from baseline? **No** — identical `own-check.sh` + invocation, identical `OWN_EXTRA_REF_DIRS` setup, identical pinned target + commits for both the baseline and current runs (verified by `git + rev-parse`). +- Delta contradicts a merged PR claim? **No** — every removed finding maps + to the exact shape its issue/PR describes; ClosedXML's zero delta matches + #240's own "0 removed" claim, independently reproduced here. +- ClosedXML findings disappearing under the empty-Dispose exemption despite + Fody being active? **No** — zero ClosedXML findings disappeared; the #240 + gate (confined to `IEnumerator` implementers, with a `FodyWeavers.xml` + kill-switch) does not touch ClosedXML's `XLWorkbook`/`Slice.Enumerator` + shapes here. +- Unrecorded local environment assumption? The WindowsDesktop ref pack + version (8.0.28) is recorded above and in the machine-readable data; + `dotnet --version` was `8.0.422` for both builds (same installed SDK, one + install, two `dotnet build` invocations against different Own.NET + checkouts). + +None of the stop conditions triggered. + +## Machine-readable data + +Per-target JSON (schema: `target`, `target_commit`, `ownnet_commit`, +`ownnet_baseline_commit`, `command`, `extractor_mode`, +`reference_resolution`, `baseline_source`, `counts`, `added`, `removed` +(each entry carries `explained_by_issue`/`explained_by_pr`/`shape`, or +`"UNEXPLAINED"`), `changed`) in +[`precision-remeasure-2026-07-12-data/`](precision-remeasure-2026-07-12-data/): +`ShareX.json`, `MahApps.Metro.json`, `MaterialDesignInXamlToolkit.json`, +`AvalonEdit.json`, `ClosedXML.json`. Counts and classifications in this prose +note were generated from the same diff run that produced these files (no +independent transcription) — this is the meaning of "prose and +machine-readable agree" for this note. + +## Scope note + +No analyzer code was changed to produce this note. This is a measurement-only +PR, per the guardrail that analyzer changes and measurement must not be mixed +in the same PR.