Repository navigation
Commit d2c0f92
committed
fix(extractor): resolve-aware field disposability — ask the real IDisposable (mined ImageSharp)
The field-disposable leak detector classified a field's type with a pure NAME heuristic
(EndsWith Stream/Reader/Writer/Subscription), so any in-project type whose name happens to
end that way was flagged even when it is NOT IDisposable. Mining SixLabors/ImageSharp
surfaced the FPs: undisposed `Vp8BitWriter`/`Vp8LBitWriter` (`: BitWriterBase`) and
`JpegBitReader` (a struct) fields — none of them IDisposable.
IsOwnedDisposableType now asks the RESOLVED type's real IDisposable/IAsyncDisposable
interface; it falls back to the name heuristic only when the type does NOT resolve (an
unreferenced external assembly — WPF/DevExpress on a Linux runner — which is the whole
reason that heuristic exists). This generalises the #79 PipeReader/PipeWriter exclusion:
any resolved non-IDisposable type is now excluded, no curated list needed.
Regression sample ResolvedDisposableSample.cs: a resolved non-IDisposable `…Writer` field
and a non-IDisposable `…Reader` struct stay silent; resolved IDisposable controls
(MemoryStream, CancellationTokenSource) still warn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rg8kSk1YT14x7A1vo5zgED1 parent eba8c9a commit d2c0f92
3 files changed
Lines changed: 88 additions & 1 deletion
File tree
- .github/workflows
- frontend/roslyn
- OwnSharp.Extractor
- samples
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
| 142 | + | |
142 | 143 | | |
143 | 144 | | |
144 | 145 | | |
| |||
203 | 204 | | |
204 | 205 | | |
205 | 206 | | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
206 | 217 | | |
207 | 218 | | |
208 | 219 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1524 | 1524 | | |
1525 | 1525 | | |
1526 | 1526 | | |
| 1527 | + | |
| 1528 | + | |
| 1529 | + | |
| 1530 | + | |
| 1531 | + | |
| 1532 | + | |
| 1533 | + | |
| 1534 | + | |
| 1535 | + | |
| 1536 | + | |
| 1537 | + | |
| 1538 | + | |
| 1539 | + | |
| 1540 | + | |
| 1541 | + | |
| 1542 | + | |
| 1543 | + | |
| 1544 | + | |
| 1545 | + | |
| 1546 | + | |
| 1547 | + | |
| 1548 | + | |
| 1549 | + | |
| 1550 | + | |
| 1551 | + | |
| 1552 | + | |
| 1553 | + | |
| 1554 | + | |
| 1555 | + | |
| 1556 | + | |
| 1557 | + | |
1527 | 1558 | | |
1528 | 1559 | | |
1529 | 1560 | | |
| |||
2116 | 2147 | | |
2117 | 2148 | | |
2118 | 2149 | | |
2119 | | - | |
| 2150 | + | |
| 2151 | + | |
| 2152 | + | |
| 2153 | + | |
| 2154 | + | |
2120 | 2155 | | |
2121 | 2156 | | |
2122 | 2157 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
0 commit comments