circle-ir 4.14.2 → 4.16.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/configs/sinks/golang.json +4 -4
- package/dist/analysis/config-loader.d.ts.map +1 -1
- package/dist/analysis/config-loader.js +11 -7
- package/dist/analysis/config-loader.js.map +1 -1
- package/dist/analysis/const-table-lookup.d.ts +29 -0
- package/dist/analysis/const-table-lookup.d.ts.map +1 -0
- package/dist/analysis/const-table-lookup.js +145 -0
- package/dist/analysis/const-table-lookup.js.map +1 -0
- package/dist/analysis/constant-caller-gate.d.ts +39 -0
- package/dist/analysis/constant-caller-gate.d.ts.map +1 -0
- package/dist/analysis/constant-caller-gate.js +298 -0
- package/dist/analysis/constant-caller-gate.js.map +1 -0
- package/dist/analysis/constant-propagation/evaluator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/evaluator.js +3 -1
- package/dist/analysis/constant-propagation/evaluator.js.map +1 -1
- package/dist/analysis/constant-propagation/patterns.d.ts +19 -0
- package/dist/analysis/constant-propagation/patterns.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/patterns.js +33 -0
- package/dist/analysis/constant-propagation/patterns.js.map +1 -1
- package/dist/analysis/constant-propagation/propagator.d.ts +59 -0
- package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/propagator.js +396 -49
- package/dist/analysis/constant-propagation/propagator.js.map +1 -1
- package/dist/analysis/constant-propagation/types.d.ts +9 -0
- package/dist/analysis/constant-propagation/types.d.ts.map +1 -1
- package/dist/analysis/findings.d.ts.map +1 -1
- package/dist/analysis/findings.js +149 -4
- package/dist/analysis/findings.js.map +1 -1
- package/dist/analysis/go-strings-replacer.d.ts +21 -0
- package/dist/analysis/go-strings-replacer.d.ts.map +1 -0
- package/dist/analysis/go-strings-replacer.js +145 -0
- package/dist/analysis/go-strings-replacer.js.map +1 -0
- package/dist/analysis/interprocedural.d.ts.map +1 -1
- package/dist/analysis/interprocedural.js +148 -0
- package/dist/analysis/interprocedural.js.map +1 -1
- package/dist/analysis/java-array-element-keys.d.ts +14 -0
- package/dist/analysis/java-array-element-keys.d.ts.map +1 -0
- package/dist/analysis/java-array-element-keys.js +36 -0
- package/dist/analysis/java-array-element-keys.js.map +1 -0
- package/dist/analysis/java-canonical-prefix.d.ts +42 -0
- package/dist/analysis/java-canonical-prefix.d.ts.map +1 -0
- package/dist/analysis/java-canonical-prefix.js +145 -0
- package/dist/analysis/java-canonical-prefix.js.map +1 -0
- package/dist/analysis/java-crlf-strip.d.ts +30 -0
- package/dist/analysis/java-crlf-strip.d.ts.map +1 -0
- package/dist/analysis/java-crlf-strip.js +195 -0
- package/dist/analysis/java-crlf-strip.js.map +1 -0
- package/dist/analysis/js-crlf-strip.d.ts +26 -0
- package/dist/analysis/js-crlf-strip.d.ts.map +1 -0
- package/dist/analysis/js-crlf-strip.js +244 -0
- package/dist/analysis/js-crlf-strip.js.map +1 -0
- package/dist/analysis/passes/cleartext-credential-transport-pass.d.ts +2 -0
- package/dist/analysis/passes/cleartext-credential-transport-pass.d.ts.map +1 -1
- package/dist/analysis/passes/cleartext-credential-transport-pass.js +64 -12
- package/dist/analysis/passes/cleartext-credential-transport-pass.js.map +1 -1
- package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
- package/dist/analysis/passes/cross-file-pass.js +43 -0
- package/dist/analysis/passes/cross-file-pass.js.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts +12 -0
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js +127 -12
- package/dist/analysis/passes/csharp-sanitizer-credit.js.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.d.ts +28 -0
- package/dist/analysis/passes/interprocedural-pass.d.ts.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.js +20 -1
- package/dist/analysis/passes/interprocedural-pass.js.map +1 -1
- package/dist/analysis/passes/language-sources-pass.d.ts +76 -2
- package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
- package/dist/analysis/passes/language-sources-pass.js +2045 -156
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts +8 -0
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.js +214 -6
- package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
- package/dist/analysis/passes/plaintext-password-storage-pass.d.ts +6 -0
- package/dist/analysis/passes/plaintext-password-storage-pass.d.ts.map +1 -1
- package/dist/analysis/passes/plaintext-password-storage-pass.js +160 -0
- package/dist/analysis/passes/plaintext-password-storage-pass.js.map +1 -1
- package/dist/analysis/passes/scan-secrets-pass.d.ts +1 -1
- package/dist/analysis/passes/scan-secrets-pass.d.ts.map +1 -1
- package/dist/analysis/passes/scan-secrets-pass.js +7 -1
- package/dist/analysis/passes/scan-secrets-pass.js.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.js +509 -27
- package/dist/analysis/passes/sink-filter-pass.js.map +1 -1
- package/dist/analysis/passes/taint-matcher-pass.d.ts.map +1 -1
- package/dist/analysis/passes/taint-matcher-pass.js +2 -2
- package/dist/analysis/passes/taint-matcher-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 +1606 -60
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
- package/dist/analysis/passes/weak-hash-pass.d.ts +6 -0
- package/dist/analysis/passes/weak-hash-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-hash-pass.js +191 -4
- package/dist/analysis/passes/weak-hash-pass.js.map +1 -1
- package/dist/analysis/passes/weak-random-pass.d.ts +5 -0
- package/dist/analysis/passes/weak-random-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-random-pass.js +30 -0
- package/dist/analysis/passes/weak-random-pass.js.map +1 -1
- package/dist/analysis/project-callee-escape-gate.d.ts +40 -0
- package/dist/analysis/project-callee-escape-gate.d.ts.map +1 -0
- package/dist/analysis/project-callee-escape-gate.js +243 -0
- package/dist/analysis/project-callee-escape-gate.js.map +1 -0
- package/dist/analysis/rust-literal-guard-rebind.d.ts +34 -0
- package/dist/analysis/rust-literal-guard-rebind.d.ts.map +1 -0
- package/dist/analysis/rust-literal-guard-rebind.js +197 -0
- package/dist/analysis/rust-literal-guard-rebind.js.map +1 -0
- package/dist/analysis/rust-literal-guard.d.ts +33 -0
- package/dist/analysis/rust-literal-guard.d.ts.map +1 -0
- package/dist/analysis/rust-literal-guard.js +422 -0
- package/dist/analysis/rust-literal-guard.js.map +1 -0
- package/dist/analysis/scalar-derivation.d.ts +33 -0
- package/dist/analysis/scalar-derivation.d.ts.map +1 -0
- package/dist/analysis/scalar-derivation.js +368 -0
- package/dist/analysis/scalar-derivation.js.map +1 -0
- package/dist/analysis/taint-matcher.d.ts +2 -2
- package/dist/analysis/taint-matcher.d.ts.map +1 -1
- package/dist/analysis/taint-matcher.js +695 -34
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/analysis/taint-propagation.d.ts +26 -1
- package/dist/analysis/taint-propagation.d.ts.map +1 -1
- package/dist/analysis/taint-propagation.js +375 -24
- package/dist/analysis/taint-propagation.js.map +1 -1
- package/dist/analyzer.d.ts +16 -2
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +19 -2
- package/dist/analyzer.js.map +1 -1
- package/dist/browser/circle-ir.js +25539 -19200
- package/dist/core/circle-ir-core.cjs +3945 -2126
- package/dist/core/circle-ir-core.js +3945 -2126
- package/dist/core/extractors/calls.d.ts +12 -1
- package/dist/core/extractors/calls.d.ts.map +1 -1
- package/dist/core/extractors/calls.js +332 -22
- package/dist/core/extractors/calls.js.map +1 -1
- package/dist/core/extractors/dfg.js +336 -10
- package/dist/core/extractors/dfg.js.map +1 -1
- package/dist/core/extractors/types.d.ts +5 -1
- package/dist/core/extractors/types.d.ts.map +1 -1
- package/dist/core/extractors/types.js +62 -0
- package/dist/core/extractors/types.js.map +1 -1
- package/dist/graph/analysis-pass.d.ts +6 -1
- package/dist/graph/analysis-pass.d.ts.map +1 -1
- package/dist/graph/analysis-pass.js +2 -1
- package/dist/graph/analysis-pass.js.map +1 -1
- package/dist/graph/code-graph.d.ts +9 -0
- package/dist/graph/code-graph.d.ts.map +1 -1
- package/dist/graph/code-graph.js +11 -0
- package/dist/graph/code-graph.js.map +1 -1
- package/dist/navigation/navigation-index.d.ts +134 -14
- package/dist/navigation/navigation-index.d.ts.map +1 -1
- package/dist/navigation/navigation-index.js +1158 -104
- package/dist/navigation/navigation-index.js.map +1 -1
- package/dist/navigation/types.d.ts +59 -2
- package/dist/navigation/types.d.ts.map +1 -1
- package/dist/resolution/cross-file.d.ts +16 -0
- package/dist/resolution/cross-file.d.ts.map +1 -1
- package/dist/resolution/cross-file.js +110 -42
- package/dist/resolution/cross-file.js.map +1 -1
- package/dist/resolution/type-hierarchy.d.ts +3 -0
- package/dist/resolution/type-hierarchy.d.ts.map +1 -1
- package/dist/resolution/type-hierarchy.js +45 -1
- package/dist/resolution/type-hierarchy.js.map +1 -1
- package/dist/types/index.d.ts +33 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/wasm/web-tree-sitter.wasm +0 -0
- package/package.json +3 -3
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant-table lookup taint barrier (#667).
|
|
3
|
+
*
|
|
4
|
+
* `const handler = REGISTRY[req.query.mod]` selects one of the values the
|
|
5
|
+
* program itself wrote into `REGISTRY`. The request picks the key; it does not
|
|
6
|
+
* supply the value. When `REGISTRY` is a top-level `const` object or array
|
|
7
|
+
* literal that the file never writes to, the lookup result carries no request
|
|
8
|
+
* data, so it is neither a source nor a taint-carrying def.
|
|
9
|
+
*
|
|
10
|
+
* Proof comes from the file text alone, and anything short of it keeps the
|
|
11
|
+
* taint: a table declared with `let`, a table whose literal mentions a request
|
|
12
|
+
* object, a table the file assigns into, mutates or passes to `Object.assign`,
|
|
13
|
+
* and a lookup that is only part of the initializer (`T[k] || k`).
|
|
14
|
+
*/
|
|
15
|
+
import type { DFGDef } from '../types/index.js';
|
|
16
|
+
/**
|
|
17
|
+
* Names of top-level `const` tables — object or array literals, optionally
|
|
18
|
+
* wrapped in `Object.freeze(...)` — whose literal text references no request
|
|
19
|
+
* object and which the file never writes to.
|
|
20
|
+
*/
|
|
21
|
+
export declare function constLookupTables(code: string, language: string): Set<string>;
|
|
22
|
+
/**
|
|
23
|
+
* True when `rhs` is exactly `TABLE[<key>]` (optionally `TABLE?.[<key>]`) for
|
|
24
|
+
* a table in `tables`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isConstTableLookup(rhs: string, tables: ReadonlySet<string>): boolean;
|
|
27
|
+
/** DFG def ids of locals initialised by a whole constant-table lookup. */
|
|
28
|
+
export declare function constTableLookupDefIds(defs: readonly DFGDef[], code: string, language: string): Set<number>;
|
|
29
|
+
//# sourceMappingURL=const-table-lookup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const-table-lookup.d.ts","sourceRoot":"","sources":["../../src/analysis/const-table-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAmChD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAsB7E;AA6BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAOpF;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAc3G"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant-table lookup taint barrier (#667).
|
|
3
|
+
*
|
|
4
|
+
* `const handler = REGISTRY[req.query.mod]` selects one of the values the
|
|
5
|
+
* program itself wrote into `REGISTRY`. The request picks the key; it does not
|
|
6
|
+
* supply the value. When `REGISTRY` is a top-level `const` object or array
|
|
7
|
+
* literal that the file never writes to, the lookup result carries no request
|
|
8
|
+
* data, so it is neither a source nor a taint-carrying def.
|
|
9
|
+
*
|
|
10
|
+
* Proof comes from the file text alone, and anything short of it keeps the
|
|
11
|
+
* taint: a table declared with `let`, a table whose literal mentions a request
|
|
12
|
+
* object, a table the file assigns into, mutates or passes to `Object.assign`,
|
|
13
|
+
* and a lookup that is only part of the initializer (`T[k] || k`).
|
|
14
|
+
*/
|
|
15
|
+
const REQUEST_REF_RE = /\b(?:req|request|ctx|event|process|params|query|body|location|document|window)\b/;
|
|
16
|
+
function isJs(language) {
|
|
17
|
+
return language === 'javascript' || language === 'typescript';
|
|
18
|
+
}
|
|
19
|
+
/** Index just past the bracket closing the one at `open`, or -1. Skips string literals. */
|
|
20
|
+
function closeOf(text, open) {
|
|
21
|
+
const pairs = { '{': '}', '[': ']', '(': ')' };
|
|
22
|
+
const stack = [];
|
|
23
|
+
for (let i = open; i < text.length; i++) {
|
|
24
|
+
const c = text[i];
|
|
25
|
+
if (c === '"' || c === "'" || c === '`') {
|
|
26
|
+
let j = i + 1;
|
|
27
|
+
for (; j < text.length && text[j] !== c; j++)
|
|
28
|
+
if (text[j] === '\\')
|
|
29
|
+
j++;
|
|
30
|
+
i = j;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (c === '/' && text[i + 1] === '/') {
|
|
34
|
+
const nl = text.indexOf('\n', i);
|
|
35
|
+
if (nl < 0)
|
|
36
|
+
return -1;
|
|
37
|
+
i = nl;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (pairs[c]) {
|
|
41
|
+
stack.push(pairs[c]);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (c === '}' || c === ']' || c === ')') {
|
|
45
|
+
if (stack.pop() !== c)
|
|
46
|
+
return -1;
|
|
47
|
+
if (stack.length === 0)
|
|
48
|
+
return i + 1;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return -1;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Names of top-level `const` tables — object or array literals, optionally
|
|
55
|
+
* wrapped in `Object.freeze(...)` — whose literal text references no request
|
|
56
|
+
* object and which the file never writes to.
|
|
57
|
+
*/
|
|
58
|
+
export function constLookupTables(code, language) {
|
|
59
|
+
const out = new Set();
|
|
60
|
+
if (!isJs(language))
|
|
61
|
+
return out;
|
|
62
|
+
const declRe = /^const\s+([A-Za-z_$][\w$]*)\s*(?::[^=\n]+)?=\s*(Object\.freeze\(\s*)?([{[])/gm;
|
|
63
|
+
for (const m of code.matchAll(declRe)) {
|
|
64
|
+
const name = m[1];
|
|
65
|
+
const open = m.index + m[0].length - 1;
|
|
66
|
+
const close = closeOf(code, open);
|
|
67
|
+
if (close < 0)
|
|
68
|
+
continue;
|
|
69
|
+
if (REQUEST_REF_RE.test(code.slice(open, close)))
|
|
70
|
+
continue;
|
|
71
|
+
const esc = name.replace(/\$/g, '\\$');
|
|
72
|
+
const write = new RegExp(`\\b${esc}\\s*(?:\\[[^\\]]*\\]|\\.[\\w$]+)\\s*(?:=(?!=)|\\+=|\\|\\|=|\\?\\?=)` +
|
|
73
|
+
`|\\b${esc}\\s*\\.\\s*(?:push|unshift|splice|set|fill|copyWithin|reverse|sort)\\s*\\(` +
|
|
74
|
+
`|Object\\.(?:assign|defineProperty|defineProperties|setPrototypeOf)\\s*\\(\\s*${esc}\\b` +
|
|
75
|
+
`|\\bdelete\\s+${esc}\\b`);
|
|
76
|
+
if (write.test(code))
|
|
77
|
+
continue;
|
|
78
|
+
if (!onlyReadByLookup(code, name, m.index + m[0].indexOf(name, 5)))
|
|
79
|
+
continue;
|
|
80
|
+
out.add(name);
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
/** Writes or mutations through an element read: `[k] = v`, `[k].x = v`, `[k].push(v)`. */
|
|
85
|
+
const WRITE_THROUGH_RE = new RegExp(String.raw `^(?:\s*(?:\?\.\s*)?(?:\.\s*[\w$]+|\[[^\]]*\]))*\s*` +
|
|
86
|
+
String.raw `(?:=(?!=)|[-+*/%&|^]=|\+\+|--|\?\?=|\|\|=|&&=|\.\s*(?:push|unshift|splice|set|add|delete|clear|fill|copyWithin|reverse|sort)\s*\()`);
|
|
87
|
+
/**
|
|
88
|
+
* True when every use of `name` outside its declaration is a plain element
|
|
89
|
+
* read `name[k]` / `name?.[k]` that is not written or mutated through
|
|
90
|
+
* (`name[k] = v`, `name[k].x = v`, `name[k].push(v)`). Any other use — an
|
|
91
|
+
* alias (`const t = name`), a nested write (`name.items.push(v)`), a helper
|
|
92
|
+
* taking the table (`_.set(name, …)`) — may change the table's contents.
|
|
93
|
+
*/
|
|
94
|
+
function onlyReadByLookup(code, name, declAt) {
|
|
95
|
+
const esc = name.replace(/\$/g, '\\$');
|
|
96
|
+
for (const m of code.matchAll(new RegExp(`(?<![\\w$.])${esc}(?![\\w$])`, 'g'))) {
|
|
97
|
+
if (m.index === declAt)
|
|
98
|
+
continue;
|
|
99
|
+
const rest = code.slice(m.index + name.length);
|
|
100
|
+
const open = /^\s*(?:\?\.)?\s*\[/.exec(rest);
|
|
101
|
+
if (!open)
|
|
102
|
+
return false;
|
|
103
|
+
const close = closeOf(rest, open[0].length - 1);
|
|
104
|
+
if (close < 0)
|
|
105
|
+
return false;
|
|
106
|
+
if (WRITE_THROUGH_RE.test(rest.slice(close)))
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* True when `rhs` is exactly `TABLE[<key>]` (optionally `TABLE?.[<key>]`) for
|
|
113
|
+
* a table in `tables`.
|
|
114
|
+
*/
|
|
115
|
+
export function isConstTableLookup(rhs, tables) {
|
|
116
|
+
if (tables.size === 0)
|
|
117
|
+
return false;
|
|
118
|
+
const e = rhs.replace(/\s*\/\/.*$/, '').trim().replace(/;$/, '').trim();
|
|
119
|
+
const m = /^([A-Za-z_$][\w$]*)\s*(?:\?\.)?\s*\[/.exec(e);
|
|
120
|
+
if (!m || !tables.has(m[1]))
|
|
121
|
+
return false;
|
|
122
|
+
const close = closeOf(e, m[0].length - 1);
|
|
123
|
+
return close === e.length;
|
|
124
|
+
}
|
|
125
|
+
/** DFG def ids of locals initialised by a whole constant-table lookup. */
|
|
126
|
+
export function constTableLookupDefIds(defs, code, language) {
|
|
127
|
+
const out = new Set();
|
|
128
|
+
const tables = constLookupTables(code, language);
|
|
129
|
+
if (tables.size === 0)
|
|
130
|
+
return out;
|
|
131
|
+
const lines = code.split('\n');
|
|
132
|
+
for (const def of defs) {
|
|
133
|
+
if (def.kind !== 'local')
|
|
134
|
+
continue;
|
|
135
|
+
const text = lines[def.line - 1];
|
|
136
|
+
if (text === undefined)
|
|
137
|
+
continue;
|
|
138
|
+
const esc = def.variable.replace(/\$/g, '\\$');
|
|
139
|
+
const m = new RegExp(`^\\s*(?:(?:const|let|var)\\s+)?${esc}\\s*(?::[^=]+)?=(?!=)\\s*(.+)$`).exec(text);
|
|
140
|
+
if (m && isConstTableLookup(m[1], tables))
|
|
141
|
+
out.add(def.id);
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=const-table-lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const-table-lookup.js","sourceRoot":"","sources":["../../src/analysis/const-table-lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant-caller gate (cognium-dev#636, C# slice).
|
|
3
|
+
*
|
|
4
|
+
* Per-file analysis seeds every `string` parameter of a method as an
|
|
5
|
+
* `interprocedural_param` source, so a sink that receives the parameter is
|
|
6
|
+
* reported in the callee's file whether or not any caller passes tainted data.
|
|
7
|
+
* The cross-file phase already emits a path for each tainted caller, but the
|
|
8
|
+
* per-file flows are final before it runs. This project-level step runs after
|
|
9
|
+
* it and drops such a flow when every in-project caller is known to pass a
|
|
10
|
+
* constant at that parameter.
|
|
11
|
+
*
|
|
12
|
+
* A flow is dropped only when ALL of these hold; otherwise nothing changes:
|
|
13
|
+
* 1. C# file, flow seeded by `interprocedural_param` on parameter `P` of
|
|
14
|
+
* method `M`, and no other flow reaches the same sink from a real source.
|
|
15
|
+
* 2. `M` is not virtual / abstract / override / an interface member, and no
|
|
16
|
+
* project type derives from `M`'s type; the name is not overloaded in its type.
|
|
17
|
+
* 3. Every project call to a method of that name resolves exactly (the same
|
|
18
|
+
* resolution `CrossFilePass` uses) either to `M` or to some other exact
|
|
19
|
+
* target; one unresolved, inferred or polymorphic call keeps the flow.
|
|
20
|
+
* 4. At least one call resolves to `M`, and at every such call the argument at
|
|
21
|
+
* `P`'s position is a plain string literal, a literal local (`#636`), a
|
|
22
|
+
* local array whose element writes are all literals (`#638` step 1), or a
|
|
23
|
+
* parameter of the caller when every in-project caller of that method passes
|
|
24
|
+
* a constant at that parameter (transitive, depth ≤ 4, cycle-safe). Each relay
|
|
25
|
+
* method on the way must itself meet rules 2 and 3, so a relay that is
|
|
26
|
+
* virtual, overloaded or reached by a call that does not resolve exactly
|
|
27
|
+
* keeps the flow.
|
|
28
|
+
*/
|
|
29
|
+
import type { CircleIR, CallInfo } from '../types/index.js';
|
|
30
|
+
import type { ProjectGraph } from '../graph/project-graph.js';
|
|
31
|
+
/** True when local array `name` is declared in the caller and only ever holds string literals (cognium-dev#638 step 1). */
|
|
32
|
+
export declare function isLiteralArrayLocal(ir: CircleIR, lines: string[], call: CallInfo, name: string): boolean;
|
|
33
|
+
/** Direct constant at a call argument (exported for #638 unit tests). */
|
|
34
|
+
export declare function isConstantArg(ir: CircleIR, lines: string[], call: CallInfo, position: number): boolean;
|
|
35
|
+
export declare function applyConstantCallerGate(fileAnalyses: ReadonlyArray<{
|
|
36
|
+
file: string;
|
|
37
|
+
analysis: CircleIR;
|
|
38
|
+
}>, projectGraph: ProjectGraph, sourceLinesByFile: ReadonlyMap<string, string[]>): void;
|
|
39
|
+
//# sourceMappingURL=constant-caller-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant-caller-gate.d.ts","sourceRoot":"","sources":["../../src/analysis/constant-caller-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAwB,MAAM,mBAAmB,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AA8D9D,2HAA2H;AAC3H,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA6DxG;AAWD,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtG;AA4ED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,EACjE,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC/C,IAAI,CAiEN"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant-caller gate (cognium-dev#636, C# slice).
|
|
3
|
+
*
|
|
4
|
+
* Per-file analysis seeds every `string` parameter of a method as an
|
|
5
|
+
* `interprocedural_param` source, so a sink that receives the parameter is
|
|
6
|
+
* reported in the callee's file whether or not any caller passes tainted data.
|
|
7
|
+
* The cross-file phase already emits a path for each tainted caller, but the
|
|
8
|
+
* per-file flows are final before it runs. This project-level step runs after
|
|
9
|
+
* it and drops such a flow when every in-project caller is known to pass a
|
|
10
|
+
* constant at that parameter.
|
|
11
|
+
*
|
|
12
|
+
* A flow is dropped only when ALL of these hold; otherwise nothing changes:
|
|
13
|
+
* 1. C# file, flow seeded by `interprocedural_param` on parameter `P` of
|
|
14
|
+
* method `M`, and no other flow reaches the same sink from a real source.
|
|
15
|
+
* 2. `M` is not virtual / abstract / override / an interface member, and no
|
|
16
|
+
* project type derives from `M`'s type; the name is not overloaded in its type.
|
|
17
|
+
* 3. Every project call to a method of that name resolves exactly (the same
|
|
18
|
+
* resolution `CrossFilePass` uses) either to `M` or to some other exact
|
|
19
|
+
* target; one unresolved, inferred or polymorphic call keeps the flow.
|
|
20
|
+
* 4. At least one call resolves to `M`, and at every such call the argument at
|
|
21
|
+
* `P`'s position is a plain string literal, a literal local (`#636`), a
|
|
22
|
+
* local array whose element writes are all literals (`#638` step 1), or a
|
|
23
|
+
* parameter of the caller when every in-project caller of that method passes
|
|
24
|
+
* a constant at that parameter (transitive, depth ≤ 4, cycle-safe). Each relay
|
|
25
|
+
* method on the way must itself meet rules 2 and 3, so a relay that is
|
|
26
|
+
* virtual, overloaded or reached by a call that does not resolve exactly
|
|
27
|
+
* keeps the flow.
|
|
28
|
+
*/
|
|
29
|
+
const STRING_LITERAL = /^@?"(?:[^"\\]|\\.)*"$/;
|
|
30
|
+
function typeFqn(type, ir) {
|
|
31
|
+
const pkg = type.package || ir.meta.package || '';
|
|
32
|
+
return pkg ? `${pkg}.${type.name}` : type.name;
|
|
33
|
+
}
|
|
34
|
+
function enclosingMethod(ir, line) {
|
|
35
|
+
let best;
|
|
36
|
+
for (const type of ir.types) {
|
|
37
|
+
for (const method of type.methods) {
|
|
38
|
+
if (line < method.start_line || line > method.end_line)
|
|
39
|
+
continue;
|
|
40
|
+
if (!best || method.end_line - method.start_line < best.method.end_line - best.method.start_line) {
|
|
41
|
+
best = { type, method };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return best;
|
|
46
|
+
}
|
|
47
|
+
/** True when local `name` is declared in the caller's method and assigned exactly once, a string literal. */
|
|
48
|
+
function isLiteralLocal(ir, lines, call, name) {
|
|
49
|
+
if (!/^[A-Za-z_]\w*$/.test(name))
|
|
50
|
+
return false;
|
|
51
|
+
const encl = enclosingMethod(ir, call.location.line);
|
|
52
|
+
if (!encl)
|
|
53
|
+
return false;
|
|
54
|
+
const { method } = encl;
|
|
55
|
+
if (method.parameters.some(p => p.name === name))
|
|
56
|
+
return false;
|
|
57
|
+
const assignOp = new RegExp(`(?<![\\w.])${name}\\s*(?:[-+*/%&|^?]|<<|>>)?=(?!=)`, 'g');
|
|
58
|
+
const literal = '@?"(?:[^"\\\\]|\\\\.)*"';
|
|
59
|
+
const declLiteral = new RegExp(`^\\s*(?:const\\s+)?[\\w<>\\[\\],.?]+\\s+${name}\\s*=\\s*${literal}\\s*;\\s*(?://.*)?$`);
|
|
60
|
+
const plainLiteral = new RegExp(`^\\s*${name}\\s*=\\s*${literal}\\s*;\\s*(?://.*)?$`);
|
|
61
|
+
const bareDecl = new RegExp(`^\\s*(?:const\\s+)?[\\w<>\\[\\],.?]+\\s+${name}\\s*;`);
|
|
62
|
+
const mutate = new RegExp(`\\b(?:out|ref)\\s+${name}\\b|(?:\\+\\+|--)\\s*${name}\\b|\\b${name}\\s*(?:\\+\\+|--)`);
|
|
63
|
+
let assignments = 0;
|
|
64
|
+
let assignLine = -1;
|
|
65
|
+
let assignIsDecl = false;
|
|
66
|
+
let declared = false;
|
|
67
|
+
for (let l = method.start_line; l <= method.end_line; l++) {
|
|
68
|
+
const text = lines[l - 1] ?? '';
|
|
69
|
+
const n = text.match(assignOp)?.length ?? 0;
|
|
70
|
+
assignments += n;
|
|
71
|
+
if (n > 0) {
|
|
72
|
+
assignLine = l;
|
|
73
|
+
assignIsDecl = declLiteral.test(text);
|
|
74
|
+
if (!assignIsDecl && !plainLiteral.test(text))
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (bareDecl.test(text))
|
|
78
|
+
declared = true;
|
|
79
|
+
if (mutate.test(text))
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
// One assignment, a string literal, before the call; a plain `x = "lit";` needs a local `T x;` declaration.
|
|
83
|
+
return assignments === 1 && assignLine > 0 && assignLine < call.location.line && (assignIsDecl || declared);
|
|
84
|
+
}
|
|
85
|
+
const LITERAL_IN_BRACES = /^@?"(?:[^"\\]|\\.)*"(?:\s*,\s*@?"(?:[^"\\]|\\.)*")*\s*$/;
|
|
86
|
+
/** True when local array `name` is declared in the caller and only ever holds string literals (cognium-dev#638 step 1). */
|
|
87
|
+
export function isLiteralArrayLocal(ir, lines, call, name) {
|
|
88
|
+
if (!/^[A-Za-z_]\w*$/.test(name))
|
|
89
|
+
return false;
|
|
90
|
+
const encl = enclosingMethod(ir, call.location.line);
|
|
91
|
+
if (!encl)
|
|
92
|
+
return false;
|
|
93
|
+
const { method } = encl;
|
|
94
|
+
if (method.parameters.some(p => p.name === name))
|
|
95
|
+
return false;
|
|
96
|
+
const declNew = new RegExp(`^\\s*(?:var\\s+)?[\\w<>\\[\\],\\s]*\\b${name}\\s*=\\s*new\\s+[\\w<>\\[\\],\\s]+\\[\\s*\\d+\\s*\\]\\s*;\\s*(?://.*)?$`);
|
|
97
|
+
const declInit = new RegExp(`^\\s*(?:var\\s+)?[\\w<>\\[\\],\\s]*\\b${name}\\s*=\\s*(?:new\\s+[\\w<>\\[\\],\\s]+\\[\\s*\\]\\s*)?\\{([^}]*)\\}\\s*;\\s*(?://.*)?$`);
|
|
98
|
+
const plainReassign = new RegExp(`^\\s*${name}\\s*(?![\\[])(?:[-+*/%&|^?]|<<|>>)?=(?!=)`);
|
|
99
|
+
const elementWrite = new RegExp(`^\\s*${name}\\s*\\[[^\\]]+\\]\\s*=\\s*(.+?)\\s*;\\s*(?://.*)?$`);
|
|
100
|
+
const alias = new RegExp(`^\\s*\\w+\\s*=\\s*${name}\\s*;`);
|
|
101
|
+
const mutate = new RegExp(`\\b(?:out|ref)\\s+${name}\\b|(?:\\+\\+|--)\\s*${name}\\b|\\b${name}\\s*(?:\\+\\+|--)`);
|
|
102
|
+
const copyStyle = new RegExp(`\\b(?:Array\\.Copy|CopyTo|\\.Add)\\s*\\([^)]*\\b${name}\\b`);
|
|
103
|
+
let declared = false;
|
|
104
|
+
let declLine = -1;
|
|
105
|
+
for (let l = method.start_line; l <= method.end_line; l++) {
|
|
106
|
+
const text = lines[l - 1] ?? '';
|
|
107
|
+
if (mutate.test(text) || alias.test(text) || copyStyle.test(text))
|
|
108
|
+
return false;
|
|
109
|
+
const initMatch = declInit.exec(text);
|
|
110
|
+
if (initMatch) {
|
|
111
|
+
declared = true;
|
|
112
|
+
declLine = l;
|
|
113
|
+
const inner = (initMatch[1] ?? '').trim();
|
|
114
|
+
if (inner.length > 0 && !LITERAL_IN_BRACES.test(inner))
|
|
115
|
+
return false;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (declNew.test(text)) {
|
|
119
|
+
declared = true;
|
|
120
|
+
declLine = l;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const ew = elementWrite.exec(text);
|
|
124
|
+
if (ew) {
|
|
125
|
+
const rhs = ew[1].trim();
|
|
126
|
+
if (STRING_LITERAL.test(rhs))
|
|
127
|
+
continue;
|
|
128
|
+
if (/^[A-Za-z_]\w*$/.test(rhs) && isLiteralLocal(ir, lines, call, rhs))
|
|
129
|
+
continue;
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (l !== declLine && plainReassign.test(text))
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
if (!declared)
|
|
136
|
+
return false;
|
|
137
|
+
for (const c of ir.calls) {
|
|
138
|
+
if (c.location.line < method.start_line || c.location.line > method.end_line)
|
|
139
|
+
continue;
|
|
140
|
+
if (c.location.line >= call.location.line)
|
|
141
|
+
continue;
|
|
142
|
+
if (c === call)
|
|
143
|
+
continue;
|
|
144
|
+
if (c.arguments.some(a => (a.variable ?? a.expression?.trim()) === name))
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
function isDirectConstantArg(ir, lines, call, position) {
|
|
150
|
+
const arg = call.arguments.find(a => a.position === position);
|
|
151
|
+
if (!arg)
|
|
152
|
+
return false;
|
|
153
|
+
const expr = (arg.expression ?? '').trim();
|
|
154
|
+
if (STRING_LITERAL.test(expr))
|
|
155
|
+
return true;
|
|
156
|
+
if (arg.variable && expr === arg.variable && isLiteralLocal(ir, lines, call, arg.variable))
|
|
157
|
+
return true;
|
|
158
|
+
return !!arg.variable && expr === arg.variable && isLiteralArrayLocal(ir, lines, call, arg.variable);
|
|
159
|
+
}
|
|
160
|
+
/** Direct constant at a call argument (exported for #638 unit tests). */
|
|
161
|
+
export function isConstantArg(ir, lines, call, position) {
|
|
162
|
+
return isDirectConstantArg(ir, lines, call, position);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Rule 2 of the header: a method whose callers can be enumerated exactly. Applied to the
|
|
166
|
+
* sink's method and to every relay method the transitive step walks through, so a virtual,
|
|
167
|
+
* overridden, interface or overloaded relay keeps the flow.
|
|
168
|
+
*/
|
|
169
|
+
function hasEnumerableCallers(type, method, derivedFrom) {
|
|
170
|
+
if (type.kind !== 'class')
|
|
171
|
+
return false;
|
|
172
|
+
if (method.modifiers.some(m => m === 'virtual' || m === 'abstract' || m === 'override'))
|
|
173
|
+
return false;
|
|
174
|
+
if (derivedFrom.has(type.name))
|
|
175
|
+
return false;
|
|
176
|
+
return type.methods.filter(m => m.name === method.name).length === 1;
|
|
177
|
+
}
|
|
178
|
+
const TRANSITIVE_MAX_DEPTH = 4;
|
|
179
|
+
function isConstantArgRecursive(ctx, ir, lines, call, position, depth, visiting) {
|
|
180
|
+
if (isDirectConstantArg(ir, lines, call, position))
|
|
181
|
+
return true;
|
|
182
|
+
if (depth >= TRANSITIVE_MAX_DEPTH)
|
|
183
|
+
return false;
|
|
184
|
+
const arg = call.arguments.find(a => a.position === position);
|
|
185
|
+
if (!arg?.variable || (arg.expression ?? '').trim() !== arg.variable)
|
|
186
|
+
return false;
|
|
187
|
+
const encl = enclosingMethod(ir, call.location.line);
|
|
188
|
+
if (!encl)
|
|
189
|
+
return false;
|
|
190
|
+
if (!hasEnumerableCallers(encl.type, encl.method, ctx.derivedFrom))
|
|
191
|
+
return false;
|
|
192
|
+
const paramIdx = encl.method.parameters.findIndex(p => p.name === arg.variable);
|
|
193
|
+
if (paramIdx < 0)
|
|
194
|
+
return false;
|
|
195
|
+
const fqn = `${typeFqn(encl.type, ir)}.${encl.method.name}`;
|
|
196
|
+
const visitKey = `${fqn}:${paramIdx}`;
|
|
197
|
+
if (visiting.has(visitKey))
|
|
198
|
+
return false;
|
|
199
|
+
visiting.add(visitKey);
|
|
200
|
+
let resolvedToMethod = 0;
|
|
201
|
+
for (const site of ctx.callsByName.get(encl.method.name) ?? []) {
|
|
202
|
+
const r = ctx.resolver.resolveCall(site.call, site.file);
|
|
203
|
+
// Rule 3, as at the sink: one call of this name that does not resolve exactly might be
|
|
204
|
+
// this relay receiving tainted data, so the relay's argument is not known to be constant.
|
|
205
|
+
if (!r || r.resolution !== 'exact') {
|
|
206
|
+
visiting.delete(visitKey);
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
if (r.targetMethod !== fqn)
|
|
210
|
+
continue;
|
|
211
|
+
const callerIr = ctx.fileAnalyses.find(f => f.file === site.file)?.analysis;
|
|
212
|
+
const callerLines = ctx.sourceLinesByFile.get(site.file);
|
|
213
|
+
if (!callerIr || !callerLines) {
|
|
214
|
+
visiting.delete(visitKey);
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
if (!isConstantArgRecursive(ctx, callerIr, callerLines, site.call, paramIdx, depth + 1, visiting)) {
|
|
218
|
+
visiting.delete(visitKey);
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
resolvedToMethod++;
|
|
222
|
+
}
|
|
223
|
+
visiting.delete(visitKey);
|
|
224
|
+
return resolvedToMethod > 0;
|
|
225
|
+
}
|
|
226
|
+
export function applyConstantCallerGate(fileAnalyses, projectGraph, sourceLinesByFile) {
|
|
227
|
+
const candidates = fileAnalyses.filter(fa => fa.analysis.meta.language === 'csharp'
|
|
228
|
+
&& (fa.analysis.taint?.flows ?? []).some(f => f.source_type === 'interprocedural_param'));
|
|
229
|
+
if (candidates.length === 0)
|
|
230
|
+
return;
|
|
231
|
+
const resolver = projectGraph.resolver;
|
|
232
|
+
const csharp = fileAnalyses.filter(fa => fa.analysis.meta.language === 'csharp');
|
|
233
|
+
const callsByName = new Map();
|
|
234
|
+
const derivedFrom = new Set();
|
|
235
|
+
for (const fa of csharp) {
|
|
236
|
+
for (const call of fa.analysis.calls) {
|
|
237
|
+
const arr = callsByName.get(call.method_name) ?? [];
|
|
238
|
+
arr.push({ file: fa.file, call });
|
|
239
|
+
callsByName.set(call.method_name, arr);
|
|
240
|
+
}
|
|
241
|
+
for (const type of fa.analysis.types) {
|
|
242
|
+
if (type.extends)
|
|
243
|
+
derivedFrom.add(type.extends.split('.').pop() ?? type.extends);
|
|
244
|
+
for (const i of type.implements)
|
|
245
|
+
derivedFrom.add(i.split('.').pop() ?? i);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const gateCtx = {
|
|
249
|
+
fileAnalyses,
|
|
250
|
+
callsByName,
|
|
251
|
+
resolver,
|
|
252
|
+
sourceLinesByFile,
|
|
253
|
+
derivedFrom,
|
|
254
|
+
};
|
|
255
|
+
for (const fa of candidates) {
|
|
256
|
+
const ir = fa.analysis;
|
|
257
|
+
const flows = ir.taint.flows ?? [];
|
|
258
|
+
const kept = flows.filter(flow => {
|
|
259
|
+
if (flow.source_type !== 'interprocedural_param')
|
|
260
|
+
return true;
|
|
261
|
+
const variable = flow.path[0]?.variable;
|
|
262
|
+
if (!variable)
|
|
263
|
+
return true;
|
|
264
|
+
if (flows.some(o => o !== flow && o.sink_line === flow.sink_line && o.source_type !== 'interprocedural_param'))
|
|
265
|
+
return true;
|
|
266
|
+
const src = (ir.taint.sources ?? []).find(s => s.type === 'interprocedural_param' && s.line === flow.source_line && s.variable === variable);
|
|
267
|
+
if (!src?.in_method)
|
|
268
|
+
return true;
|
|
269
|
+
const encl = enclosingMethod(ir, flow.source_line);
|
|
270
|
+
if (!encl || encl.method.name !== src.in_method)
|
|
271
|
+
return true;
|
|
272
|
+
const { type, method } = encl;
|
|
273
|
+
if (!hasEnumerableCallers(type, method, derivedFrom))
|
|
274
|
+
return true;
|
|
275
|
+
const position = method.parameters.findIndex(p => p.name === variable);
|
|
276
|
+
if (position < 0)
|
|
277
|
+
return true;
|
|
278
|
+
const fqn = `${typeFqn(type, ir)}.${method.name}`;
|
|
279
|
+
let resolvedToMethod = 0;
|
|
280
|
+
for (const site of callsByName.get(method.name) ?? []) {
|
|
281
|
+
const r = resolver.resolveCall(site.call, site.file);
|
|
282
|
+
if (!r || r.resolution !== 'exact')
|
|
283
|
+
return true;
|
|
284
|
+
if (r.targetMethod !== fqn)
|
|
285
|
+
continue;
|
|
286
|
+
const callerIr = fileAnalyses.find(f => f.file === site.file)?.analysis;
|
|
287
|
+
const lines = sourceLinesByFile.get(site.file);
|
|
288
|
+
if (!callerIr || !lines || !isConstantArgRecursive(gateCtx, callerIr, lines, site.call, position, 0, new Set()))
|
|
289
|
+
return true;
|
|
290
|
+
resolvedToMethod++;
|
|
291
|
+
}
|
|
292
|
+
return resolvedToMethod === 0;
|
|
293
|
+
});
|
|
294
|
+
if (kept.length !== flows.length)
|
|
295
|
+
ir.taint.flows = kept;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=constant-caller-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant-caller-gate.js","sourceRoot":"","sources":["../../src/analysis/constant-caller-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IAFnB,YACU,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,EAC5D;IAEJ;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IAFnB,YACU,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,EAC5D;IAEJ;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,aAAa,CAiFlC;IAED,OAAO,CAAC,cAAc;IA8FtB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,kBAAkB;IAuE1B,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,IAAI,GAAG,aAAa,EAAE,CAQjD;IAED,OAAO,CAAC,YAAY;CAWrB"}
|
|
@@ -32,7 +32,9 @@ export class ExpressionEvaluator {
|
|
|
32
32
|
case 'decimal_floating_point_literal':
|
|
33
33
|
return createConstant(parseFloat(text), 'float', line);
|
|
34
34
|
case 'string_literal':
|
|
35
|
-
|
|
35
|
+
case 'interpreted_string_literal':
|
|
36
|
+
case 'raw_string_literal':
|
|
37
|
+
return createConstant(node.type === 'raw_string_literal' ? text.slice(1, -1) : text.slice(1, -1), 'string', line);
|
|
36
38
|
case 'character_literal': {
|
|
37
39
|
let char = text.slice(1, -1);
|
|
38
40
|
if (char.startsWith('\\')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/evaluator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/analysis/constant-propagation/evaluator.ts"],"names":[],"mappings":"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"}
|