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.
Files changed (49) hide show
  1. package/dist/analysis/constant-propagation/index.d.ts +2 -0
  2. package/dist/analysis/constant-propagation/index.d.ts.map +1 -1
  3. package/dist/analysis/constant-propagation/index.js +10 -0
  4. package/dist/analysis/constant-propagation/index.js.map +1 -1
  5. package/dist/analysis/constant-propagation/propagator.d.ts +11 -0
  6. package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
  7. package/dist/analysis/constant-propagation/propagator.js +125 -20
  8. package/dist/analysis/constant-propagation/propagator.js.map +1 -1
  9. package/dist/analysis/constant-propagation/types.d.ts +2 -0
  10. package/dist/analysis/constant-propagation/types.d.ts.map +1 -1
  11. package/dist/analysis/constant-propagation.d.ts +1 -1
  12. package/dist/analysis/constant-propagation.d.ts.map +1 -1
  13. package/dist/analysis/constant-propagation.js +1 -1
  14. package/dist/analysis/constant-propagation.js.map +1 -1
  15. package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
  16. package/dist/analysis/passes/cross-file-pass.js +3 -1
  17. package/dist/analysis/passes/cross-file-pass.js.map +1 -1
  18. package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
  19. package/dist/analysis/passes/language-sources-pass.js +22 -0
  20. package/dist/analysis/passes/language-sources-pass.js.map +1 -1
  21. package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
  22. package/dist/analysis/passes/param-source-flow-gate-pass.js +17 -1
  23. package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
  24. package/dist/analysis/passes/taint-propagation-pass.d.ts.map +1 -1
  25. package/dist/analysis/passes/taint-propagation-pass.js +167 -11
  26. package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
  27. package/dist/analysis/rust-literal-guard.d.ts.map +1 -1
  28. package/dist/analysis/rust-literal-guard.js +100 -1
  29. package/dist/analysis/rust-literal-guard.js.map +1 -1
  30. package/dist/analysis/taint-matcher.d.ts.map +1 -1
  31. package/dist/analysis/taint-matcher.js +1 -0
  32. package/dist/analysis/taint-matcher.js.map +1 -1
  33. package/dist/browser/circle-ir.js +427 -26
  34. package/dist/core/circle-ir-core.cjs +149 -17
  35. package/dist/core/circle-ir-core.js +149 -17
  36. package/dist/core/extractors/types.js +53 -9
  37. package/dist/core/extractors/types.js.map +1 -1
  38. package/dist/navigation/navigation-index.d.ts +40 -1
  39. package/dist/navigation/navigation-index.d.ts.map +1 -1
  40. package/dist/navigation/navigation-index.js +300 -45
  41. package/dist/navigation/navigation-index.js.map +1 -1
  42. package/dist/resolution/cross-file.d.ts +9 -0
  43. package/dist/resolution/cross-file.d.ts.map +1 -1
  44. package/dist/resolution/cross-file.js +134 -0
  45. package/dist/resolution/cross-file.js.map +1 -1
  46. package/dist/types/index.d.ts +18 -0
  47. package/dist/types/index.d.ts.map +1 -1
  48. package/dist/types/index.js.map +1 -1
  49. 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":"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"}
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;IAC5C,oGAAoG;IACpG,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,eAAe,CAAkC;IACzD,6EAA6E;IAC7E,OAAO,CAAC,wBAAwB,CAAS;IAGzC,OAAO,CAAC,iBAAiB,CAAuC;IAEhE,OAAO,CAAC,cAAc,CAAgB;IAEtC,OAAO,CAAC,cAAc,CAAkC;IAExD,OAAO,CAAC,iBAAiB,CAA0B;IAEnD,OAAO,CAAC,mBAAmB,CAAkB;IAE7C,OAAO,CAAC,eAAe,CAAkC;IACzD,6FAA6F;IAC7F,OAAO,CAAC,uBAAuB,CAA0B;IAEzD,OAAO,CAAC,WAAW,CAA0B;IAE7C,OAAO,CAAC,qBAAqB,CAA0B;IAEvD,OAAO,CAAC,kBAAkB,CAA0C;IAEpE,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,OAAO,CAAC,aAAa,CAAkB;IAEvC,OAAO,CAAC,yBAAyB,CAAkC;IAInE,OAAO,CAAC,sBAAsB,CAA4B;IAc1D,OAAO,CAAC,wBAAwB,CAAqC;IAErE;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,uBAAuB,GAAE,MAAM,EAAO,EAAE,gBAAgB,GAAE,MAAM,EAAO,EAAE,iBAAiB,GAAE,gBAAgB,EAAO,GAAG,wBAAwB,CA4IrL;IAED;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,aAAa,CAE5C;IAED;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEnD;IAED;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElC;IAED;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErC;IAMD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkJ5B,OAAO,CAAC,mBAAmB;IAsD3B,OAAO,CAAC,qBAAqB;IAuD7B,kFAAkF;IAClF,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,+BAA+B;IAuCvC;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA6CpC;;;;;;;;;OASG;IACH;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iCAAiC;IAqBzC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,qBAAqB;IAa7B;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,yBAAyB;IAoCjC,OAAO,CAAC,aAAa;IAYrB,iEAAiE;IACjE,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,wBAAwB;IAsDhC,OAAO,CAAC,KAAK;IAmBb;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IA4GhB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAgF/B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAiBrB,4FAA4F;IAC5F,OAAO,CAAC,uBAAuB;IAoB/B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,mBAAmB;IA2F3B,OAAO,CAAC,wBAAwB;IAwBhC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA8B1B,gFAAgF;IAChF,OAAO,CAAC,mBAAmB;IAkB3B;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAanC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,yBAAyB;IAoEjC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IAqE1B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,gBAAgB;IAyGxB,OAAO,CAAC,4BAA4B;IASpC,8DAA8D;IAC9D,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,2BAA2B;IAkBnC,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,CAAC,iBAAiB;IA6HzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAkB9C;IAED,OAAO,CAAC,YAAY;IAqIpB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,iBAAiB;IAYzB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAuBxB,yFAAyF;IACzF,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;IAqBxB;;;;;OAKG;IACH;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAY5B,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAKzC;IAED;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAyBvB;;;;OAIG;IACH,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAYvC;IAED;;;OAGG;IACH,8BAA8B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CA+BlD;IAED;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAiB/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAe/B,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAwBvC;IAED,OAAO,CAAC,uBAAuB;IAsC/B,OAAO,CAAC,uBAAuB;IA6W/B,qFAAqF;IACrF,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,oBAAoB;CAkN7B"}
@@ -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
- // Scope local variables by method name
1117
+ const blockId = this.blockScopeStack.length > 0
1118
+ ? this.blockScopeStack[this.blockScopeStack.length - 1]
1119
+ : undefined;
1069
1120
  if (this.currentMethod) {
1070
- return `${this.currentMethod}:${varName}`;
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
- // First try the scoped name (local variable in current method)
1081
- if (this.currentMethod && !varName.includes('.') && !varName.includes(':')) {
1082
- const scopedName = `${this.currentMethod}:${varName}`;
1083
- const scopedValue = this.symbols.get(scopedName);
1084
- if (scopedValue) {
1085
- return scopedValue;
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
- // Visit all children (condition, body, etc.)
1156
- for (const child of node.children) {
1157
- this.visit(child);
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
- // Check both scoped and unscoped taint
2624
- // Scoped: methodName:varName (for local variables)
2625
- // Unscoped: varName (for class fields or when not in a method)
2626
- const scopedName = this.currentMethod ? `${this.currentMethod}:${text}` : text;
2627
- const isTainted = this.tainted.has(scopedName) || this.tainted.has(text);
2628
- if (isTainted) {
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(scopedName) || this.isExcludedByCondition(text)) {
2737
+ if (this.isExcludedByCondition(boundName) || this.isExcludedByCondition(text)) {
2633
2738
  return false;
2634
2739
  }
2635
2740
  }