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.
- package/dist/analysis/passes/resource-leak-pass.d.ts +26 -0
- package/dist/analysis/passes/resource-leak-pass.d.ts.map +1 -1
- package/dist/analysis/passes/resource-leak-pass.js +138 -0
- package/dist/analysis/passes/resource-leak-pass.js.map +1 -1
- package/dist/browser/circle-ir.js +123 -0
- package/package.json +1 -1
|
@@ -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;
|
|
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":"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"}
|
|
@@ -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.
|
|
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",
|