circle-ir 3.149.0 → 3.150.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -68,5 +68,31 @@ export declare class ResourceLeakPass implements AnalysisPass<ResourceLeakResult
68
68
  * `void openFoo()` continue to fire.
69
69
  */
70
70
  private isFactoryMethod;
71
+ /**
72
+ * #226 — true if `variable` is passed as a constructor argument to a
73
+ * known Closeable wrapper call within the enclosing method's line
74
+ * range. Ownership of the inner stream transfers to the wrapper.
75
+ *
76
+ * The check is deliberately per-method: cross-method wrapping does
77
+ * not apply because the inner reference has already escaped the
78
+ * scope by then.
79
+ */
80
+ private isWrappedByCloseableCtor;
81
+ /**
82
+ * #227 — true if `variable` refers to a field of the enclosing class
83
+ * that is closed inside a worker-literal method (Runnable#run,
84
+ * Callable#call, Consumer#accept, ...) declared in the same enclosing
85
+ * method. Ownership transfers to the executor thread.
86
+ *
87
+ * The heuristic is intentionally conservative: it requires both
88
+ * (a) the resource variable to match a declared field name on the
89
+ * enclosing class (so a stray local named `selector` cannot
90
+ * accidentally opt in to the suppression), AND
91
+ * (b) a `<field>.close()` (or CLOSE_METHODS) call to appear on a
92
+ * line inside a method whose name is one of WORKER_METHODS and
93
+ * whose start_line is strictly within the enclosing method's
94
+ * body (nested literal indicator).
95
+ */
96
+ private isClosedInNestedWorker;
71
97
  }
72
98
  //# sourceMappingURL=resource-leak-pass.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-leak-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/resource-leak-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AA+C9E,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;KAChC,CAAC,CAAC;CACJ;AAED,qBAAa,gBAAiB,YAAW,YAAY,CAAC,kBAAkB,CAAC;IACvE,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,QAAQ,EAAG,aAAa,CAAU;IAE3C,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,kBAAkB;IA0HzC,kFAAkF;IAClF,OAAO,CAAC,eAAe;IAOvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAgBvB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;CAIxB"}
1
+ {"version":3,"file":"resource-leak-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/resource-leak-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAgF9E,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;KAChC,CAAC,CAAC;CACJ;AAED,qBAAa,gBAAiB,YAAW,YAAY,CAAC,kBAAkB,CAAC;IACvE,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,QAAQ,EAAG,aAAa,CAAU;IAE3C,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,kBAAkB;IAkJzC,kFAAkF;IAClF,OAAO,CAAC,eAAe;IAOvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAgBvB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAKvB;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAmBhC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,sBAAsB;CAqD/B"}
@@ -56,6 +56,37 @@ const CLOSE_METHODS = new Set([
56
56
  'close', 'dispose', 'shutdown', 'disconnect', 'release', 'destroy', 'free',
57
57
  'shutdownNow', 'terminate',
58
58
  ]);
59
+ /**
60
+ * #226 — Closeable wrapper constructors that document ownership transfer
61
+ * of their underlying stream/reader. When the underlying resource is passed
62
+ * as a constructor argument to one of these wrappers, closing the wrapper
63
+ * cascades to the inner stream (per JDK javadoc), so no leak exists.
64
+ * Reference: java.io + java.util.zip standard wrappers.
65
+ */
66
+ const WRAPPER_CTORS = new Set([
67
+ // java.io wrappers
68
+ 'BufferedInputStream', 'BufferedOutputStream', 'BufferedReader', 'BufferedWriter',
69
+ 'InputStreamReader', 'OutputStreamWriter', 'DataInputStream', 'DataOutputStream',
70
+ 'PrintStream', 'PrintWriter', 'LineNumberReader', 'PushbackInputStream',
71
+ 'PushbackReader', 'SequenceInputStream',
72
+ // java.util.zip wrappers
73
+ 'GZIPInputStream', 'GZIPOutputStream', 'ZipInputStream', 'ZipOutputStream',
74
+ 'InflaterInputStream', 'DeflaterOutputStream', 'CheckedInputStream',
75
+ 'CheckedOutputStream',
76
+ ]);
77
+ /**
78
+ * #227 — Anonymous-class / functional-interface literal method names that
79
+ * commonly hold long-lived resources handed off from an outer scope. When a
80
+ * resource-field is closed inside one of these literals, ownership has been
81
+ * transferred to the worker and the outer method should not be flagged.
82
+ */
83
+ const WORKER_METHODS = new Set([
84
+ 'run', // Runnable, Thread
85
+ 'call', // Callable
86
+ 'accept', // Consumer
87
+ 'get', // Supplier
88
+ 'apply', // Function
89
+ ]);
59
90
  export class ResourceLeakPass {
60
91
  name = 'resource-leak';
61
92
  category = 'reliability';
@@ -103,6 +134,24 @@ export class ResourceLeakPass {
103
134
  if (this.isFactoryMethod(methodInfo.method)) {
104
135
  continue;
105
136
  }
137
+ // #226 — suppression 4: resource is immediately passed as a
138
+ // constructor argument to a known Closeable wrapper (e.g.
139
+ // `new GZIPInputStream(fis)`, `new BufferedReader(new
140
+ // InputStreamReader(is))`). Per JDK javadoc, closing the
141
+ // wrapper cascades to the underlying stream, so ownership
142
+ // transfers to the wrapper and the inner reference is released
143
+ // through the outer chain.
144
+ if (this.isWrappedByCloseableCtor(graph.ir.calls, resourceVar, openLine, methodEnd)) {
145
+ continue;
146
+ }
147
+ // #227 — suppression 5: resource is stored to a class field
148
+ // AND that field is referenced with a close() call inside a
149
+ // worker literal (Runnable#run / Callable#call / etc.) declared
150
+ // in the same method. Idiomatic Java concurrency: outer method
151
+ // opens the resource, executor thread closes it in cleanup.
152
+ if (this.isClosedInNestedWorker(graph, codeLines, resourceVar, methodInfo, openLine, methodEnd)) {
153
+ continue;
154
+ }
106
155
  // Look for a close() call on this resource within the method
107
156
  const closeCall = graph.ir.calls.find(c => CLOSE_METHODS.has(c.method_name) &&
108
157
  c.receiver === resourceVar &&
@@ -240,5 +289,94 @@ export class ResourceLeakPass {
240
289
  return false;
241
290
  return FACTORY_METHOD_NAME_RE.test(method.name);
242
291
  }
292
+ /**
293
+ * #226 — true if `variable` is passed as a constructor argument to a
294
+ * known Closeable wrapper call within the enclosing method's line
295
+ * range. Ownership of the inner stream transfers to the wrapper.
296
+ *
297
+ * The check is deliberately per-method: cross-method wrapping does
298
+ * not apply because the inner reference has already escaped the
299
+ * scope by then.
300
+ */
301
+ isWrappedByCloseableCtor(calls, variable, fromLine, toLine) {
302
+ // WRAPPER_CTORS names are PascalCase JDK class names — safe to
303
+ // match regardless of `is_constructor` (Java tree-sitter often
304
+ // omits the flag).
305
+ for (const call of calls) {
306
+ if (!WRAPPER_CTORS.has(call.method_name))
307
+ continue;
308
+ if (call.location.line < fromLine || call.location.line > toLine)
309
+ continue;
310
+ for (const arg of call.arguments) {
311
+ if (arg.variable === variable)
312
+ return true;
313
+ }
314
+ }
315
+ return false;
316
+ }
317
+ /**
318
+ * #227 — true if `variable` refers to a field of the enclosing class
319
+ * that is closed inside a worker-literal method (Runnable#run,
320
+ * Callable#call, Consumer#accept, ...) declared in the same enclosing
321
+ * method. Ownership transfers to the executor thread.
322
+ *
323
+ * The heuristic is intentionally conservative: it requires both
324
+ * (a) the resource variable to match a declared field name on the
325
+ * enclosing class (so a stray local named `selector` cannot
326
+ * accidentally opt in to the suppression), AND
327
+ * (b) a `<field>.close()` (or CLOSE_METHODS) call to appear on a
328
+ * line inside a method whose name is one of WORKER_METHODS and
329
+ * whose start_line is strictly within the enclosing method's
330
+ * body (nested literal indicator).
331
+ */
332
+ isClosedInNestedWorker(graph, lines, variable, methodInfo, fromLine, toLine) {
333
+ // (a) resource variable must match a declared field of the class,
334
+ // or be text-assigned to a field within the outer method.
335
+ const fieldNames = new Set(methodInfo.type.fields.map(f => f.name));
336
+ let candidateField = null;
337
+ if (fieldNames.has(variable)) {
338
+ candidateField = variable;
339
+ }
340
+ else {
341
+ // Fallback: `this.<field> = variable` or `<field> = variable`
342
+ // where <field> is a declared field.
343
+ const thisAssignRe = new RegExp(`(?:\\bthis\\s*\\.\\s*)?(\\w+)\\s*=\\s*${escapeRegex(variable)}\\b`);
344
+ for (let l = fromLine; l <= toLine && l <= lines.length; l++) {
345
+ const m = thisAssignRe.exec(lines[l - 1] ?? '');
346
+ if (m && fieldNames.has(m[1])) {
347
+ candidateField = m[1];
348
+ break;
349
+ }
350
+ }
351
+ }
352
+ if (!candidateField)
353
+ return false;
354
+ // (b) find a close-style call on the candidate field whose line
355
+ // falls inside a WORKER_METHODS method nested in the enclosing
356
+ // method's body.
357
+ for (const call of graph.ir.calls) {
358
+ if (call.receiver !== candidateField)
359
+ continue;
360
+ if (!CLOSE_METHODS.has(call.method_name))
361
+ continue;
362
+ const closeLine = call.location.line;
363
+ if (closeLine < fromLine || closeLine > toLine)
364
+ continue;
365
+ const enclosing = graph.methodAtLine(closeLine);
366
+ if (!enclosing)
367
+ continue;
368
+ // Same outer method — not nested.
369
+ if (enclosing.method === methodInfo.method)
370
+ continue;
371
+ if (!WORKER_METHODS.has(enclosing.method.name))
372
+ continue;
373
+ // Nested worker start must lie inside the outer method body.
374
+ if (enclosing.method.start_line > fromLine &&
375
+ enclosing.method.start_line <= toLine) {
376
+ return true;
377
+ }
378
+ }
379
+ return false;
380
+ }
243
381
  }
244
382
  //# sourceMappingURL=resource-leak-pass.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-leak-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/resource-leak-pass.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-leak-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/resource-leak-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,mFAAmF;AACnF,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;kEAGkE;AAClE,MAAM,sBAAsB,GAC1B,0CAA0C,CAAC;AAE7C,qDAAqD;AACrD,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IAClD,UAAU;IACV,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY;IACjE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,mBAAmB;IACtE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB;IAC/E,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB;IAC9E,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB;IAC1E,WAAW;IACX,aAAa;IACb,WAAW;IACX,QAAQ,EAAE,cAAc,EAAE,gBAAgB;CAC3C,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC;IAC5D,cAAc;IACd,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB;IACnE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB;IAC1D,kBAAkB;IAClB,MAAM;IACN,kBAAkB;IAClB,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB;CAC5D,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC;IACjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM;IAC1E,aAAa,EAAE,WAAW;CAC3B,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC;IACjD,mBAAmB;IACnB,qBAAqB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB;IACjF,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB;IAChF,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,qBAAqB;IACvE,gBAAgB,EAAE,qBAAqB;IACvC,yBAAyB;IACzB,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB;IAC1E,qBAAqB,EAAE,sBAAsB,EAAE,oBAAoB;IACnE,qBAAqB;CACtB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IAClD,KAAK,EAAK,mBAAmB;IAC7B,MAAM,EAAI,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAK,WAAW;IACrB,OAAO,EAAG,WAAW;CACtB,CAAC,CAAC;AAYH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,eAAe,CAAC;IACvB,QAAQ,GAAG,aAAsB,CAAC;IAE3C,GAAG,CAAC,GAAgB;QAClB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnC,MAAM,KAAK,GAAgC,EAAE,CAAC;QAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;YAE9B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7E,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS;gBAAE,SAAS;YAE3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAEpC,0DAA0D;YAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAErC,uCAAuC;YACvC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU;gBAAE,SAAS;YAC1B,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;YACjD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;YAE7C,4DAA4D;YAC5D,+DAA+D;YAC/D,4DAA4D;YAC5D,sDAAsD;YACtD,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC5E,SAAS;YACX,CAAC;YAED,gEAAgE;YAChE,4DAA4D;YAC5D,kEAAkE;YAClE,gCAAgC;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACpF,IAAI,SAAS,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChF,SAAS;YACX,CAAC;YAED,6DAA6D;YAC7D,6DAA6D;YAC7D,6DAA6D;YAC7D,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,SAAS;YACX,CAAC;YAED,4DAA4D;YAC5D,0DAA0D;YAC1D,sDAAsD;YACtD,yDAAyD;YACzD,0DAA0D;YAC1D,+DAA+D;YAC/D,2BAA2B;YAC3B,IAAI,IAAI,CAAC,wBAAwB,CAC/B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CACjD,EAAE,CAAC;gBACF,SAAS;YACX,CAAC;YAED,4DAA4D;YAC5D,4DAA4D;YAC5D,gEAAgE;YAChE,+DAA+D;YAC/D,4DAA4D;YAC5D,IAAI,IAAI,CAAC,sBAAsB,CAC7B,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAC/D,EAAE,CAAC;gBACF,SAAS;YACX,CAAC;YAED,6DAA6D;YAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,CACF,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;gBAChC,CAAC,CAAC,QAAQ,KAAK,WAAW;gBAC1B,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ;gBAC1B,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS,CAC/B,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAEvD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,qEAAqE;gBACrE,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC;oBAAE,SAAS;gBAEvE,uDAAuD;gBACvD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBACxF,GAAG,CAAC,UAAU,CAAC;oBACb,EAAE,EAAE,iBAAiB,IAAI,IAAI,QAAQ,EAAE;oBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,IAAI;oBAClB,GAAG,EAAE,SAAS;oBACd,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,OAAO;oBACd,OAAO,EACL,oBAAoB,IAAI,mBAAmB,WAAW,aAAa,QAAQ,GAAG;wBAC9E,oEAAoE;oBACtE,IAAI;oBACJ,IAAI,EAAE,QAAQ;oBACd,OAAO;oBACP,GAAG,EACD,4CAA4C,IAAI,IAAI,WAAW,qBAAqB;wBACpF,aAAa,WAAW,+BAA+B;oBACzD,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE;iBACpD,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,4DAA4D;YAC5D,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC;gBAAE,SAAS;YAEnE,iEAAiE;YACjE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YACzF,GAAG,CAAC,UAAU,CAAC;gBACb,EAAE,EAAE,iBAAiB,IAAI,IAAI,QAAQ,EAAE;gBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,GAAG,EAAE,SAAS;gBACd,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,SAAS;gBAChB,OAAO,EACL,8BAA8B,IAAI,QAAQ,WAAW,kBAAkB;oBACvE,QAAQ,SAAS,CAAC,QAAQ,CAAC,IAAI,oCAAoC;oBACnE,mCAAmC;gBACrC,IAAI;gBACJ,IAAI,EAAE,QAAQ;gBACd,OAAO;gBACP,GAAG,EAAE,UAAU,WAAW,4DAA4D;gBACtF,QAAQ,EAAE;oBACR,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,WAAW;oBACrB,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI;iBACpC;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,kFAAkF;IAC1E,eAAe,CAAC,KAAe,EAAE,QAAgB,EAAE,MAAc;QACvE,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7D,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC1D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,mBAAmB,CAAC,KAAe,EAAE,QAAgB,EAAE,MAAc;QAC3E,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC9E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CACxB,KAAe,EACf,QAAgB,EAChB,QAAgB,EAChB,MAAc;QAEd,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,uBAAuB,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7D,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACK,eAAe,CACrB,KAAe,EACf,QAAgB,EAChB,QAAgB,EAChB,MAAc;QAEd,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B,oCAAoC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAC/D,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7D,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,sBAAsB,CAC5B,KAAgB,EAChB,SAAiB,EACjB,IAAc;QAEd,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACnF,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACvC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;OAMG;IACK,eAAe,CAAC,MAAkB;QACxC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACvE,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;OAQG;IACK,wBAAwB,CAC9B,KAA0B,EAC1B,QAAgB,EAChB,QAAgB,EAChB,MAAc;QAEd,+DAA+D;QAC/D,+DAA+D;QAC/D,mBAAmB;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,SAAS;YACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM;gBAAE,SAAS;YAC3E,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACK,sBAAsB,CAC5B,KAAgB,EAChB,KAAe,EACf,QAAgB,EAChB,UAAkD,EAClD,QAAgB,EAChB,MAAc;QAEd,kEAAkE;QAClE,0DAA0D;QAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,cAAc,GAAG,QAAQ,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC9D,qCAAqC;YACrC,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B,yCAAyC,WAAW,CAAC,QAAQ,CAAC,KAAK,CACpE,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7D,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9B,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACtB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc;YAAE,OAAO,KAAK,CAAC;QAElC,gEAAgE;QAChE,+DAA+D;QAC/D,iBAAiB;QACjB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,QAAQ,KAAK,cAAc;gBAAE,SAAS;YAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,SAAS;YACnD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrC,IAAI,SAAS,GAAG,QAAQ,IAAI,SAAS,GAAG,MAAM;gBAAE,SAAS;YACzD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,kCAAkC;YAClC,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;gBAAE,SAAS;YACrD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzD,6DAA6D;YAC7D,IACE,SAAS,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ;gBACtC,SAAS,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,EACrC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -32895,6 +32895,44 @@ var CLOSE_METHODS = /* @__PURE__ */ new Set([
32895
32895
  "shutdownNow",
32896
32896
  "terminate"
32897
32897
  ]);
32898
+ var WRAPPER_CTORS = /* @__PURE__ */ new Set([
32899
+ // java.io wrappers
32900
+ "BufferedInputStream",
32901
+ "BufferedOutputStream",
32902
+ "BufferedReader",
32903
+ "BufferedWriter",
32904
+ "InputStreamReader",
32905
+ "OutputStreamWriter",
32906
+ "DataInputStream",
32907
+ "DataOutputStream",
32908
+ "PrintStream",
32909
+ "PrintWriter",
32910
+ "LineNumberReader",
32911
+ "PushbackInputStream",
32912
+ "PushbackReader",
32913
+ "SequenceInputStream",
32914
+ // java.util.zip wrappers
32915
+ "GZIPInputStream",
32916
+ "GZIPOutputStream",
32917
+ "ZipInputStream",
32918
+ "ZipOutputStream",
32919
+ "InflaterInputStream",
32920
+ "DeflaterOutputStream",
32921
+ "CheckedInputStream",
32922
+ "CheckedOutputStream"
32923
+ ]);
32924
+ var WORKER_METHODS = /* @__PURE__ */ new Set([
32925
+ "run",
32926
+ // Runnable, Thread
32927
+ "call",
32928
+ // Callable
32929
+ "accept",
32930
+ // Consumer
32931
+ "get",
32932
+ // Supplier
32933
+ "apply"
32934
+ // Function
32935
+ ]);
32898
32936
  var ResourceLeakPass = class {
32899
32937
  name = "resource-leak";
32900
32938
  category = "reliability";
@@ -32926,6 +32964,24 @@ var ResourceLeakPass = class {
32926
32964
  if (this.isFactoryMethod(methodInfo.method)) {
32927
32965
  continue;
32928
32966
  }
32967
+ if (this.isWrappedByCloseableCtor(
32968
+ graph.ir.calls,
32969
+ resourceVar,
32970
+ openLine,
32971
+ methodEnd
32972
+ )) {
32973
+ continue;
32974
+ }
32975
+ if (this.isClosedInNestedWorker(
32976
+ graph,
32977
+ codeLines,
32978
+ resourceVar,
32979
+ methodInfo,
32980
+ openLine,
32981
+ methodEnd
32982
+ )) {
32983
+ continue;
32984
+ }
32929
32985
  const closeCall = graph.ir.calls.find(
32930
32986
  (c) => CLOSE_METHODS.has(c.method_name) && c.receiver === resourceVar && c.location.line > openLine && c.location.line <= methodEnd
32931
32987
  );
@@ -33045,6 +33101,73 @@ var ResourceLeakPass = class {
33045
33101
  if (!method.return_type || method.return_type === "void") return false;
33046
33102
  return FACTORY_METHOD_NAME_RE.test(method.name);
33047
33103
  }
33104
+ /**
33105
+ * #226 — true if `variable` is passed as a constructor argument to a
33106
+ * known Closeable wrapper call within the enclosing method's line
33107
+ * range. Ownership of the inner stream transfers to the wrapper.
33108
+ *
33109
+ * The check is deliberately per-method: cross-method wrapping does
33110
+ * not apply because the inner reference has already escaped the
33111
+ * scope by then.
33112
+ */
33113
+ isWrappedByCloseableCtor(calls, variable, fromLine, toLine) {
33114
+ for (const call of calls) {
33115
+ if (!WRAPPER_CTORS.has(call.method_name)) continue;
33116
+ if (call.location.line < fromLine || call.location.line > toLine) continue;
33117
+ for (const arg of call.arguments) {
33118
+ if (arg.variable === variable) return true;
33119
+ }
33120
+ }
33121
+ return false;
33122
+ }
33123
+ /**
33124
+ * #227 — true if `variable` refers to a field of the enclosing class
33125
+ * that is closed inside a worker-literal method (Runnable#run,
33126
+ * Callable#call, Consumer#accept, ...) declared in the same enclosing
33127
+ * method. Ownership transfers to the executor thread.
33128
+ *
33129
+ * The heuristic is intentionally conservative: it requires both
33130
+ * (a) the resource variable to match a declared field name on the
33131
+ * enclosing class (so a stray local named `selector` cannot
33132
+ * accidentally opt in to the suppression), AND
33133
+ * (b) a `<field>.close()` (or CLOSE_METHODS) call to appear on a
33134
+ * line inside a method whose name is one of WORKER_METHODS and
33135
+ * whose start_line is strictly within the enclosing method's
33136
+ * body (nested literal indicator).
33137
+ */
33138
+ isClosedInNestedWorker(graph, lines, variable, methodInfo, fromLine, toLine) {
33139
+ const fieldNames = new Set(methodInfo.type.fields.map((f) => f.name));
33140
+ let candidateField = null;
33141
+ if (fieldNames.has(variable)) {
33142
+ candidateField = variable;
33143
+ } else {
33144
+ const thisAssignRe = new RegExp(
33145
+ `(?:\\bthis\\s*\\.\\s*)?(\\w+)\\s*=\\s*${escapeRegex2(variable)}\\b`
33146
+ );
33147
+ for (let l = fromLine; l <= toLine && l <= lines.length; l++) {
33148
+ const m = thisAssignRe.exec(lines[l - 1] ?? "");
33149
+ if (m && fieldNames.has(m[1])) {
33150
+ candidateField = m[1];
33151
+ break;
33152
+ }
33153
+ }
33154
+ }
33155
+ if (!candidateField) return false;
33156
+ for (const call of graph.ir.calls) {
33157
+ if (call.receiver !== candidateField) continue;
33158
+ if (!CLOSE_METHODS.has(call.method_name)) continue;
33159
+ const closeLine = call.location.line;
33160
+ if (closeLine < fromLine || closeLine > toLine) continue;
33161
+ const enclosing = graph.methodAtLine(closeLine);
33162
+ if (!enclosing) continue;
33163
+ if (enclosing.method === methodInfo.method) continue;
33164
+ if (!WORKER_METHODS.has(enclosing.method.name)) continue;
33165
+ if (enclosing.method.start_line > fromLine && enclosing.method.start_line <= toLine) {
33166
+ return true;
33167
+ }
33168
+ }
33169
+ return false;
33170
+ }
33048
33171
  };
33049
33172
 
33050
33173
  // src/graph/scope-graph.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "circle-ir",
3
- "version": "3.149.0",
3
+ "version": "3.150.0",
4
4
  "description": "High-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",