circle-ir 4.16.1 → 4.18.1

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 (295) hide show
  1. package/dist/analysis/advisories.d.ts +186 -0
  2. package/dist/analysis/advisories.d.ts.map +1 -0
  3. package/dist/analysis/advisories.js +391 -0
  4. package/dist/analysis/advisories.js.map +1 -0
  5. package/dist/analysis/comment-lines.d.ts +14 -0
  6. package/dist/analysis/comment-lines.d.ts.map +1 -0
  7. package/dist/analysis/comment-lines.js +34 -0
  8. package/dist/analysis/comment-lines.js.map +1 -0
  9. package/dist/analysis/config-loader.d.ts.map +1 -1
  10. package/dist/analysis/config-loader.js +59 -5
  11. package/dist/analysis/config-loader.js.map +1 -1
  12. package/dist/analysis/constant-caller-gate.d.ts +2 -2
  13. package/dist/analysis/constant-caller-gate.d.ts.map +1 -1
  14. package/dist/analysis/constant-caller-gate.js +205 -29
  15. package/dist/analysis/constant-caller-gate.js.map +1 -1
  16. package/dist/analysis/constant-propagation/index.d.ts +2 -0
  17. package/dist/analysis/constant-propagation/index.d.ts.map +1 -1
  18. package/dist/analysis/constant-propagation/index.js +10 -0
  19. package/dist/analysis/constant-propagation/index.js.map +1 -1
  20. package/dist/analysis/constant-propagation/propagator.d.ts +15 -0
  21. package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
  22. package/dist/analysis/constant-propagation/propagator.js +224 -20
  23. package/dist/analysis/constant-propagation/propagator.js.map +1 -1
  24. package/dist/analysis/constant-propagation/types.d.ts +2 -0
  25. package/dist/analysis/constant-propagation/types.d.ts.map +1 -1
  26. package/dist/analysis/constant-propagation.d.ts +1 -1
  27. package/dist/analysis/constant-propagation.d.ts.map +1 -1
  28. package/dist/analysis/constant-propagation.js +1 -1
  29. package/dist/analysis/constant-propagation.js.map +1 -1
  30. package/dist/analysis/entry-point-detection.d.ts.map +1 -1
  31. package/dist/analysis/entry-point-detection.js +72 -0
  32. package/dist/analysis/entry-point-detection.js.map +1 -1
  33. package/dist/analysis/interprocedural.d.ts.map +1 -1
  34. package/dist/analysis/interprocedural.js +75 -8
  35. package/dist/analysis/interprocedural.js.map +1 -1
  36. package/dist/analysis/maven-declared.d.ts +72 -0
  37. package/dist/analysis/maven-declared.d.ts.map +1 -0
  38. package/dist/analysis/maven-declared.js +216 -0
  39. package/dist/analysis/maven-declared.js.map +1 -0
  40. package/dist/analysis/maven-version.d.ts +28 -0
  41. package/dist/analysis/maven-version.d.ts.map +1 -0
  42. package/dist/analysis/maven-version.js +172 -0
  43. package/dist/analysis/maven-version.js.map +1 -0
  44. package/dist/analysis/passes/constant-propagation-pass.d.ts.map +1 -1
  45. package/dist/analysis/passes/constant-propagation-pass.js +29 -1
  46. package/dist/analysis/passes/constant-propagation-pass.js.map +1 -1
  47. package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
  48. package/dist/analysis/passes/cross-file-pass.js +84 -2
  49. package/dist/analysis/passes/cross-file-pass.js.map +1 -1
  50. package/dist/analysis/passes/csharp-sanitizer-credit.d.ts +7 -0
  51. package/dist/analysis/passes/csharp-sanitizer-credit.d.ts.map +1 -1
  52. package/dist/analysis/passes/csharp-sanitizer-credit.js +44 -1
  53. package/dist/analysis/passes/csharp-sanitizer-credit.js.map +1 -1
  54. package/dist/analysis/passes/insecure-cookie-pass.d.ts +2 -0
  55. package/dist/analysis/passes/insecure-cookie-pass.d.ts.map +1 -1
  56. package/dist/analysis/passes/insecure-cookie-pass.js +25 -3
  57. package/dist/analysis/passes/insecure-cookie-pass.js.map +1 -1
  58. package/dist/analysis/passes/interprocedural-pass.d.ts +11 -14
  59. package/dist/analysis/passes/interprocedural-pass.d.ts.map +1 -1
  60. package/dist/analysis/passes/interprocedural-pass.js +562 -0
  61. package/dist/analysis/passes/interprocedural-pass.js.map +1 -1
  62. package/dist/analysis/passes/language-sources-pass.d.ts +18 -1
  63. package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
  64. package/dist/analysis/passes/language-sources-pass.js +1079 -14
  65. package/dist/analysis/passes/language-sources-pass.js.map +1 -1
  66. package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
  67. package/dist/analysis/passes/param-source-flow-gate-pass.js +82 -3
  68. package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
  69. package/dist/analysis/passes/sink-filter-pass.d.ts +44 -2
  70. package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
  71. package/dist/analysis/passes/sink-filter-pass.js +690 -12
  72. package/dist/analysis/passes/sink-filter-pass.js.map +1 -1
  73. package/dist/analysis/passes/taint-propagation-pass.d.ts.map +1 -1
  74. package/dist/analysis/passes/taint-propagation-pass.js +298 -19
  75. package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
  76. package/dist/analysis/passes/tls-verify-disabled-pass.d.ts +18 -0
  77. package/dist/analysis/passes/tls-verify-disabled-pass.d.ts.map +1 -1
  78. package/dist/analysis/passes/tls-verify-disabled-pass.js +161 -0
  79. package/dist/analysis/passes/tls-verify-disabled-pass.js.map +1 -1
  80. package/dist/analysis/passes/weak-random-pass.d.ts +6 -0
  81. package/dist/analysis/passes/weak-random-pass.d.ts.map +1 -1
  82. package/dist/analysis/passes/weak-random-pass.js +29 -0
  83. package/dist/analysis/passes/weak-random-pass.js.map +1 -1
  84. package/dist/analysis/promote-cross-file-flows.d.ts +17 -0
  85. package/dist/analysis/promote-cross-file-flows.d.ts.map +1 -0
  86. package/dist/analysis/promote-cross-file-flows.js +32 -0
  87. package/dist/analysis/promote-cross-file-flows.js.map +1 -0
  88. package/dist/analysis/rust-literal-guard.d.ts.map +1 -1
  89. package/dist/analysis/rust-literal-guard.js +100 -1
  90. package/dist/analysis/rust-literal-guard.js.map +1 -1
  91. package/dist/analysis/sbom.d.ts +100 -0
  92. package/dist/analysis/sbom.d.ts.map +1 -1
  93. package/dist/analysis/sbom.js +514 -3
  94. package/dist/analysis/sbom.js.map +1 -1
  95. package/dist/analysis/semver-version.d.ts +30 -0
  96. package/dist/analysis/semver-version.d.ts.map +1 -0
  97. package/dist/analysis/semver-version.js +76 -0
  98. package/dist/analysis/semver-version.js.map +1 -0
  99. package/dist/analysis/taint-matcher.d.ts +5 -0
  100. package/dist/analysis/taint-matcher.d.ts.map +1 -1
  101. package/dist/analysis/taint-matcher.js +226 -4
  102. package/dist/analysis/taint-matcher.js.map +1 -1
  103. package/dist/analyzer.d.ts +57 -0
  104. package/dist/analyzer.d.ts.map +1 -1
  105. package/dist/analyzer.js +69 -6
  106. package/dist/analyzer.js.map +1 -1
  107. package/dist/browser/circle-ir.js +3360 -314
  108. package/dist/core/circle-ir-core.cjs +783 -220
  109. package/dist/core/circle-ir-core.js +783 -220
  110. package/dist/core/extractors/dfg.js +205 -2
  111. package/dist/core/extractors/dfg.js.map +1 -1
  112. package/dist/core/extractors/ts-declaration-detail.d.ts +39 -0
  113. package/dist/core/extractors/ts-declaration-detail.d.ts.map +1 -0
  114. package/dist/core/extractors/ts-declaration-detail.js +266 -0
  115. package/dist/core/extractors/ts-declaration-detail.js.map +1 -0
  116. package/dist/core/extractors/types.js +53 -9
  117. package/dist/core/extractors/types.js.map +1 -1
  118. package/dist/graph/analysis-pass.d.ts +4 -1
  119. package/dist/graph/analysis-pass.d.ts.map +1 -1
  120. package/dist/graph/analysis-pass.js +4 -1
  121. package/dist/graph/analysis-pass.js.map +1 -1
  122. package/dist/graph-facts/dead-code.d.ts +62 -0
  123. package/dist/graph-facts/dead-code.d.ts.map +1 -0
  124. package/dist/graph-facts/dead-code.js +90 -0
  125. package/dist/graph-facts/dead-code.js.map +1 -0
  126. package/dist/graph-facts/dependency-calls.d.ts +86 -0
  127. package/dist/graph-facts/dependency-calls.d.ts.map +1 -0
  128. package/dist/graph-facts/dependency-calls.js +93 -0
  129. package/dist/graph-facts/dependency-calls.js.map +1 -0
  130. package/dist/graph-facts/index.d.ts +10 -0
  131. package/dist/graph-facts/index.d.ts.map +1 -0
  132. package/dist/graph-facts/index.js +10 -0
  133. package/dist/graph-facts/index.js.map +1 -0
  134. package/dist/graph-facts/maven-packages.d.ts +42 -0
  135. package/dist/graph-facts/maven-packages.d.ts.map +1 -0
  136. package/dist/graph-facts/maven-packages.js +133 -0
  137. package/dist/graph-facts/maven-packages.js.map +1 -0
  138. package/dist/graph-facts/reach.d.ts +203 -0
  139. package/dist/graph-facts/reach.d.ts.map +1 -0
  140. package/dist/graph-facts/reach.js +219 -0
  141. package/dist/graph-facts/reach.js.map +1 -0
  142. package/dist/graph-facts/removal-reach.d.ts +73 -0
  143. package/dist/graph-facts/removal-reach.d.ts.map +1 -0
  144. package/dist/graph-facts/removal-reach.js +64 -0
  145. package/dist/graph-facts/removal-reach.js.map +1 -0
  146. package/dist/index.d.ts +21 -6
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +20 -3
  149. package/dist/index.js.map +1 -1
  150. package/dist/navigation/go-graph.d.ts +68 -0
  151. package/dist/navigation/go-graph.d.ts.map +1 -0
  152. package/dist/navigation/go-graph.js +753 -0
  153. package/dist/navigation/go-graph.js.map +1 -0
  154. package/dist/navigation/index.d.ts +7 -1
  155. package/dist/navigation/index.d.ts.map +1 -1
  156. package/dist/navigation/index.js +6 -0
  157. package/dist/navigation/index.js.map +1 -1
  158. package/dist/navigation/java-entry-tables.d.ts +43 -0
  159. package/dist/navigation/java-entry-tables.d.ts.map +1 -0
  160. package/dist/navigation/java-entry-tables.js +56 -0
  161. package/dist/navigation/java-entry-tables.js.map +1 -0
  162. package/dist/navigation/java-graph.d.ts +64 -0
  163. package/dist/navigation/java-graph.d.ts.map +1 -0
  164. package/dist/navigation/java-graph.js +466 -0
  165. package/dist/navigation/java-graph.js.map +1 -0
  166. package/dist/navigation/navigation-index.d.ts +91 -2
  167. package/dist/navigation/navigation-index.d.ts.map +1 -1
  168. package/dist/navigation/navigation-index.js +372 -45
  169. package/dist/navigation/navigation-index.js.map +1 -1
  170. package/dist/navigation/python-graph.d.ts +73 -0
  171. package/dist/navigation/python-graph.d.ts.map +1 -0
  172. package/dist/navigation/python-graph.js +867 -0
  173. package/dist/navigation/python-graph.js.map +1 -0
  174. package/dist/navigation/ts-call-edges.d.ts +193 -0
  175. package/dist/navigation/ts-call-edges.d.ts.map +1 -0
  176. package/dist/navigation/ts-call-edges.js +2089 -0
  177. package/dist/navigation/ts-call-edges.js.map +1 -0
  178. package/dist/navigation/ts-entry-tables.d.ts +88 -0
  179. package/dist/navigation/ts-entry-tables.d.ts.map +1 -0
  180. package/dist/navigation/ts-entry-tables.js +50 -0
  181. package/dist/navigation/ts-entry-tables.js.map +1 -0
  182. package/dist/path-set/branches.d.ts +52 -0
  183. package/dist/path-set/branches.d.ts.map +1 -0
  184. package/dist/path-set/branches.js +124 -0
  185. package/dist/path-set/branches.js.map +1 -0
  186. package/dist/path-set/finding-diff.d.ts +63 -0
  187. package/dist/path-set/finding-diff.d.ts.map +1 -0
  188. package/dist/path-set/finding-diff.js +150 -0
  189. package/dist/path-set/finding-diff.js.map +1 -0
  190. package/dist/path-set/index.d.ts +18 -0
  191. package/dist/path-set/index.d.ts.map +1 -0
  192. package/dist/path-set/index.js +12 -0
  193. package/dist/path-set/index.js.map +1 -0
  194. package/dist/path-set/line-diff.d.ts +19 -0
  195. package/dist/path-set/line-diff.d.ts.map +1 -0
  196. package/dist/path-set/line-diff.js +98 -0
  197. package/dist/path-set/line-diff.js.map +1 -0
  198. package/dist/path-set/path-set.d.ts +88 -0
  199. package/dist/path-set/path-set.d.ts.map +1 -0
  200. package/dist/path-set/path-set.js +716 -0
  201. package/dist/path-set/path-set.js.map +1 -0
  202. package/dist/path-set/templates.d.ts +42 -0
  203. package/dist/path-set/templates.d.ts.map +1 -0
  204. package/dist/path-set/templates.js +119 -0
  205. package/dist/path-set/templates.js.map +1 -0
  206. package/dist/path-set/types.d.ts +195 -0
  207. package/dist/path-set/types.d.ts.map +1 -0
  208. package/dist/path-set/types.js +8 -0
  209. package/dist/path-set/types.js.map +1 -0
  210. package/dist/remedy-class/index.d.ts +12 -0
  211. package/dist/remedy-class/index.d.ts.map +1 -0
  212. package/dist/remedy-class/index.js +9 -0
  213. package/dist/remedy-class/index.js.map +1 -0
  214. package/dist/remedy-class/match.d.ts +165 -0
  215. package/dist/remedy-class/match.d.ts.map +1 -0
  216. package/dist/remedy-class/match.js +705 -0
  217. package/dist/remedy-class/match.js.map +1 -0
  218. package/dist/remedy-class/output-context.d.ts +25 -0
  219. package/dist/remedy-class/output-context.d.ts.map +1 -0
  220. package/dist/remedy-class/output-context.js +150 -0
  221. package/dist/remedy-class/output-context.js.map +1 -0
  222. package/dist/remedy-class/sha256.d.ts +18 -0
  223. package/dist/remedy-class/sha256.d.ts.map +1 -0
  224. package/dist/remedy-class/sha256.js +89 -0
  225. package/dist/remedy-class/sha256.js.map +1 -0
  226. package/dist/remedy-class/table.d.ts +130 -0
  227. package/dist/remedy-class/table.d.ts.map +1 -0
  228. package/dist/remedy-class/table.js +457 -0
  229. package/dist/remedy-class/table.js.map +1 -0
  230. package/dist/resolution/cross-file.d.ts +18 -0
  231. package/dist/resolution/cross-file.d.ts.map +1 -1
  232. package/dist/resolution/cross-file.js +194 -5
  233. package/dist/resolution/cross-file.js.map +1 -1
  234. package/dist/stable-ids/builder.d.ts +20 -0
  235. package/dist/stable-ids/builder.d.ts.map +1 -0
  236. package/dist/stable-ids/builder.js +65 -0
  237. package/dist/stable-ids/builder.js.map +1 -0
  238. package/dist/stable-ids/diff.d.ts +18 -0
  239. package/dist/stable-ids/diff.d.ts.map +1 -0
  240. package/dist/stable-ids/diff.js +37 -0
  241. package/dist/stable-ids/diff.js.map +1 -0
  242. package/dist/stable-ids/go.d.ts +28 -0
  243. package/dist/stable-ids/go.d.ts.map +1 -0
  244. package/dist/stable-ids/go.js +160 -0
  245. package/dist/stable-ids/go.js.map +1 -0
  246. package/dist/stable-ids/hash.d.ts +22 -0
  247. package/dist/stable-ids/hash.d.ts.map +1 -0
  248. package/dist/stable-ids/hash.js +167 -0
  249. package/dist/stable-ids/hash.js.map +1 -0
  250. package/dist/stable-ids/index.d.ts +30 -0
  251. package/dist/stable-ids/index.d.ts.map +1 -0
  252. package/dist/stable-ids/index.js +59 -0
  253. package/dist/stable-ids/index.js.map +1 -0
  254. package/dist/stable-ids/java.d.ts +28 -0
  255. package/dist/stable-ids/java.d.ts.map +1 -0
  256. package/dist/stable-ids/java.js +224 -0
  257. package/dist/stable-ids/java.js.map +1 -0
  258. package/dist/stable-ids/moves.d.ts +87 -0
  259. package/dist/stable-ids/moves.d.ts.map +1 -0
  260. package/dist/stable-ids/moves.js +222 -0
  261. package/dist/stable-ids/moves.js.map +1 -0
  262. package/dist/stable-ids/nodes.d.ts +32 -0
  263. package/dist/stable-ids/nodes.d.ts.map +1 -0
  264. package/dist/stable-ids/nodes.js +92 -0
  265. package/dist/stable-ids/nodes.js.map +1 -0
  266. package/dist/stable-ids/normalize.d.ts +35 -0
  267. package/dist/stable-ids/normalize.d.ts.map +1 -0
  268. package/dist/stable-ids/normalize.js +174 -0
  269. package/dist/stable-ids/normalize.js.map +1 -0
  270. package/dist/stable-ids/parse-errors.d.ts +24 -0
  271. package/dist/stable-ids/parse-errors.d.ts.map +1 -0
  272. package/dist/stable-ids/parse-errors.js +46 -0
  273. package/dist/stable-ids/parse-errors.js.map +1 -0
  274. package/dist/stable-ids/python.d.ts +27 -0
  275. package/dist/stable-ids/python.d.ts.map +1 -0
  276. package/dist/stable-ids/python.js +212 -0
  277. package/dist/stable-ids/python.js.map +1 -0
  278. package/dist/stable-ids/ts-parse-errors.d.ts +27 -0
  279. package/dist/stable-ids/ts-parse-errors.d.ts.map +1 -0
  280. package/dist/stable-ids/ts-parse-errors.js +75 -0
  281. package/dist/stable-ids/ts-parse-errors.js.map +1 -0
  282. package/dist/stable-ids/types.d.ts +106 -0
  283. package/dist/stable-ids/types.d.ts.map +1 -0
  284. package/dist/stable-ids/types.js +16 -0
  285. package/dist/stable-ids/types.js.map +1 -0
  286. package/dist/stable-ids/typescript.d.ts +30 -0
  287. package/dist/stable-ids/typescript.d.ts.map +1 -0
  288. package/dist/stable-ids/typescript.js +362 -0
  289. package/dist/stable-ids/typescript.js.map +1 -0
  290. package/dist/types/config.d.ts +9 -0
  291. package/dist/types/config.d.ts.map +1 -1
  292. package/dist/types/index.d.ts +53 -0
  293. package/dist/types/index.d.ts.map +1 -1
  294. package/dist/types/index.js.map +1 -1
  295. package/package.json +3 -3
@@ -0,0 +1,216 @@
1
+ /**
2
+ * The version a Maven project's own build files declare for a coordinate,
3
+ * and where that declaration comes from.
4
+ *
5
+ * A resolved dependency set says which version the build used; this says
6
+ * which version the POMs ask for, read from the raw POM of a module and its
7
+ * parents found among the POMs the caller supplies. The two differ when a
8
+ * parent's `<dependencyManagement>` or an imported BOM overrides a module's
9
+ * own bump, which is exactly what a dependency fix has to rule out.
10
+ *
11
+ * Origins, in the order Maven applies them:
12
+ * - `direct` — a literal `<version>` on a `<dependency>` of the module or of
13
+ * a parent (inherited); an explicit version beats `<dependencyManagement>`;
14
+ * - `property` — a `${name}` on it, resolved along the module → parent chain;
15
+ * - `dependencyManagement` — the module's own `<dependencyManagement>`;
16
+ * - `parent-dependencyManagement` — a parent's in the supplied set;
17
+ * - `bom` — managed by an imported BOM (`<scope>import</scope>`): the BOM's
18
+ * content is not in the source tree, so `version` is null unless an
19
+ * effective POM is supplied;
20
+ * - `external-parent` — the module names it without a version and its
21
+ * parent is not in the supplied set (e.g. a framework parent POM);
22
+ * - `unknown` — named without a version and nothing above explains it.
23
+ * A coordinate no POM in the chain names gives `null` (a plain transitive).
24
+ *
25
+ * Regex-scoped XML reading, like the rest of the SBOM module: comments,
26
+ * `<build>`, `<profiles>` and `<reporting>` are set aside, so plugin
27
+ * dependencies and profile-only declarations are not read. Pure; the caller
28
+ * supplies file text and repository-relative paths.
29
+ */
30
+ const tag = (block, name) => new RegExp(`<${name}>\\s*([^<]*?)\\s*</${name}>`).exec(block)?.[1];
31
+ function stripSection(xml, name) {
32
+ return xml.replace(new RegExp(`<${name}>[\\s\\S]*?</${name}>`, 'g'), '');
33
+ }
34
+ function readDeps(block) {
35
+ const out = [];
36
+ const re = /<dependency>([\s\S]*?)<\/dependency>/g;
37
+ let m;
38
+ while ((m = re.exec(block)) !== null) {
39
+ const b = m[1];
40
+ const g = tag(b, 'groupId');
41
+ const a = tag(b, 'artifactId');
42
+ if (!g || !a)
43
+ continue;
44
+ out.push({ name: `${g}:${a}`, version: tag(b, 'version'), scope: tag(b, 'scope'), type: tag(b, 'type') });
45
+ }
46
+ return out;
47
+ }
48
+ function parsePom(file) {
49
+ let xml = file.content.replace(/<!--[\s\S]*?-->/g, '');
50
+ for (const s of ['build', 'profiles', 'reporting'])
51
+ xml = stripSection(xml, s);
52
+ const managedBlock = /<dependencyManagement>([\s\S]*?)<\/dependencyManagement>/.exec(xml)?.[1] ?? '';
53
+ xml = stripSection(xml, 'dependencyManagement');
54
+ const parentBlock = /<parent>([\s\S]*?)<\/parent>/.exec(xml)?.[1];
55
+ let parent;
56
+ if (parentBlock) {
57
+ const g = tag(parentBlock, 'groupId');
58
+ const a = tag(parentBlock, 'artifactId');
59
+ if (g && a) {
60
+ parent = { groupId: g, artifactId: a, version: tag(parentBlock, 'version'), relativePath: tag(parentBlock, 'relativePath') ?? '../pom.xml' };
61
+ }
62
+ xml = stripSection(xml, 'parent');
63
+ }
64
+ const properties = new Map();
65
+ const propsBlock = /<properties>([\s\S]*?)<\/properties>/.exec(xml)?.[1];
66
+ if (propsBlock) {
67
+ const re = /<([A-Za-z0-9._-]+)>\s*([^<]*?)\s*<\/\1>/g;
68
+ let m;
69
+ while ((m = re.exec(propsBlock)) !== null)
70
+ properties.set(m[1], m[2]);
71
+ }
72
+ xml = stripSection(xml, 'properties');
73
+ const depsBlock = /<dependencies>([\s\S]*?)<\/dependencies>/.exec(xml)?.[1] ?? '';
74
+ const head = stripSection(xml, 'dependencies');
75
+ return {
76
+ path: file.path,
77
+ coord: { groupId: tag(head, 'groupId') ?? parent?.groupId, artifactId: tag(head, 'artifactId'), version: tag(head, 'version') ?? parent?.version },
78
+ parent,
79
+ properties,
80
+ dependencies: readDeps(depsBlock),
81
+ managed: readDeps(managedBlock),
82
+ };
83
+ }
84
+ /** POSIX-style join and normalisation of repository-relative paths. */
85
+ function joinPath(dir, rel) {
86
+ const parts = (dir ? `${dir}/${rel}` : rel).split('/');
87
+ const out = [];
88
+ for (const p of parts) {
89
+ if (p === '' || p === '.')
90
+ continue;
91
+ if (p === '..')
92
+ out.pop();
93
+ else
94
+ out.push(p);
95
+ }
96
+ return out.join('/');
97
+ }
98
+ const dirOf = (p) => (p.includes('/') ? p.slice(0, p.lastIndexOf('/')) : '');
99
+ /**
100
+ * Index of the POMs of one source tree, answering the declared version of a
101
+ * coordinate for any module in it.
102
+ */
103
+ export class MavenDeclaredIndex {
104
+ poms = new Map();
105
+ effective;
106
+ /**
107
+ * @param poms every POM of the tree, with repository-relative paths
108
+ * @param effectivePom optional `mvn help:effective-pom` output for a module:
109
+ * used only to fill in a version the raw POMs leave null (a BOM-managed
110
+ * or external-parent-managed coordinate); the origin still comes from
111
+ * the raw POMs.
112
+ */
113
+ constructor(poms, effectivePom) {
114
+ for (const p of poms)
115
+ this.poms.set(joinPath('', p.path), parsePom(p));
116
+ if (effectivePom)
117
+ this.effective = parsePom({ path: '(effective)', content: effectivePom });
118
+ }
119
+ /** The module POM followed by every ancestor found in the supplied set. */
120
+ chain(modulePath) {
121
+ const chain = [];
122
+ let cur = this.poms.get(joinPath('', modulePath));
123
+ const visited = new Set();
124
+ while (cur && !visited.has(cur.path)) {
125
+ visited.add(cur.path);
126
+ chain.push(cur);
127
+ const parent = cur.parent;
128
+ if (!parent)
129
+ return { chain };
130
+ const byPath = this.poms.get(joinPath(dirOf(cur.path), parent.relativePath.endsWith('.xml') ? parent.relativePath : `${parent.relativePath}/pom.xml`));
131
+ const matches = (p) => !!p && p.coord.artifactId === parent.artifactId && (p.coord.groupId ?? parent.groupId) === parent.groupId;
132
+ let next = matches(byPath) ? byPath : undefined;
133
+ if (!next)
134
+ for (const p of this.poms.values())
135
+ if (matches(p)) {
136
+ next = p;
137
+ break;
138
+ }
139
+ if (!next)
140
+ return { chain, externalParent: `${parent.groupId}:${parent.artifactId}${parent.version ? `:${parent.version}` : ''}` };
141
+ cur = next;
142
+ }
143
+ return { chain };
144
+ }
145
+ /**
146
+ * The declared version of `name` (`groupId:artifactId`) for the module whose
147
+ * POM is at `modulePath`, or null when no POM in its chain names it.
148
+ */
149
+ declared(modulePath, name) {
150
+ const { chain, externalParent } = this.chain(modulePath);
151
+ if (chain.length === 0)
152
+ return null;
153
+ const module = chain[0];
154
+ const resolve = (raw) => {
155
+ const m = /^\$\{([^}]+)\}$/.exec(raw.trim());
156
+ if (!m)
157
+ return { version: raw.trim() };
158
+ const prop = m[1];
159
+ if (prop === 'project.version' || prop === 'pom.version') {
160
+ return { version: module.coord.version ?? null, property: prop };
161
+ }
162
+ for (const p of chain) {
163
+ const v = p.properties.get(prop);
164
+ if (v !== undefined)
165
+ return /\$\{/.test(v) ? { version: null, property: prop } : { version: v, property: prop };
166
+ }
167
+ return { version: null, property: prop };
168
+ };
169
+ const boms = [];
170
+ for (const p of chain) {
171
+ for (const d of p.managed) {
172
+ if (d.scope === 'import' && d.type === 'pom')
173
+ boms.push(`${d.name}${d.version ? `:${resolve(d.version).version ?? d.version}` : ''}`);
174
+ }
175
+ }
176
+ const fillFromEffective = (r) => {
177
+ if (r.version !== null || !this.effective)
178
+ return r;
179
+ const hit = [...this.effective.dependencies, ...this.effective.managed].find((d) => d.name === name && d.version);
180
+ return hit?.version ? { ...r, version: hit.version } : r;
181
+ };
182
+ // A versioned <dependency> (in the module or inherited from a parent's
183
+ // <dependencies>) beats <dependencyManagement> for that coordinate.
184
+ for (const p of chain) {
185
+ const own = p.dependencies.find((d) => d.name === name && d.version);
186
+ if (!own?.version)
187
+ continue;
188
+ const r = resolve(own.version);
189
+ return r.property
190
+ ? { version: r.version, origin: 'property', file: p.path, property: r.property }
191
+ : { version: r.version, origin: 'direct', file: p.path };
192
+ }
193
+ for (let i = 0; i < chain.length; i++) {
194
+ const managed = chain[i].managed.find((d) => d.name === name && d.scope !== 'import');
195
+ if (managed?.version) {
196
+ const r = resolve(managed.version);
197
+ return {
198
+ version: r.version,
199
+ origin: i === 0 ? 'dependencyManagement' : 'parent-dependencyManagement',
200
+ file: chain[i].path,
201
+ ...(r.property ? { property: r.property } : {}),
202
+ };
203
+ }
204
+ }
205
+ // Named without a version (or not named at all) and not managed in the tree.
206
+ const namedHere = chain.find((p) => p.dependencies.some((d) => d.name === name));
207
+ if (boms.length > 0 && namedHere)
208
+ return fillFromEffective({ version: null, origin: 'bom', file: namedHere.path, boms });
209
+ if (externalParent && namedHere)
210
+ return fillFromEffective({ version: null, origin: 'external-parent', file: namedHere.path, parent: externalParent });
211
+ if (namedHere)
212
+ return fillFromEffective({ version: null, origin: 'unknown', file: namedHere.path, ...(boms.length ? { boms } : {}) });
213
+ return null;
214
+ }
215
+ }
216
+ //# sourceMappingURL=maven-declared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maven-declared.js","sourceRoot":"","sources":["../../src/analysis/maven-declared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Maven version ordering — the ordering Maven itself uses to compare
3
+ * artifact versions (`org.apache.maven.artifact.versioning.ComparableVersion`),
4
+ * reimplemented from its documented rules so advisory ranges keyed on Maven
5
+ * versions (`introduced` / `fixed` / `last_affected`) are evaluated the way
6
+ * the build resolves them.
7
+ *
8
+ * Rules:
9
+ * - case-insensitive; items are separated by `.` and `-`, and a transition
10
+ * between digits and letters splits an item too (`1rc2` = `1-rc-2`);
11
+ * - `-` (and a digit/letter transition) opens a nested sub-list, `.` does not,
12
+ * except before a qualifier (`1.RC1` = `1-RC1`, as Maven 3.9 orders it);
13
+ * - an empty item is `0`;
14
+ * - "null" items — `0`, `""`, `final`, `ga`, `release` — are trimmed from the
15
+ * end of every list, so `1.0.0` = `1` = `1.0-final` = `1-ga`;
16
+ * - qualifiers order `alpha < beta < milestone < rc (= cr) < snapshot <
17
+ * "" (release) < sp`; `a`, `b`, `m` directly followed by a digit mean
18
+ * `alpha`, `beta`, `milestone`; any other qualifier sorts after all known
19
+ * ones, lexically;
20
+ * - a number is greater than any qualifier, and greater than a sub-list.
21
+ *
22
+ * Pure and synchronous; numbers of any length are compared exactly.
23
+ */
24
+ /** Compare two Maven versions: negative, zero or positive, as Maven orders them. */
25
+ export declare function compareMavenVersions(a: string, b: string): number;
26
+ /** The canonical form Maven compares by (useful in tests and diagnostics). */
27
+ export declare function canonicalMavenVersion(version: string): string;
28
+ //# sourceMappingURL=maven-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maven-version.d.ts","sourceRoot":"","sources":["../../src/analysis/maven-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA8HH,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAU7D"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Maven version ordering — the ordering Maven itself uses to compare
3
+ * artifact versions (`org.apache.maven.artifact.versioning.ComparableVersion`),
4
+ * reimplemented from its documented rules so advisory ranges keyed on Maven
5
+ * versions (`introduced` / `fixed` / `last_affected`) are evaluated the way
6
+ * the build resolves them.
7
+ *
8
+ * Rules:
9
+ * - case-insensitive; items are separated by `.` and `-`, and a transition
10
+ * between digits and letters splits an item too (`1rc2` = `1-rc-2`);
11
+ * - `-` (and a digit/letter transition) opens a nested sub-list, `.` does not,
12
+ * except before a qualifier (`1.RC1` = `1-RC1`, as Maven 3.9 orders it);
13
+ * - an empty item is `0`;
14
+ * - "null" items — `0`, `""`, `final`, `ga`, `release` — are trimmed from the
15
+ * end of every list, so `1.0.0` = `1` = `1.0-final` = `1-ga`;
16
+ * - qualifiers order `alpha < beta < milestone < rc (= cr) < snapshot <
17
+ * "" (release) < sp`; `a`, `b`, `m` directly followed by a digit mean
18
+ * `alpha`, `beta`, `milestone`; any other qualifier sorts after all known
19
+ * ones, lexically;
20
+ * - a number is greater than any qualifier, and greater than a sub-list.
21
+ *
22
+ * Pure and synchronous; numbers of any length are compared exactly.
23
+ */
24
+ const QUALIFIERS = ['alpha', 'beta', 'milestone', 'rc', 'snapshot', '', 'sp'];
25
+ const RELEASE_INDEX = String(QUALIFIERS.indexOf(''));
26
+ const ALIASES = { ga: '', final: '', release: '', cr: 'rc' };
27
+ function comparableQualifier(q) {
28
+ const i = QUALIFIERS.indexOf(q);
29
+ return i === -1 ? `${QUALIFIERS.length}-${q}` : String(i);
30
+ }
31
+ function stringItem(value, followedByDigit) {
32
+ let v = value;
33
+ if (followedByDigit && v.length === 1) {
34
+ if (v === 'a')
35
+ v = 'alpha';
36
+ else if (v === 'b')
37
+ v = 'beta';
38
+ else if (v === 'm')
39
+ v = 'milestone';
40
+ }
41
+ return { kind: 'string', value: ALIASES[v] ?? v };
42
+ }
43
+ function parseItem(buf, isDigit, followedByDigit) {
44
+ if (isDigit)
45
+ return { kind: 'int', value: BigInt(buf) };
46
+ return stringItem(buf, followedByDigit);
47
+ }
48
+ function isNull(item) {
49
+ if (item.kind === 'int')
50
+ return item.value === 0n;
51
+ if (item.kind === 'string')
52
+ return comparableQualifier(item.value) === RELEASE_INDEX;
53
+ return item.items.length === 0;
54
+ }
55
+ function normalize(list) {
56
+ for (let i = list.items.length - 1; i >= 0; i--) {
57
+ const last = list.items[i];
58
+ if (isNull(last))
59
+ list.items.splice(i, 1);
60
+ else if (last.kind !== 'list')
61
+ break;
62
+ }
63
+ }
64
+ function parse(version) {
65
+ // Maven 3.9 (MNG-7644): a qualifier after `.` sorts as if after `-`, so
66
+ // `1.0.0.RC1` = `1.0.0-RC1` and `1.foo` = `1-foo`.
67
+ const v = version.trim().toLowerCase().replace(/\.(?=[a-z])/g, '-');
68
+ const root = { kind: 'list', items: [] };
69
+ let list = root;
70
+ const stack = [root];
71
+ let isDigit = false;
72
+ let start = 0;
73
+ const isDigitAt = (i) => i < v.length && v[i] >= '0' && v[i] <= '9';
74
+ const pushSubList = () => {
75
+ const sub = { kind: 'list', items: [] };
76
+ list.items.push(sub);
77
+ list = sub;
78
+ stack.push(sub);
79
+ };
80
+ for (let i = 0; i < v.length; i++) {
81
+ const c = v[i];
82
+ if (c === '.' || c === '-') {
83
+ if (i === start)
84
+ list.items.push({ kind: 'int', value: 0n });
85
+ else
86
+ list.items.push(parseItem(v.slice(start, i), isDigit, isDigitAt(i + 1)));
87
+ start = i + 1;
88
+ if (c === '-')
89
+ pushSubList();
90
+ isDigit = false;
91
+ }
92
+ else if (c >= '0' && c <= '9') {
93
+ if (!isDigit && i > start) {
94
+ list.items.push(stringItem(v.slice(start, i), true));
95
+ start = i;
96
+ pushSubList();
97
+ }
98
+ isDigit = true;
99
+ }
100
+ else {
101
+ if (isDigit && i > start) {
102
+ list.items.push(parseItem(v.slice(start, i), true, false));
103
+ start = i;
104
+ pushSubList();
105
+ }
106
+ isDigit = false;
107
+ }
108
+ }
109
+ if (v.length > start)
110
+ list.items.push(parseItem(v.slice(start), isDigit, false));
111
+ while (stack.length > 0)
112
+ normalize(stack.pop());
113
+ return root;
114
+ }
115
+ function compareItem(a, b) {
116
+ if (a === undefined) {
117
+ if (b === undefined)
118
+ return 0;
119
+ return -compareItem(b, undefined);
120
+ }
121
+ switch (a.kind) {
122
+ case 'int':
123
+ if (b === undefined)
124
+ return a.value === 0n ? 0 : 1;
125
+ if (b.kind === 'int')
126
+ return a.value < b.value ? -1 : a.value > b.value ? 1 : 0;
127
+ return 1; // a number beats a qualifier and a sub-list
128
+ case 'string': {
129
+ if (b === undefined)
130
+ return cmpStr(comparableQualifier(a.value), RELEASE_INDEX);
131
+ if (b.kind === 'int' || b.kind === 'list')
132
+ return -1;
133
+ return cmpStr(comparableQualifier(a.value), comparableQualifier(b.value));
134
+ }
135
+ case 'list': {
136
+ if (b === undefined)
137
+ return a.items.length === 0 ? 0 : compareItem(a.items[0], undefined);
138
+ if (b.kind === 'int')
139
+ return -1;
140
+ if (b.kind === 'string')
141
+ return 1;
142
+ const n = Math.max(a.items.length, b.items.length);
143
+ for (let i = 0; i < n; i++) {
144
+ const r = compareItem(a.items[i], b.items[i]);
145
+ if (r !== 0)
146
+ return r;
147
+ }
148
+ return 0;
149
+ }
150
+ }
151
+ }
152
+ function cmpStr(a, b) {
153
+ return a < b ? -1 : a > b ? 1 : 0;
154
+ }
155
+ /** Compare two Maven versions: negative, zero or positive, as Maven orders them. */
156
+ export function compareMavenVersions(a, b) {
157
+ return Math.sign(compareItem(parse(a), parse(b)));
158
+ }
159
+ /** The canonical form Maven compares by (useful in tests and diagnostics). */
160
+ export function canonicalMavenVersion(version) {
161
+ const render = (list) => {
162
+ let out = '';
163
+ for (const item of list.items) {
164
+ if (out.length > 0)
165
+ out += item.kind === 'list' ? '-' : '.';
166
+ out += item.kind === 'int' ? item.value.toString() : item.kind === 'string' ? item.value : render(item);
167
+ }
168
+ return out;
169
+ };
170
+ return render(parse(version));
171
+ }
172
+ //# sourceMappingURL=maven-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maven-version.js","sourceRoot":"","sources":["../../src/analysis/maven-version.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"constant-propagation-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAA8B,KAAK,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGvG,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC,qBAAa,uBAAwB,YAAW,YAAY,CAAC,wBAAwB,CAAC;IAIxE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,YAA6B,IAAI,EAAE,IAAI,EAAI;IAE3C,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CAwB9C;CACF"}
1
+ {"version":3,"file":"constant-propagation-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAA8B,KAAK,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGvG,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC,qBAAa,uBAAwB,YAAW,YAAY,CAAC,wBAAwB,CAAC;IAIxE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,YAA6B,IAAI,EAAE,IAAI,EAAI;IAE3C,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CA0B9C;CACF"}
@@ -35,10 +35,38 @@ export class ConstantPropagationPass {
35
35
  }
36
36
  }
37
37
  }
38
- return analyzeConstantPropagation(this.tree, code, {
38
+ const result = analyzeConstantPropagation(this.tree, code, {
39
39
  sanitizerMethods: taintMatcher.sanitizerMethods,
40
40
  taintedParameters,
41
41
  });
42
+ if (ctx.language === 'java')
43
+ pruneDeadChains(ctx, result.unreachableLines);
44
+ return result;
42
45
  }
43
46
  }
47
+ /**
48
+ * Java: a def on a line const-prop proved unreachable (`else bar = param;`
49
+ * under a constant-true condition) propagates nothing. Drop its DFG chains so
50
+ * every chain walker — notably the cross-file interprocedural phase, which
51
+ * has no const-prop of its own — sees only live paths (#976: the try defs
52
+ * exposed OWASP dead-branch helpers whose source is in another file).
53
+ */
54
+ function pruneDeadChains(ctx, unreachable) {
55
+ if (unreachable.size === 0)
56
+ return;
57
+ const dfg = ctx.graph.ir.dfg;
58
+ if (!dfg.chains || dfg.chains.length === 0)
59
+ return;
60
+ // Unreachable lines are line-granular: a ternary's dead arm marks the line of
61
+ // a live def (`bar = c ? "never" : param;`), so such lines are left alone.
62
+ const lines = ctx.code.split('\n');
63
+ const dead = new Set();
64
+ for (const d of dfg.defs) {
65
+ if (unreachable.has(d.line) && !/\?[^?.:]*:/.test(lines[d.line - 1] ?? ''))
66
+ dead.add(d.id);
67
+ }
68
+ if (dead.size === 0)
69
+ return;
70
+ dfg.chains = dfg.chains.filter(c => !dead.has(c.from_def) && !dead.has(c.to_def));
71
+ }
44
72
  //# sourceMappingURL=constant-propagation-pass.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constant-propagation-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,0BAA0B,EAAiC,MAAM,4BAA4B,CAAC;AAKvG,MAAM,OAAO,uBAAuB;IAIL,IAAI;IAHxB,IAAI,GAAG,sBAAsB,CAAC;IAC9B,QAAQ,GAAG,UAAmB,CAAC;IAExC,YAA6B,IAAU;oBAAV,IAAI;IAAS,CAAC;IAE3C,GAAG,CAAC,GAAgB;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACrB,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAqB,eAAe,CAAC,CAAC;QAExE,iFAAiF;QACjF,gFAAgF;QAChF,MAAM,iBAAiB,GAAqD,EAAE,CAAC;QAC/E,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBAC5C,uDAAuD;gBACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAClE,IAAI,KAAK,EAAE,CAAC;oBACV,iBAAiB,CAAC,IAAI,CAAC;wBACrB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;wBACpB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YACjD,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"constant-propagation-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/constant-propagation-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,0BAA0B,EAAiC,MAAM,4BAA4B,CAAC;AAKvG,MAAM,OAAO,uBAAuB;IAIL,IAAI;IAHxB,IAAI,GAAG,sBAAsB,CAAC;IAC9B,QAAQ,GAAG,UAAmB,CAAC;IAExC,YAA6B,IAAU;oBAAV,IAAI;IAAS,CAAC;IAE3C,GAAG,CAAC,GAAgB;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QACrB,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAqB,eAAe,CAAC,CAAC;QAExE,iFAAiF;QACjF,gFAAgF;QAChF,MAAM,iBAAiB,GAAqD,EAAE,CAAC;QAC/E,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBAC5C,uDAAuD;gBACvD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAClE,IAAI,KAAK,EAAE,CAAC;oBACV,iBAAiB,CAAC,IAAI,CAAC;wBACrB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;wBACpB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YACzD,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,iBAAiB;SAClB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM;YAAE,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,GAAgB,EAAE,WAAgC;IACzE,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IACnC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACnD,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC5B,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAKd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,8CAA8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,uCAAuC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,GAAG,CACD,YAAY,EAAE,YAAY;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CA6RrB;CACF"}
1
+ {"version":3,"file":"cross-file-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/cross-file-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EAKd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,8CAA8C;IAC9C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,uCAAuC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,GAAG,CACD,YAAY,EAAE,YAAY;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAClC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAoSrB;CACF"}
@@ -13,7 +13,7 @@
13
13
  import { logger } from '../../utils/logger.js';
14
14
  import { sanitizerCoversSink } from '../sanitizer-index.js';
15
15
  import { CSharpCredit } from './csharp-sanitizer-credit.js';
16
- import { csharpParamReachesSink } from './interprocedural-pass.js';
16
+ import { calleeReturnMayCarryParam, csharpParamReachesSink } from './interprocedural-pass.js';
17
17
  export class CrossFilePass {
18
18
  run(projectGraph,
19
19
  /** Raw source lines per file (used to populate `code` fields in paths). */
@@ -130,8 +130,10 @@ export class CrossFilePass {
130
130
  logger.debug('cross-file: phase 3/4 starting (findFieldBindingTaintPaths)');
131
131
  const phase3 = resolver.findFieldBindingTaintPaths(budgetExceeded);
132
132
  ipPaths.push(...phase3);
133
+ const phase3b = resolver.findCSharpStaticFieldTaintPaths(budgetExceeded);
134
+ ipPaths.push(...phase3b);
133
135
  logger.info('cross-file: phase 3/4 done', {
134
- paths: phase3.length, elapsedMs: Date.now() - phase3Start,
136
+ paths: phase3.length + phase3b.length, elapsedMs: Date.now() - phase3Start,
135
137
  });
136
138
  }
137
139
  if (!exceeded && budgetExceeded()) {
@@ -163,6 +165,10 @@ export class CrossFilePass {
163
165
  !csharpCalleeReachesSink(sinkIR, sourceLines.get(p.sink.file) ?? [], sinkHop.method, p.calleeArgPositions, matchedSink, callHop?.kind === 'sink_call' ? sourceLines.get(callHop.file)?.[callHop.line - 1] : undefined)) {
164
166
  continue;
165
167
  }
168
+ if (sinkIR.meta.language === 'java' &&
169
+ javaHelperStopsCallerPath(sinkIR, sourceLines.get(p.sink.file) ?? [], p)) {
170
+ continue;
171
+ }
166
172
  const srcLines = sourceLines.get(p.source.file) ?? [];
167
173
  const tgtLines = sourceLines.get(p.sink.file) ?? [];
168
174
  // Dedup against any direct cross-file taint already emitted at the same
@@ -466,4 +472,80 @@ function findCrossInstanceAliasingPaths(projectGraph, _sourceLines) {
466
472
  }
467
473
  return paths;
468
474
  }
475
+ /**
476
+ * Java (#976): the interprocedural walker follows the caller's DFG chains
477
+ * through `bar = new Test().doSomething(request, param)` without asking whether
478
+ * that same-file helper can return its argument. Re-walk the caller side from
479
+ * the last hop before the sink, stopping at defs assigned from a same-file
480
+ * method that #1010's helper-return gate shows returns no parameter (a
481
+ * constant-folding ternary, a list read of a safe slot). True when the sink is
482
+ * then no longer reached. Without chains, or with nothing to stop, nothing changes.
483
+ */
484
+ function javaHelperStopsCallerPath(ir, lines, p) {
485
+ const chains = ir.dfg.chains;
486
+ if (!chains || chains.length === 0 || lines.length === 0)
487
+ return false;
488
+ const hops = p.hops;
489
+ const before = hops.length >= 2 ? hops[hops.length - 2] : undefined;
490
+ if (!before || before.file !== p.sink.file || before.line >= p.sink.line)
491
+ return false;
492
+ const code = lines.join('\n');
493
+ const localMethods = new Map();
494
+ for (const t of ir.types)
495
+ for (const m of t.methods) {
496
+ const arr = localMethods.get(m.name) ?? [];
497
+ arr.push({ start: m.start_line, end: m.end_line });
498
+ localMethods.set(m.name, arr);
499
+ }
500
+ const blockedLine = new Map();
501
+ const isBlocked = (line) => {
502
+ let b = blockedLine.get(line);
503
+ if (b !== undefined)
504
+ return b;
505
+ b = false;
506
+ for (const c of ir.calls) {
507
+ if (c.location.line !== line)
508
+ continue;
509
+ const ms = localMethods.get(c.method_name);
510
+ if (!ms || ms.length !== 1)
511
+ continue;
512
+ if (!calleeReturnMayCarryParam(code, ms[0].start, ms[0].end, [])) {
513
+ b = true;
514
+ break;
515
+ }
516
+ }
517
+ blockedLine.set(line, b);
518
+ return b;
519
+ };
520
+ const lineOf = new Map();
521
+ for (const d of ir.dfg.defs)
522
+ lineOf.set(d.id, d.line);
523
+ const seeds = ir.dfg.defs.filter(d => d.line === before.line && d.kind === 'local').map(d => d.id);
524
+ if (seeds.length === 0)
525
+ return false;
526
+ let stopped = false;
527
+ const reached = new Set(seeds);
528
+ const frontier = [...seeds];
529
+ while (frontier.length > 0) {
530
+ const cur = frontier.pop();
531
+ for (const ch of chains) {
532
+ if (ch.from_def !== cur || reached.has(ch.to_def))
533
+ continue;
534
+ const l = lineOf.get(ch.to_def);
535
+ if (l !== undefined && l !== before.line && isBlocked(l)) {
536
+ stopped = true;
537
+ continue;
538
+ }
539
+ reached.add(ch.to_def);
540
+ frontier.push(ch.to_def);
541
+ }
542
+ }
543
+ if (!stopped)
544
+ return false;
545
+ // The sink statement may wrap: its arguments can sit on later lines.
546
+ let end = p.sink.line;
547
+ while (end < lines.length && !/[;{}]\s*$/.test((lines[end - 1] ?? '').replace(/\/\/.*$/, '').trimEnd()))
548
+ end++;
549
+ return !ir.dfg.uses.some(u => u.line >= p.sink.line && u.line <= end && u.def_id !== null && reached.has(u.def_id));
550
+ }
469
551
  //# sourceMappingURL=cross-file-pass.js.map