circle-ir 4.16.1 → 4.17.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/constant-propagation/index.d.ts +2 -0
- package/dist/analysis/constant-propagation/index.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/index.js +10 -0
- package/dist/analysis/constant-propagation/index.js.map +1 -1
- package/dist/analysis/constant-propagation/propagator.d.ts +11 -0
- package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/propagator.js +125 -20
- package/dist/analysis/constant-propagation/propagator.js.map +1 -1
- package/dist/analysis/constant-propagation/types.d.ts +2 -0
- package/dist/analysis/constant-propagation/types.d.ts.map +1 -1
- package/dist/analysis/constant-propagation.d.ts +1 -1
- package/dist/analysis/constant-propagation.d.ts.map +1 -1
- package/dist/analysis/constant-propagation.js +1 -1
- package/dist/analysis/constant-propagation.js.map +1 -1
- package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
- package/dist/analysis/passes/cross-file-pass.js +3 -1
- package/dist/analysis/passes/cross-file-pass.js.map +1 -1
- package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
- package/dist/analysis/passes/language-sources-pass.js +22 -0
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.js +17 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
- package/dist/analysis/passes/taint-propagation-pass.d.ts.map +1 -1
- package/dist/analysis/passes/taint-propagation-pass.js +167 -11
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
- package/dist/analysis/rust-literal-guard.d.ts.map +1 -1
- package/dist/analysis/rust-literal-guard.js +100 -1
- package/dist/analysis/rust-literal-guard.js.map +1 -1
- package/dist/analysis/taint-matcher.d.ts.map +1 -1
- package/dist/analysis/taint-matcher.js +1 -0
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/browser/circle-ir.js +427 -26
- package/dist/core/circle-ir-core.cjs +149 -17
- package/dist/core/circle-ir-core.js +149 -17
- package/dist/core/extractors/types.js +53 -9
- package/dist/core/extractors/types.js.map +1 -1
- package/dist/navigation/navigation-index.d.ts +40 -1
- package/dist/navigation/navigation-index.d.ts.map +1 -1
- package/dist/navigation/navigation-index.js +300 -45
- package/dist/navigation/navigation-index.js.map +1 -1
- package/dist/resolution/cross-file.d.ts +9 -0
- package/dist/resolution/cross-file.d.ts.map +1 -1
- package/dist/resolution/cross-file.js +134 -0
- package/dist/resolution/cross-file.js.map +1 -1
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -30,6 +30,8 @@ export declare function analyzeConstantPropagation(tree: Tree, sourceCode: strin
|
|
|
30
30
|
* @param taintedVar - Name of the potentially tainted variable
|
|
31
31
|
* @returns Object indicating if it's a false positive and the reason
|
|
32
32
|
*/
|
|
33
|
+
/** Const-prop variable key for a use at `line` (block-scoped locals when recorded). */
|
|
34
|
+
export declare function constPropScopedVar(method: string | null | undefined, varName: string, line: number, result: ConstantPropagatorResult): string;
|
|
33
35
|
export declare function isFalsePositive(result: ConstantPropagatorResult, sinkLine: number, taintedVar: string): {
|
|
34
36
|
isFalsePositive: boolean;
|
|
35
37
|
reason: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAIvF,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGtI,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlG,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAG3G,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,0BAA+B,GACvC,wBAAwB,CAS1B;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,wBAAwB,EAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB;IAAE,eAAe,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA8CrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,wBAAwB,EAChC,IAAI,EAAE;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC1G,OAAO,CA2CT"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAIvF,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGtI,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlG,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAG3G,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,0BAA+B,GACvC,wBAAwB,CAS1B;AAED;;;;;;;GAOG;AACH,uFAAuF;AACvF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,wBAAwB,GAC/B,MAAM,CAOR;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,wBAAwB,EAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB;IAAE,eAAe,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA8CrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,wBAAwB,EAChC,IAAI,EAAE;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC1G,OAAO,CA2CT"}
|
|
@@ -34,6 +34,16 @@ export function analyzeConstantPropagation(tree, sourceCode, options = {}) {
|
|
|
34
34
|
* @param taintedVar - Name of the potentially tainted variable
|
|
35
35
|
* @returns Object indicating if it's a false positive and the reason
|
|
36
36
|
*/
|
|
37
|
+
/** Const-prop variable key for a use at `line` (block-scoped locals when recorded). */
|
|
38
|
+
export function constPropScopedVar(method, varName, line, result) {
|
|
39
|
+
if (!method)
|
|
40
|
+
return varName;
|
|
41
|
+
const blockId = result.lineBlockScopes?.get(line);
|
|
42
|
+
if (blockId !== undefined) {
|
|
43
|
+
return `${method}:b${blockId}:${varName}`;
|
|
44
|
+
}
|
|
45
|
+
return `${method}:${varName}`;
|
|
46
|
+
}
|
|
37
47
|
export function isFalsePositive(result, sinkLine, taintedVar) {
|
|
38
48
|
// Reason 1: Sink is in dead code
|
|
39
49
|
if (result.unreachableLines.has(sinkLine)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,12 +49,19 @@ export declare class ConstantPropagator {
|
|
|
49
49
|
private loopVariables;
|
|
50
50
|
private taintedArrayElements;
|
|
51
51
|
private currentMethod;
|
|
52
|
+
/** Start lines of nested `{ ... }` blocks — disambiguate same-named locals (#476 Collections10). */
|
|
53
|
+
private blockScopeStack;
|
|
54
|
+
private lineBlockScopes;
|
|
55
|
+
/** Skip block-scope push on the method/constructor body `{ ... }` (#476). */
|
|
56
|
+
private skipMethodBodyBlockScope;
|
|
52
57
|
private conditionalTaints;
|
|
53
58
|
private conditionStack;
|
|
54
59
|
private lineConditions;
|
|
55
60
|
private synchronizedLines;
|
|
56
61
|
private inSynchronizedBlock;
|
|
57
62
|
private iteratorSources;
|
|
63
|
+
/** Vars assigned from `iter.next()` — do not retro-clear on later iterator rebind (#476). */
|
|
64
|
+
private taintedFromIteratorNext;
|
|
58
65
|
private classFields;
|
|
59
66
|
private taintedParametersList;
|
|
60
67
|
private instanceFieldTaint;
|
|
@@ -152,6 +159,8 @@ export declare class ConstantPropagator {
|
|
|
152
159
|
private consequenceContainsThrow;
|
|
153
160
|
private seedPythonModuleConstants;
|
|
154
161
|
private getMethodName;
|
|
162
|
+
/** True when `node` is `iter.next()` (possibly under a cast). */
|
|
163
|
+
private isIteratorNextExpression;
|
|
155
164
|
private refineTaintFromConstants;
|
|
156
165
|
private visit;
|
|
157
166
|
/**
|
|
@@ -170,6 +179,8 @@ export declare class ConstantPropagator {
|
|
|
170
179
|
* This ensures local variables from different methods don't conflict.
|
|
171
180
|
*/
|
|
172
181
|
private getScopedName;
|
|
182
|
+
/** Innermost block → method → unscoped, for reads that may bind to an outer declaration. */
|
|
183
|
+
private getScopedNameCandidates;
|
|
173
184
|
/**
|
|
174
185
|
* Look up a variable value, checking both scoped and unscoped names.
|
|
175
186
|
* This handles cases where we need to find a variable that might be
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propagator.d.ts","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/propagator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAC;AAS5G;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,kBAAkB,CAAuC;IAEjE,OAAO,CAAC,aAAa,CAA0B;IAC/C,gGAAgG;IAChG,OAAO,CAAC,qBAAqB,CAA+C;IAC5E,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAuB;IAGxC,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,mBAAmB,CAAkB;IAE7C,OAAO,CAAC,qBAAqB,CAA0B;IAEvD,OAAO,CAAC,sBAAsB,CAA0B;IACxD,6FAA6F;IAC7F,OAAO,CAAC,kBAAkB,CAA0B;IACpD;;;;OAIG;IACH,OAAO,CAAC,4BAA4B,CAA0B;IAC9D,OAAO,CAAC,wBAAwB,CAA0B;IAE1D,OAAO,CAAC,sBAAsB,CAAkC;IAEhE,OAAO,CAAC,sBAAsB,CAA0B;IACxD,sGAAsG;IACtG,OAAO,CAAC,aAAa,CAA0B;IAC/C,oGAAoG;IACpG,OAAO,CAAC,aAAa,CAA0B;IAE/C,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,OAAO,CAAC,YAAY,CAA6C;IAEjE,OAAO,CAAC,aAAa,CAA0B;IAE/C,OAAO,CAAC,oBAAoB,CAAuC;IAEnE,OAAO,CAAC,aAAa,CAAuB;
|
|
1
|
+
{"version":3,"file":"propagator.d.ts","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/propagator.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,11 @@ export class ConstantPropagator {
|
|
|
63
63
|
taintedArrayElements = new Map();
|
|
64
64
|
// Track current method name for scoping local variables
|
|
65
65
|
currentMethod = null;
|
|
66
|
+
/** Start lines of nested `{ ... }` blocks — disambiguate same-named locals (#476 Collections10). */
|
|
67
|
+
blockScopeStack = [];
|
|
68
|
+
lineBlockScopes = new Map();
|
|
69
|
+
/** Skip block-scope push on the method/constructor body `{ ... }` (#476). */
|
|
70
|
+
skipMethodBodyBlockScope = false;
|
|
66
71
|
// Track conditional taints: which variables were tainted under which conditions
|
|
67
72
|
// Maps condition expression string → set of variables tainted under that condition
|
|
68
73
|
conditionalTaints = new Map();
|
|
@@ -76,6 +81,8 @@ export class ConstantPropagator {
|
|
|
76
81
|
inSynchronizedBlock = false;
|
|
77
82
|
// Track iterator sources: iterator variable name → collection name it was created from
|
|
78
83
|
iteratorSources = new Map();
|
|
84
|
+
/** Vars assigned from `iter.next()` — do not retro-clear on later iterator rebind (#476). */
|
|
85
|
+
taintedFromIteratorNext = new Set();
|
|
79
86
|
// Track class field names (declared at class level, not local variables)
|
|
80
87
|
classFields = new Set();
|
|
81
88
|
// Track tainted method parameters for inter-procedural analysis
|
|
@@ -133,12 +140,16 @@ export class ConstantPropagator {
|
|
|
133
140
|
this.sanitizedVars.clear();
|
|
134
141
|
this.sanitizedVarUncovered.clear();
|
|
135
142
|
this.currentMethod = null;
|
|
143
|
+
this.blockScopeStack = [];
|
|
144
|
+
this.lineBlockScopes.clear();
|
|
145
|
+
this.skipMethodBodyBlockScope = false;
|
|
136
146
|
this.conditionalTaints.clear();
|
|
137
147
|
this.conditionStack = [];
|
|
138
148
|
this.lineConditions.clear();
|
|
139
149
|
this.synchronizedLines.clear();
|
|
140
150
|
this.inSynchronizedBlock = false;
|
|
141
151
|
this.iteratorSources.clear();
|
|
152
|
+
this.taintedFromIteratorNext.clear();
|
|
142
153
|
this.classFields.clear();
|
|
143
154
|
this.instanceFieldTaint.clear();
|
|
144
155
|
this.currentClassName = null;
|
|
@@ -180,6 +191,9 @@ export class ConstantPropagator {
|
|
|
180
191
|
// Add unscoped versions of scoped names for backward compatibility
|
|
181
192
|
for (const name of this.tainted) {
|
|
182
193
|
if (name.includes(':')) {
|
|
194
|
+
if (/^[^:]+:b\d+:/.test(name)) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
183
197
|
const unscoped = name.substring(name.indexOf(':') + 1);
|
|
184
198
|
resultTainted.add(unscoped);
|
|
185
199
|
}
|
|
@@ -204,6 +218,9 @@ export class ConstantPropagator {
|
|
|
204
218
|
if (this.goScopedNames.has(name))
|
|
205
219
|
continue;
|
|
206
220
|
if (name.includes(':')) {
|
|
221
|
+
if (/^[^:]+:b\d+:/.test(name)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
207
224
|
const unscoped = name.substring(name.indexOf(':') + 1);
|
|
208
225
|
// Only add if not already present (scoped version wins on conflict)
|
|
209
226
|
if (!resultSymbols.has(unscoped)) {
|
|
@@ -214,6 +231,7 @@ export class ConstantPropagator {
|
|
|
214
231
|
return {
|
|
215
232
|
symbols: resultSymbols,
|
|
216
233
|
tainted: resultTainted,
|
|
234
|
+
lineBlockScopes: new Map(this.lineBlockScopes),
|
|
217
235
|
unreachableLines: new Set(this.unreachableLines),
|
|
218
236
|
taintedCollections: new Map(this.taintedCollections),
|
|
219
237
|
taintedArrayElements: new Map(this.taintedArrayElements),
|
|
@@ -840,6 +858,20 @@ export class ConstantPropagator {
|
|
|
840
858
|
// ===========================================================================
|
|
841
859
|
// Taint Refinement
|
|
842
860
|
// ===========================================================================
|
|
861
|
+
/** True when `node` is `iter.next()` (possibly under a cast). */
|
|
862
|
+
isIteratorNextExpression(node) {
|
|
863
|
+
const text = getNodeText(node, this.source);
|
|
864
|
+
if (/\.\s*next\s*\(/.test(text))
|
|
865
|
+
return true;
|
|
866
|
+
let current = node;
|
|
867
|
+
if (current.type === 'cast_expression' || current.type === 'parenthesized_expression') {
|
|
868
|
+
current = current.childForFieldName('operand') ?? current.childForFieldName('expression');
|
|
869
|
+
}
|
|
870
|
+
if (!current || current.type !== 'method_invocation')
|
|
871
|
+
return false;
|
|
872
|
+
const nameNode = current.childForFieldName('name');
|
|
873
|
+
return nameNode ? getNodeText(nameNode, this.source) === 'next' : false;
|
|
874
|
+
}
|
|
843
875
|
refineTaintFromConstants() {
|
|
844
876
|
let changed = true;
|
|
845
877
|
let iterations = 0;
|
|
@@ -849,6 +881,9 @@ export class ConstantPropagator {
|
|
|
849
881
|
iterations++;
|
|
850
882
|
const toRemove = [];
|
|
851
883
|
for (const varName of this.tainted) {
|
|
884
|
+
if (this.taintedFromIteratorNext.has(varName)) {
|
|
885
|
+
continue;
|
|
886
|
+
}
|
|
852
887
|
const symbol = this.symbols.get(varName);
|
|
853
888
|
if (symbol && symbol.type !== 'unknown') {
|
|
854
889
|
toRemove.push(varName);
|
|
@@ -909,6 +944,9 @@ export class ConstantPropagator {
|
|
|
909
944
|
if (this.unreachableLines.has(line)) {
|
|
910
945
|
return true; // skip subtree
|
|
911
946
|
}
|
|
947
|
+
if (this.blockScopeStack.length > 0) {
|
|
948
|
+
this.lineBlockScopes.set(line, this.blockScopeStack[this.blockScopeStack.length - 1]);
|
|
949
|
+
}
|
|
912
950
|
// Track which condition this line is under for correlated predicate analysis
|
|
913
951
|
if (this.conditionStack.length > 0 && !this.lineConditions.has(line)) {
|
|
914
952
|
// Use the innermost (most recent) condition
|
|
@@ -954,6 +992,15 @@ export class ConstantPropagator {
|
|
|
954
992
|
case 'if_statement':
|
|
955
993
|
this.handleIfStatement(node);
|
|
956
994
|
return true;
|
|
995
|
+
case 'block': {
|
|
996
|
+
if (this.skipMethodBodyBlockScope) {
|
|
997
|
+
this.skipMethodBodyBlockScope = false;
|
|
998
|
+
}
|
|
999
|
+
for (const child of node.children) {
|
|
1000
|
+
this.visit(child);
|
|
1001
|
+
}
|
|
1002
|
+
return true;
|
|
1003
|
+
}
|
|
957
1004
|
case 'switch_expression':
|
|
958
1005
|
case 'switch_statement':
|
|
959
1006
|
this.handleSwitch(node);
|
|
@@ -1046,10 +1093,12 @@ export class ConstantPropagator {
|
|
|
1046
1093
|
}
|
|
1047
1094
|
}
|
|
1048
1095
|
}
|
|
1049
|
-
// Visit the method body
|
|
1096
|
+
// Visit the method body (do not treat the outer `{ ... }` as a nested block scope)
|
|
1050
1097
|
const body = node.childForFieldName('body');
|
|
1051
1098
|
if (body) {
|
|
1099
|
+
this.skipMethodBodyBlockScope = true;
|
|
1052
1100
|
this.visit(body);
|
|
1101
|
+
this.skipMethodBodyBlockScope = false;
|
|
1053
1102
|
}
|
|
1054
1103
|
// Restore the previous method context
|
|
1055
1104
|
this.currentMethod = prevMethod;
|
|
@@ -1065,11 +1114,36 @@ export class ConstantPropagator {
|
|
|
1065
1114
|
if (varName.includes('.') || varName.includes(':')) {
|
|
1066
1115
|
return varName;
|
|
1067
1116
|
}
|
|
1068
|
-
|
|
1117
|
+
const blockId = this.blockScopeStack.length > 0
|
|
1118
|
+
? this.blockScopeStack[this.blockScopeStack.length - 1]
|
|
1119
|
+
: undefined;
|
|
1069
1120
|
if (this.currentMethod) {
|
|
1070
|
-
return
|
|
1121
|
+
return blockId !== undefined
|
|
1122
|
+
? `${this.currentMethod}:b${blockId}:${varName}`
|
|
1123
|
+
: `${this.currentMethod}:${varName}`;
|
|
1071
1124
|
}
|
|
1072
|
-
return varName;
|
|
1125
|
+
return blockId !== undefined ? `b${blockId}:${varName}` : varName;
|
|
1126
|
+
}
|
|
1127
|
+
/** Innermost block → method → unscoped, for reads that may bind to an outer declaration. */
|
|
1128
|
+
getScopedNameCandidates(varName) {
|
|
1129
|
+
if (varName.includes('.') || varName.includes(':')) {
|
|
1130
|
+
return [varName];
|
|
1131
|
+
}
|
|
1132
|
+
const out = [];
|
|
1133
|
+
for (let i = this.blockScopeStack.length - 1; i >= 0; i--) {
|
|
1134
|
+
const blockId = this.blockScopeStack[i];
|
|
1135
|
+
if (this.currentMethod) {
|
|
1136
|
+
out.push(`${this.currentMethod}:b${blockId}:${varName}`);
|
|
1137
|
+
}
|
|
1138
|
+
else {
|
|
1139
|
+
out.push(`b${blockId}:${varName}`);
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
if (this.currentMethod) {
|
|
1143
|
+
out.push(`${this.currentMethod}:${varName}`);
|
|
1144
|
+
}
|
|
1145
|
+
out.push(varName);
|
|
1146
|
+
return out;
|
|
1073
1147
|
}
|
|
1074
1148
|
/**
|
|
1075
1149
|
* Look up a variable value, checking both scoped and unscoped names.
|
|
@@ -1077,12 +1151,12 @@ export class ConstantPropagator {
|
|
|
1077
1151
|
* either local (scoped) or global (unscoped, like class fields).
|
|
1078
1152
|
*/
|
|
1079
1153
|
lookupSymbol(varName) {
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1154
|
+
if (!varName.includes('.') && !varName.includes(':')) {
|
|
1155
|
+
for (const scopedName of this.getScopedNameCandidates(varName)) {
|
|
1156
|
+
const scopedValue = this.symbols.get(scopedName);
|
|
1157
|
+
if (scopedValue) {
|
|
1158
|
+
return scopedValue;
|
|
1159
|
+
}
|
|
1086
1160
|
}
|
|
1087
1161
|
}
|
|
1088
1162
|
// Fall back to unscoped name (class fields, etc.)
|
|
@@ -1152,9 +1226,26 @@ export class ConstantPropagator {
|
|
|
1152
1226
|
this.trackIteratorsInNode(initNode);
|
|
1153
1227
|
}
|
|
1154
1228
|
}
|
|
1155
|
-
//
|
|
1156
|
-
|
|
1157
|
-
|
|
1229
|
+
// #476: shadowing loop locals (`String str` per while) — scope the body block only.
|
|
1230
|
+
if (node.type === 'while_statement' || node.type === 'do_statement') {
|
|
1231
|
+
const body = node.childForFieldName('body');
|
|
1232
|
+
for (const child of node.children) {
|
|
1233
|
+
if (child !== body)
|
|
1234
|
+
this.visit(child);
|
|
1235
|
+
}
|
|
1236
|
+
if (body?.type === 'block') {
|
|
1237
|
+
this.blockScopeStack.push(getNodeLine(body));
|
|
1238
|
+
this.visit(body);
|
|
1239
|
+
this.blockScopeStack.pop();
|
|
1240
|
+
}
|
|
1241
|
+
else if (body) {
|
|
1242
|
+
this.visit(body);
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
else {
|
|
1246
|
+
for (const child of node.children) {
|
|
1247
|
+
this.visit(child);
|
|
1248
|
+
}
|
|
1158
1249
|
}
|
|
1159
1250
|
// After visiting children, ensure loop variables stay unknown (they may have been overwritten)
|
|
1160
1251
|
for (const varName of loopVarNames) {
|
|
@@ -1318,6 +1409,10 @@ export class ConstantPropagator {
|
|
|
1318
1409
|
this.sanitizedVars.delete(scopedName); // No longer sanitized if receiving tainted value
|
|
1319
1410
|
this.sanitizedVarUncovered.delete(scopedName);
|
|
1320
1411
|
this.definitionNodes.set(scopedName, valueNode);
|
|
1412
|
+
if (this.isIteratorNextExpression(valueNode)) {
|
|
1413
|
+
this.taintedFromIteratorNext.add(scopedName);
|
|
1414
|
+
this.taintedFromIteratorNext.add(varName);
|
|
1415
|
+
}
|
|
1321
1416
|
this.symbols.set(scopedName, createUnknown(line));
|
|
1322
1417
|
}
|
|
1323
1418
|
else {
|
|
@@ -1477,6 +1572,12 @@ export class ConstantPropagator {
|
|
|
1477
1572
|
this.sanitizedVars.delete(scopedName); // No longer sanitized if receiving tainted value
|
|
1478
1573
|
this.sanitizedVarUncovered.delete(scopedName);
|
|
1479
1574
|
this.definitionNodes.set(scopedName, right);
|
|
1575
|
+
if (this.isIteratorNextExpression(right)) {
|
|
1576
|
+
this.taintedFromIteratorNext.add(scopedName);
|
|
1577
|
+
if (!varName.includes('.')) {
|
|
1578
|
+
this.taintedFromIteratorNext.add(varName);
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1480
1581
|
this.symbols.set(scopedName, createUnknown(line));
|
|
1481
1582
|
// Track constructor field assignments: this.field = taintedParam
|
|
1482
1583
|
if (this.inConstructor && varName.startsWith('this.')) {
|
|
@@ -2620,16 +2721,20 @@ export class ConstantPropagator {
|
|
|
2620
2721
|
}
|
|
2621
2722
|
}
|
|
2622
2723
|
if (node.type === 'identifier') {
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2724
|
+
let isTainted = false;
|
|
2725
|
+
let boundName = null;
|
|
2726
|
+
for (const candidate of this.getScopedNameCandidates(text)) {
|
|
2727
|
+
if (this.tainted.has(candidate)) {
|
|
2728
|
+
isTainted = true;
|
|
2729
|
+
boundName = candidate;
|
|
2730
|
+
break;
|
|
2731
|
+
}
|
|
2732
|
+
}
|
|
2733
|
+
if (isTainted && boundName) {
|
|
2629
2734
|
// Check if this taint is excluded by correlated predicate analysis
|
|
2630
2735
|
// If the variable was tainted under condition C, and we're now under !C,
|
|
2631
2736
|
// the taint doesn't apply in this context
|
|
2632
|
-
if (this.isExcludedByCondition(
|
|
2737
|
+
if (this.isExcludedByCondition(boundName) || this.isExcludedByCondition(text)) {
|
|
2633
2738
|
return false;
|
|
2634
2739
|
}
|
|
2635
2740
|
}
|