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.
- package/dist/analysis/advisories.d.ts +186 -0
- package/dist/analysis/advisories.d.ts.map +1 -0
- package/dist/analysis/advisories.js +391 -0
- package/dist/analysis/advisories.js.map +1 -0
- package/dist/analysis/comment-lines.d.ts +14 -0
- package/dist/analysis/comment-lines.d.ts.map +1 -0
- package/dist/analysis/comment-lines.js +34 -0
- package/dist/analysis/comment-lines.js.map +1 -0
- package/dist/analysis/config-loader.d.ts.map +1 -1
- package/dist/analysis/config-loader.js +59 -5
- package/dist/analysis/config-loader.js.map +1 -1
- package/dist/analysis/constant-caller-gate.d.ts +2 -2
- package/dist/analysis/constant-caller-gate.d.ts.map +1 -1
- package/dist/analysis/constant-caller-gate.js +205 -29
- package/dist/analysis/constant-caller-gate.js.map +1 -1
- package/dist/analysis/constant-propagation/index.d.ts +2 -0
- package/dist/analysis/constant-propagation/index.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/index.js +10 -0
- package/dist/analysis/constant-propagation/index.js.map +1 -1
- package/dist/analysis/constant-propagation/propagator.d.ts +15 -0
- package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
- package/dist/analysis/constant-propagation/propagator.js +224 -20
- package/dist/analysis/constant-propagation/propagator.js.map +1 -1
- package/dist/analysis/constant-propagation/types.d.ts +2 -0
- package/dist/analysis/constant-propagation/types.d.ts.map +1 -1
- package/dist/analysis/constant-propagation.d.ts +1 -1
- package/dist/analysis/constant-propagation.d.ts.map +1 -1
- package/dist/analysis/constant-propagation.js +1 -1
- package/dist/analysis/constant-propagation.js.map +1 -1
- package/dist/analysis/entry-point-detection.d.ts.map +1 -1
- package/dist/analysis/entry-point-detection.js +72 -0
- package/dist/analysis/entry-point-detection.js.map +1 -1
- package/dist/analysis/interprocedural.d.ts.map +1 -1
- package/dist/analysis/interprocedural.js +75 -8
- package/dist/analysis/interprocedural.js.map +1 -1
- package/dist/analysis/maven-declared.d.ts +72 -0
- package/dist/analysis/maven-declared.d.ts.map +1 -0
- package/dist/analysis/maven-declared.js +216 -0
- package/dist/analysis/maven-declared.js.map +1 -0
- package/dist/analysis/maven-version.d.ts +28 -0
- package/dist/analysis/maven-version.d.ts.map +1 -0
- package/dist/analysis/maven-version.js +172 -0
- package/dist/analysis/maven-version.js.map +1 -0
- package/dist/analysis/passes/constant-propagation-pass.d.ts.map +1 -1
- package/dist/analysis/passes/constant-propagation-pass.js +29 -1
- package/dist/analysis/passes/constant-propagation-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 +84 -2
- package/dist/analysis/passes/cross-file-pass.js.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts +7 -0
- package/dist/analysis/passes/csharp-sanitizer-credit.d.ts.map +1 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js +44 -1
- package/dist/analysis/passes/csharp-sanitizer-credit.js.map +1 -1
- package/dist/analysis/passes/insecure-cookie-pass.d.ts +2 -0
- package/dist/analysis/passes/insecure-cookie-pass.d.ts.map +1 -1
- package/dist/analysis/passes/insecure-cookie-pass.js +25 -3
- package/dist/analysis/passes/insecure-cookie-pass.js.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.d.ts +11 -14
- package/dist/analysis/passes/interprocedural-pass.d.ts.map +1 -1
- package/dist/analysis/passes/interprocedural-pass.js +562 -0
- package/dist/analysis/passes/interprocedural-pass.js.map +1 -1
- package/dist/analysis/passes/language-sources-pass.d.ts +18 -1
- package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
- package/dist/analysis/passes/language-sources-pass.js +1079 -14
- package/dist/analysis/passes/language-sources-pass.js.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
- package/dist/analysis/passes/param-source-flow-gate-pass.js +82 -3
- package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.d.ts +44 -2
- package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
- package/dist/analysis/passes/sink-filter-pass.js +690 -12
- package/dist/analysis/passes/sink-filter-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 +298 -19
- package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
- package/dist/analysis/passes/tls-verify-disabled-pass.d.ts +18 -0
- package/dist/analysis/passes/tls-verify-disabled-pass.d.ts.map +1 -1
- package/dist/analysis/passes/tls-verify-disabled-pass.js +161 -0
- package/dist/analysis/passes/tls-verify-disabled-pass.js.map +1 -1
- package/dist/analysis/passes/weak-random-pass.d.ts +6 -0
- package/dist/analysis/passes/weak-random-pass.d.ts.map +1 -1
- package/dist/analysis/passes/weak-random-pass.js +29 -0
- package/dist/analysis/passes/weak-random-pass.js.map +1 -1
- package/dist/analysis/promote-cross-file-flows.d.ts +17 -0
- package/dist/analysis/promote-cross-file-flows.d.ts.map +1 -0
- package/dist/analysis/promote-cross-file-flows.js +32 -0
- package/dist/analysis/promote-cross-file-flows.js.map +1 -0
- package/dist/analysis/rust-literal-guard.d.ts.map +1 -1
- package/dist/analysis/rust-literal-guard.js +100 -1
- package/dist/analysis/rust-literal-guard.js.map +1 -1
- package/dist/analysis/sbom.d.ts +100 -0
- package/dist/analysis/sbom.d.ts.map +1 -1
- package/dist/analysis/sbom.js +514 -3
- package/dist/analysis/sbom.js.map +1 -1
- package/dist/analysis/semver-version.d.ts +30 -0
- package/dist/analysis/semver-version.d.ts.map +1 -0
- package/dist/analysis/semver-version.js +76 -0
- package/dist/analysis/semver-version.js.map +1 -0
- package/dist/analysis/taint-matcher.d.ts +5 -0
- package/dist/analysis/taint-matcher.d.ts.map +1 -1
- package/dist/analysis/taint-matcher.js +226 -4
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/analyzer.d.ts +57 -0
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +69 -6
- package/dist/analyzer.js.map +1 -1
- package/dist/browser/circle-ir.js +3360 -314
- package/dist/core/circle-ir-core.cjs +783 -220
- package/dist/core/circle-ir-core.js +783 -220
- package/dist/core/extractors/dfg.js +205 -2
- package/dist/core/extractors/dfg.js.map +1 -1
- package/dist/core/extractors/ts-declaration-detail.d.ts +39 -0
- package/dist/core/extractors/ts-declaration-detail.d.ts.map +1 -0
- package/dist/core/extractors/ts-declaration-detail.js +266 -0
- package/dist/core/extractors/ts-declaration-detail.js.map +1 -0
- package/dist/core/extractors/types.js +53 -9
- package/dist/core/extractors/types.js.map +1 -1
- package/dist/graph/analysis-pass.d.ts +4 -1
- package/dist/graph/analysis-pass.d.ts.map +1 -1
- package/dist/graph/analysis-pass.js +4 -1
- package/dist/graph/analysis-pass.js.map +1 -1
- package/dist/graph-facts/dead-code.d.ts +62 -0
- package/dist/graph-facts/dead-code.d.ts.map +1 -0
- package/dist/graph-facts/dead-code.js +90 -0
- package/dist/graph-facts/dead-code.js.map +1 -0
- package/dist/graph-facts/dependency-calls.d.ts +86 -0
- package/dist/graph-facts/dependency-calls.d.ts.map +1 -0
- package/dist/graph-facts/dependency-calls.js +93 -0
- package/dist/graph-facts/dependency-calls.js.map +1 -0
- package/dist/graph-facts/index.d.ts +10 -0
- package/dist/graph-facts/index.d.ts.map +1 -0
- package/dist/graph-facts/index.js +10 -0
- package/dist/graph-facts/index.js.map +1 -0
- package/dist/graph-facts/maven-packages.d.ts +42 -0
- package/dist/graph-facts/maven-packages.d.ts.map +1 -0
- package/dist/graph-facts/maven-packages.js +133 -0
- package/dist/graph-facts/maven-packages.js.map +1 -0
- package/dist/graph-facts/reach.d.ts +203 -0
- package/dist/graph-facts/reach.d.ts.map +1 -0
- package/dist/graph-facts/reach.js +219 -0
- package/dist/graph-facts/reach.js.map +1 -0
- package/dist/graph-facts/removal-reach.d.ts +73 -0
- package/dist/graph-facts/removal-reach.d.ts.map +1 -0
- package/dist/graph-facts/removal-reach.js +64 -0
- package/dist/graph-facts/removal-reach.js.map +1 -0
- package/dist/index.d.ts +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -3
- package/dist/index.js.map +1 -1
- package/dist/navigation/go-graph.d.ts +68 -0
- package/dist/navigation/go-graph.d.ts.map +1 -0
- package/dist/navigation/go-graph.js +753 -0
- package/dist/navigation/go-graph.js.map +1 -0
- package/dist/navigation/index.d.ts +7 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +6 -0
- package/dist/navigation/index.js.map +1 -1
- package/dist/navigation/java-entry-tables.d.ts +43 -0
- package/dist/navigation/java-entry-tables.d.ts.map +1 -0
- package/dist/navigation/java-entry-tables.js +56 -0
- package/dist/navigation/java-entry-tables.js.map +1 -0
- package/dist/navigation/java-graph.d.ts +64 -0
- package/dist/navigation/java-graph.d.ts.map +1 -0
- package/dist/navigation/java-graph.js +466 -0
- package/dist/navigation/java-graph.js.map +1 -0
- package/dist/navigation/navigation-index.d.ts +91 -2
- package/dist/navigation/navigation-index.d.ts.map +1 -1
- package/dist/navigation/navigation-index.js +372 -45
- package/dist/navigation/navigation-index.js.map +1 -1
- package/dist/navigation/python-graph.d.ts +73 -0
- package/dist/navigation/python-graph.d.ts.map +1 -0
- package/dist/navigation/python-graph.js +867 -0
- package/dist/navigation/python-graph.js.map +1 -0
- package/dist/navigation/ts-call-edges.d.ts +193 -0
- package/dist/navigation/ts-call-edges.d.ts.map +1 -0
- package/dist/navigation/ts-call-edges.js +2089 -0
- package/dist/navigation/ts-call-edges.js.map +1 -0
- package/dist/navigation/ts-entry-tables.d.ts +88 -0
- package/dist/navigation/ts-entry-tables.d.ts.map +1 -0
- package/dist/navigation/ts-entry-tables.js +50 -0
- package/dist/navigation/ts-entry-tables.js.map +1 -0
- package/dist/path-set/branches.d.ts +52 -0
- package/dist/path-set/branches.d.ts.map +1 -0
- package/dist/path-set/branches.js +124 -0
- package/dist/path-set/branches.js.map +1 -0
- package/dist/path-set/finding-diff.d.ts +63 -0
- package/dist/path-set/finding-diff.d.ts.map +1 -0
- package/dist/path-set/finding-diff.js +150 -0
- package/dist/path-set/finding-diff.js.map +1 -0
- package/dist/path-set/index.d.ts +18 -0
- package/dist/path-set/index.d.ts.map +1 -0
- package/dist/path-set/index.js +12 -0
- package/dist/path-set/index.js.map +1 -0
- package/dist/path-set/line-diff.d.ts +19 -0
- package/dist/path-set/line-diff.d.ts.map +1 -0
- package/dist/path-set/line-diff.js +98 -0
- package/dist/path-set/line-diff.js.map +1 -0
- package/dist/path-set/path-set.d.ts +88 -0
- package/dist/path-set/path-set.d.ts.map +1 -0
- package/dist/path-set/path-set.js +716 -0
- package/dist/path-set/path-set.js.map +1 -0
- package/dist/path-set/templates.d.ts +42 -0
- package/dist/path-set/templates.d.ts.map +1 -0
- package/dist/path-set/templates.js +119 -0
- package/dist/path-set/templates.js.map +1 -0
- package/dist/path-set/types.d.ts +195 -0
- package/dist/path-set/types.d.ts.map +1 -0
- package/dist/path-set/types.js +8 -0
- package/dist/path-set/types.js.map +1 -0
- package/dist/remedy-class/index.d.ts +12 -0
- package/dist/remedy-class/index.d.ts.map +1 -0
- package/dist/remedy-class/index.js +9 -0
- package/dist/remedy-class/index.js.map +1 -0
- package/dist/remedy-class/match.d.ts +165 -0
- package/dist/remedy-class/match.d.ts.map +1 -0
- package/dist/remedy-class/match.js +705 -0
- package/dist/remedy-class/match.js.map +1 -0
- package/dist/remedy-class/output-context.d.ts +25 -0
- package/dist/remedy-class/output-context.d.ts.map +1 -0
- package/dist/remedy-class/output-context.js +150 -0
- package/dist/remedy-class/output-context.js.map +1 -0
- package/dist/remedy-class/sha256.d.ts +18 -0
- package/dist/remedy-class/sha256.d.ts.map +1 -0
- package/dist/remedy-class/sha256.js +89 -0
- package/dist/remedy-class/sha256.js.map +1 -0
- package/dist/remedy-class/table.d.ts +130 -0
- package/dist/remedy-class/table.d.ts.map +1 -0
- package/dist/remedy-class/table.js +457 -0
- package/dist/remedy-class/table.js.map +1 -0
- package/dist/resolution/cross-file.d.ts +18 -0
- package/dist/resolution/cross-file.d.ts.map +1 -1
- package/dist/resolution/cross-file.js +194 -5
- package/dist/resolution/cross-file.js.map +1 -1
- package/dist/stable-ids/builder.d.ts +20 -0
- package/dist/stable-ids/builder.d.ts.map +1 -0
- package/dist/stable-ids/builder.js +65 -0
- package/dist/stable-ids/builder.js.map +1 -0
- package/dist/stable-ids/diff.d.ts +18 -0
- package/dist/stable-ids/diff.d.ts.map +1 -0
- package/dist/stable-ids/diff.js +37 -0
- package/dist/stable-ids/diff.js.map +1 -0
- package/dist/stable-ids/go.d.ts +28 -0
- package/dist/stable-ids/go.d.ts.map +1 -0
- package/dist/stable-ids/go.js +160 -0
- package/dist/stable-ids/go.js.map +1 -0
- package/dist/stable-ids/hash.d.ts +22 -0
- package/dist/stable-ids/hash.d.ts.map +1 -0
- package/dist/stable-ids/hash.js +167 -0
- package/dist/stable-ids/hash.js.map +1 -0
- package/dist/stable-ids/index.d.ts +30 -0
- package/dist/stable-ids/index.d.ts.map +1 -0
- package/dist/stable-ids/index.js +59 -0
- package/dist/stable-ids/index.js.map +1 -0
- package/dist/stable-ids/java.d.ts +28 -0
- package/dist/stable-ids/java.d.ts.map +1 -0
- package/dist/stable-ids/java.js +224 -0
- package/dist/stable-ids/java.js.map +1 -0
- package/dist/stable-ids/moves.d.ts +87 -0
- package/dist/stable-ids/moves.d.ts.map +1 -0
- package/dist/stable-ids/moves.js +222 -0
- package/dist/stable-ids/moves.js.map +1 -0
- package/dist/stable-ids/nodes.d.ts +32 -0
- package/dist/stable-ids/nodes.d.ts.map +1 -0
- package/dist/stable-ids/nodes.js +92 -0
- package/dist/stable-ids/nodes.js.map +1 -0
- package/dist/stable-ids/normalize.d.ts +35 -0
- package/dist/stable-ids/normalize.d.ts.map +1 -0
- package/dist/stable-ids/normalize.js +174 -0
- package/dist/stable-ids/normalize.js.map +1 -0
- package/dist/stable-ids/parse-errors.d.ts +24 -0
- package/dist/stable-ids/parse-errors.d.ts.map +1 -0
- package/dist/stable-ids/parse-errors.js +46 -0
- package/dist/stable-ids/parse-errors.js.map +1 -0
- package/dist/stable-ids/python.d.ts +27 -0
- package/dist/stable-ids/python.d.ts.map +1 -0
- package/dist/stable-ids/python.js +212 -0
- package/dist/stable-ids/python.js.map +1 -0
- package/dist/stable-ids/ts-parse-errors.d.ts +27 -0
- package/dist/stable-ids/ts-parse-errors.d.ts.map +1 -0
- package/dist/stable-ids/ts-parse-errors.js +75 -0
- package/dist/stable-ids/ts-parse-errors.js.map +1 -0
- package/dist/stable-ids/types.d.ts +106 -0
- package/dist/stable-ids/types.d.ts.map +1 -0
- package/dist/stable-ids/types.js +16 -0
- package/dist/stable-ids/types.js.map +1 -0
- package/dist/stable-ids/typescript.d.ts +30 -0
- package/dist/stable-ids/typescript.d.ts.map +1 -0
- package/dist/stable-ids/typescript.js +362 -0
- package/dist/stable-ids/typescript.js.map +1 -0
- package/dist/types/config.d.ts +9 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/index.d.ts +53 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding diff of a version pair: the lines a change touched, and the
|
|
3
|
+
* findings at the new version whose source or sink sits on a touched line and
|
|
4
|
+
* that have no match at the old version.
|
|
5
|
+
*
|
|
6
|
+
* Findings are the engine's own: taint flows (per-file flows and cross-file
|
|
7
|
+
* paths) and the pass findings. A finding is matched at the old version by
|
|
8
|
+
* stable declaration ids where `ids@0.1` covers both versions of its files,
|
|
9
|
+
* otherwise by rule × file × line mapped through the line diff; each new
|
|
10
|
+
* finding says which. Facts only: whether a new finding matters is the
|
|
11
|
+
* caller's to decide.
|
|
12
|
+
*
|
|
13
|
+
* Pure: IR and file text in, values out. Browser and Node compatible.
|
|
14
|
+
*/
|
|
15
|
+
import type { StableIdFile } from '../stable-ids/types.js';
|
|
16
|
+
import type { ProjectAnalysis } from '../types/index.js';
|
|
17
|
+
export interface FindingDiffSide {
|
|
18
|
+
project: ProjectAnalysis;
|
|
19
|
+
/** File text by repository-relative path, for every file of the tree the caller read. */
|
|
20
|
+
texts: Record<string, string>;
|
|
21
|
+
/** `ids@0.1` per file, where the ids cover the language. */
|
|
22
|
+
stableIds?: Record<string, StableIdFile>;
|
|
23
|
+
}
|
|
24
|
+
export type MatchedBy = 'stable-id' | 'rule-file-line';
|
|
25
|
+
export interface NewFinding {
|
|
26
|
+
/** Sink type for a flow, `rule_id` for a pass finding. */
|
|
27
|
+
rule: string;
|
|
28
|
+
cwe?: string;
|
|
29
|
+
/** The sink's file and line for a flow; the finding's for a pass finding. */
|
|
30
|
+
file: string;
|
|
31
|
+
line: number;
|
|
32
|
+
kind: 'flow' | 'pass';
|
|
33
|
+
/** Which ends sit on a changed line: `source` and/or `sink` for a flow, `line` for a pass finding. */
|
|
34
|
+
onChangedLine: Array<'source' | 'sink' | 'line'>;
|
|
35
|
+
/** For a flow: where its source is. */
|
|
36
|
+
source?: {
|
|
37
|
+
file: string;
|
|
38
|
+
line: number;
|
|
39
|
+
};
|
|
40
|
+
matchedBy: MatchedBy;
|
|
41
|
+
}
|
|
42
|
+
export interface FindingDiff {
|
|
43
|
+
/** 1-based lines of the new version not carried over from the old one, per file; files with none omitted. */
|
|
44
|
+
changedLines: Record<string, number[]>;
|
|
45
|
+
/** Sorted by file, line, rule. */
|
|
46
|
+
newFindings: NewFinding[];
|
|
47
|
+
/** What the comparison could not cover, sorted. */
|
|
48
|
+
partial: Array<{
|
|
49
|
+
file?: string;
|
|
50
|
+
reason: string;
|
|
51
|
+
}>;
|
|
52
|
+
/** The match methods used, sorted. */
|
|
53
|
+
matchedBy: MatchedBy[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The finding diff of a version pair. `maxDiff` bounds the line-diff edit
|
|
57
|
+
* distance per file; past it the whole file counts as changed and the file is
|
|
58
|
+
* listed in `partial`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function findingDiff(before: FindingDiffSide, after: FindingDiffSide, options?: {
|
|
61
|
+
maxDiff?: number;
|
|
62
|
+
}): FindingDiff;
|
|
63
|
+
//# sourceMappingURL=finding-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-diff.d.ts","sourceRoot":"","sources":["../../src/path-set/finding-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAInE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,yFAAyF;IACzF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,sGAAsG;IACtG,aAAa,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;IACjD,uCAAuC;IACvC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,6GAA6G;IAC7G,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,kCAAkC;IAClC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,mDAAmD;IACnD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,sCAAsC;IACtC,SAAS,EAAE,SAAS,EAAE,CAAC;CACxB;AAyDD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CAuE5H"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding diff of a version pair: the lines a change touched, and the
|
|
3
|
+
* findings at the new version whose source or sink sits on a touched line and
|
|
4
|
+
* that have no match at the old version.
|
|
5
|
+
*
|
|
6
|
+
* Findings are the engine's own: taint flows (per-file flows and cross-file
|
|
7
|
+
* paths) and the pass findings. A finding is matched at the old version by
|
|
8
|
+
* stable declaration ids where `ids@0.1` covers both versions of its files,
|
|
9
|
+
* otherwise by rule × file × line mapped through the line diff; each new
|
|
10
|
+
* finding says which. Facts only: whether a new finding matters is the
|
|
11
|
+
* caller's to decide.
|
|
12
|
+
*
|
|
13
|
+
* Pure: IR and file text in, values out. Browser and Node compatible.
|
|
14
|
+
*/
|
|
15
|
+
import { diffLines, splitLines } from './line-diff.js';
|
|
16
|
+
import { declAt, normalizeCwe } from './path-set.js';
|
|
17
|
+
function cweOf(ir, line, type) {
|
|
18
|
+
const s = ir.taint.sinks.find(x => x.line === line && x.type === type);
|
|
19
|
+
return s ? normalizeCwe(s.cwe) : undefined;
|
|
20
|
+
}
|
|
21
|
+
function findingsOf(project) {
|
|
22
|
+
const out = [];
|
|
23
|
+
const seen = new Set();
|
|
24
|
+
const add = (f) => {
|
|
25
|
+
const k = `${f.kind}|${f.rule}|${f.file}:${f.line}|${f.source?.file}:${f.source?.line}`;
|
|
26
|
+
if (seen.has(k))
|
|
27
|
+
return;
|
|
28
|
+
seen.add(k);
|
|
29
|
+
out.push(f);
|
|
30
|
+
};
|
|
31
|
+
for (const { file, analysis: ir } of project.files) {
|
|
32
|
+
for (const fl of ir.taint.flows ?? []) {
|
|
33
|
+
const cwe = cweOf(ir, fl.sink_line, fl.sink_type);
|
|
34
|
+
add({ rule: fl.sink_type, ...(cwe ? { cwe } : {}), kind: 'flow', file, line: fl.sink_line, source: { file, line: fl.source_line } });
|
|
35
|
+
}
|
|
36
|
+
for (const f of ir.findings ?? []) {
|
|
37
|
+
add({ rule: f.rule_id, ...(f.cwe ? { cwe: f.cwe } : {}), kind: 'pass', file: f.file || file, line: f.line });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
for (const p of project.taint_paths ?? []) {
|
|
41
|
+
if (!p.path_exists)
|
|
42
|
+
continue;
|
|
43
|
+
add({ rule: p.sink.type, cwe: normalizeCwe(p.sink.cwe), kind: 'flow', file: p.sink.file, line: p.sink.line, source: { file: p.source.file, line: p.source.line } });
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/** A finding's identity across versions by stable declaration ids (no line numbers). */
|
|
48
|
+
function stableKey(f, side, all) {
|
|
49
|
+
const ir = (file) => side.project.files.find(x => x.file === file)?.analysis;
|
|
50
|
+
const ids = side.stableIds ?? {};
|
|
51
|
+
const files = [f.file, ...(f.source ? [f.source.file] : [])];
|
|
52
|
+
if (!files.every(x => ids[x] && ir(x)))
|
|
53
|
+
return null;
|
|
54
|
+
const decl = (file, line) => declAt(file, ir(file), line, ids[file]).id;
|
|
55
|
+
const d = decl(f.file, f.line);
|
|
56
|
+
const s = f.source ? decl(f.source.file, f.source.line) : '';
|
|
57
|
+
// ordinal among findings of the same rule and kind in the same declarations, by position
|
|
58
|
+
const peers = all
|
|
59
|
+
.filter(o => o.kind === f.kind && o.rule === f.rule && decl(o.file, o.line) === d && (o.source ? decl(o.source.file, o.source.line) : '') === s)
|
|
60
|
+
.sort((a, b) => a.line - b.line || (a.source?.line ?? 0) - (b.source?.line ?? 0));
|
|
61
|
+
return `${f.kind}|${f.rule}|${s}|${d}|#${peers.indexOf(f)}`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The finding diff of a version pair. `maxDiff` bounds the line-diff edit
|
|
65
|
+
* distance per file; past it the whole file counts as changed and the file is
|
|
66
|
+
* listed in `partial`.
|
|
67
|
+
*/
|
|
68
|
+
export function findingDiff(before, after, options = {}) {
|
|
69
|
+
const partial = [];
|
|
70
|
+
const diffs = new Map();
|
|
71
|
+
const changedLines = {};
|
|
72
|
+
for (const file of Object.keys(after.texts).sort()) {
|
|
73
|
+
const newLines = splitLines(after.texts[file]);
|
|
74
|
+
const oldText = before.texts[file];
|
|
75
|
+
let d = diffLines(oldText === undefined ? [] : splitLines(oldText), newLines, options.maxDiff);
|
|
76
|
+
if (d === null) {
|
|
77
|
+
partial.push({ file, reason: 'diff-too-large' });
|
|
78
|
+
d = { changed: newLines.map((_, i) => i + 1), toOld: new Map() };
|
|
79
|
+
}
|
|
80
|
+
diffs.set(file, d);
|
|
81
|
+
if (d.changed.length > 0)
|
|
82
|
+
changedLines[file] = d.changed;
|
|
83
|
+
}
|
|
84
|
+
// what the analysis did not cover
|
|
85
|
+
const analysed = new Set(after.project.files.map(f => f.file));
|
|
86
|
+
for (const file of Object.keys(changedLines))
|
|
87
|
+
if (!analysed.has(file))
|
|
88
|
+
partial.push({ file, reason: 'not-analysed' });
|
|
89
|
+
for (const f of after.project.files) {
|
|
90
|
+
if (f.analysis.parse_status && !f.analysis.parse_status.success && changedLines[f.file])
|
|
91
|
+
partial.push({ file: f.file, reason: 'parse-error' });
|
|
92
|
+
}
|
|
93
|
+
if (after.project.cross_file_budget_exceeded)
|
|
94
|
+
partial.push({ reason: 'cross_file_budget_exceeded' });
|
|
95
|
+
if (after.project.per_file_budget_exceeded)
|
|
96
|
+
partial.push({ reason: 'per_file_budget_exceeded' });
|
|
97
|
+
if (after.project.project_size_budget_exceeded)
|
|
98
|
+
partial.push({ reason: 'project_size_budget_exceeded' });
|
|
99
|
+
const isChanged = (file, line) => diffs.get(file)?.changed.includes(line) ?? false;
|
|
100
|
+
const toOld = (file, line) => diffs.get(file)?.toOld.get(line);
|
|
101
|
+
const afterFindings = findingsOf(after.project);
|
|
102
|
+
const beforeFindings = findingsOf(before.project);
|
|
103
|
+
const beforeKeys = new Set(beforeFindings.map(f => stableKey(f, before, beforeFindings)).filter((k) => k !== null));
|
|
104
|
+
const newFindings = [];
|
|
105
|
+
const used = new Set();
|
|
106
|
+
for (const f of afterFindings) {
|
|
107
|
+
const on = [];
|
|
108
|
+
if (f.kind === 'pass') {
|
|
109
|
+
if (isChanged(f.file, f.line))
|
|
110
|
+
on.push('line');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
if (f.source && isChanged(f.source.file, f.source.line))
|
|
114
|
+
on.push('source');
|
|
115
|
+
if (isChanged(f.file, f.line))
|
|
116
|
+
on.push('sink');
|
|
117
|
+
}
|
|
118
|
+
if (on.length === 0)
|
|
119
|
+
continue;
|
|
120
|
+
const key = stableKey(f, after, afterFindings);
|
|
121
|
+
const beforeCovered = [f.file, ...(f.source ? [f.source.file] : [])].every(x => before.stableIds?.[x] || before.texts[x] === undefined);
|
|
122
|
+
let matched;
|
|
123
|
+
let by;
|
|
124
|
+
if (key !== null && beforeCovered) {
|
|
125
|
+
by = 'stable-id';
|
|
126
|
+
matched = beforeKeys.has(key);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
by = 'rule-file-line';
|
|
130
|
+
const sinkOld = toOld(f.file, f.line);
|
|
131
|
+
const srcOld = f.source ? toOld(f.source.file, f.source.line) : undefined;
|
|
132
|
+
matched = (sinkOld !== undefined || srcOld !== undefined) && beforeFindings.some(o => o.kind === f.kind && o.rule === f.rule && o.file === f.file &&
|
|
133
|
+
(sinkOld === undefined || o.line === sinkOld) &&
|
|
134
|
+
(!f.source || (o.source?.file === f.source.file && (srcOld === undefined || o.source.line === srcOld))));
|
|
135
|
+
}
|
|
136
|
+
used.add(by);
|
|
137
|
+
if (matched)
|
|
138
|
+
continue;
|
|
139
|
+
const nf = { rule: f.rule, file: f.file, line: f.line, kind: f.kind, onChangedLine: on, matchedBy: by };
|
|
140
|
+
if (f.cwe)
|
|
141
|
+
nf.cwe = f.cwe;
|
|
142
|
+
if (f.source)
|
|
143
|
+
nf.source = f.source;
|
|
144
|
+
newFindings.push(nf);
|
|
145
|
+
}
|
|
146
|
+
newFindings.sort((a, b) => (a.file < b.file ? -1 : a.file > b.file ? 1 : a.line - b.line || a.rule.localeCompare(b.rule)));
|
|
147
|
+
partial.sort((a, b) => ((a.file ?? '') < (b.file ?? '') ? -1 : (a.file ?? '') > (b.file ?? '') ? 1 : a.reason.localeCompare(b.reason)));
|
|
148
|
+
return { changedLines, newFindings, partial, matchedBy: [...used].sort() };
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=finding-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-diff.js","sourceRoot":"","sources":["../../src/path-set/finding-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path sets: every source-to-sink path of one CWE in an analysed tree, keyed
|
|
3
|
+
* so a path is found again in another version of the tree, and the
|
|
4
|
+
* difference between two versions with unresolved edges counted.
|
|
5
|
+
*/
|
|
6
|
+
export { pathSetOf, pathSetDiff, diffPathSets, pinFacts, pathKey, declAt, changeOf, normalizeCwe, lineDominates, handedNames, } from './path-set.js';
|
|
7
|
+
export { deriveBranchFacts, sideOf } from './branches.js';
|
|
8
|
+
export { findingDiff } from './finding-diff.js';
|
|
9
|
+
export type { FindingDiff, FindingDiffSide, NewFinding, MatchedBy } from './finding-diff.js';
|
|
10
|
+
export { diffLines, splitLines } from './line-diff.js';
|
|
11
|
+
export type { LineDiff } from './line-diff.js';
|
|
12
|
+
export { deriveTemplateFacts, templateEngineOf, expressionNames } from './templates.js';
|
|
13
|
+
export type { TemplateFact, TemplateEngine } from './templates.js';
|
|
14
|
+
export type { BranchFact, BranchCall, BranchRange, BranchSide } from './branches.js';
|
|
15
|
+
export type { PathSetInput, PathSetOptions } from './path-set.js';
|
|
16
|
+
export { PATH_KEY_SCHEME } from './types.js';
|
|
17
|
+
export type { DeclKeyScheme, DeclRef, PathHop, PathEnd, PathSource, PathSink, PathGuard, PathUnresolved, UnresolvedSite, TemplateUse, PathState, PathEntry, PathSet, PathChange, PathDiffEntry, PinFacts, PathSetDiff, } from './types.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/path-set/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxF,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,SAAS,EACT,cAAc,EACd,cAAc,EACd,WAAW,EACX,SAAS,EACT,SAAS,EACT,OAAO,EACP,UAAU,EACV,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path sets: every source-to-sink path of one CWE in an analysed tree, keyed
|
|
3
|
+
* so a path is found again in another version of the tree, and the
|
|
4
|
+
* difference between two versions with unresolved edges counted.
|
|
5
|
+
*/
|
|
6
|
+
export { pathSetOf, pathSetDiff, diffPathSets, pinFacts, pathKey, declAt, changeOf, normalizeCwe, lineDominates, handedNames, } from './path-set.js';
|
|
7
|
+
export { deriveBranchFacts, sideOf } from './branches.js';
|
|
8
|
+
export { findingDiff } from './finding-diff.js';
|
|
9
|
+
export { diffLines, splitLines } from './line-diff.js';
|
|
10
|
+
export { deriveTemplateFacts, templateEngineOf, expressionNames } from './templates.js';
|
|
11
|
+
export { PATH_KEY_SCHEME } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/path-set/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIxF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line diff of two versions of a file (Myers' O((N+M)·D) algorithm): which
|
|
3
|
+
* lines of the new version were inserted or changed, and, for every other new
|
|
4
|
+
* line, the old line it was carried over from.
|
|
5
|
+
*/
|
|
6
|
+
export interface LineDiff {
|
|
7
|
+
/** 1-based lines of the new version that are not carried over from the old one. */
|
|
8
|
+
changed: number[];
|
|
9
|
+
/** New line (1-based) → old line (1-based); absent for changed lines. */
|
|
10
|
+
toOld: Map<number, number>;
|
|
11
|
+
}
|
|
12
|
+
/** Split text into lines the way an editor counts them (a trailing newline adds no line). */
|
|
13
|
+
export declare function splitLines(text: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Diff `oldLines` against `newLines`. Returns `null` when the edit distance
|
|
16
|
+
* exceeds `maxD` (the caller then treats the whole file as changed).
|
|
17
|
+
*/
|
|
18
|
+
export declare function diffLines(oldLines: readonly string[], newLines: readonly string[], maxD?: number): LineDiff | null;
|
|
19
|
+
//# sourceMappingURL=line-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-diff.d.ts","sourceRoot":"","sources":["../../src/path-set/line-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,mFAAmF;IACnF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKjD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,SAAO,GAAG,QAAQ,GAAG,IAAI,CAwEhH"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line diff of two versions of a file (Myers' O((N+M)·D) algorithm): which
|
|
3
|
+
* lines of the new version were inserted or changed, and, for every other new
|
|
4
|
+
* line, the old line it was carried over from.
|
|
5
|
+
*/
|
|
6
|
+
/** Split text into lines the way an editor counts them (a trailing newline adds no line). */
|
|
7
|
+
export function splitLines(text) {
|
|
8
|
+
if (text === '')
|
|
9
|
+
return [];
|
|
10
|
+
const lines = text.split(/\r\n|\n|\r/);
|
|
11
|
+
if (lines[lines.length - 1] === '')
|
|
12
|
+
lines.pop();
|
|
13
|
+
return lines;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Diff `oldLines` against `newLines`. Returns `null` when the edit distance
|
|
17
|
+
* exceeds `maxD` (the caller then treats the whole file as changed).
|
|
18
|
+
*/
|
|
19
|
+
export function diffLines(oldLines, newLines, maxD = 4000) {
|
|
20
|
+
const n = oldLines.length;
|
|
21
|
+
const m = newLines.length;
|
|
22
|
+
// trim the common prefix and suffix: most edits are small
|
|
23
|
+
let pre = 0;
|
|
24
|
+
while (pre < n && pre < m && oldLines[pre] === newLines[pre])
|
|
25
|
+
pre++;
|
|
26
|
+
let suf = 0;
|
|
27
|
+
while (suf < n - pre && suf < m - pre && oldLines[n - 1 - suf] === newLines[m - 1 - suf])
|
|
28
|
+
suf++;
|
|
29
|
+
const a = oldLines.slice(pre, n - suf);
|
|
30
|
+
const b = newLines.slice(pre, m - suf);
|
|
31
|
+
const toOld = new Map();
|
|
32
|
+
for (let i = 0; i < pre; i++)
|
|
33
|
+
toOld.set(i + 1, i + 1);
|
|
34
|
+
for (let k = 0; k < suf; k++)
|
|
35
|
+
toOld.set(m - k, n - k);
|
|
36
|
+
const N = a.length;
|
|
37
|
+
const M = b.length;
|
|
38
|
+
const changed = [];
|
|
39
|
+
if (N === 0 || M === 0) {
|
|
40
|
+
if (N + M > maxD)
|
|
41
|
+
return null; // the edit distance here is every line on one side
|
|
42
|
+
for (let j = 0; j < M; j++)
|
|
43
|
+
changed.push(pre + j + 1);
|
|
44
|
+
return { changed, toOld };
|
|
45
|
+
}
|
|
46
|
+
const max = N + M;
|
|
47
|
+
const off = max;
|
|
48
|
+
let v = new Int32Array(2 * max + 2);
|
|
49
|
+
const trace = [];
|
|
50
|
+
let found = -1;
|
|
51
|
+
for (let d = 0; d <= Math.min(max, maxD); d++) {
|
|
52
|
+
trace.push(v.slice());
|
|
53
|
+
for (let k = -d; k <= d; k += 2) {
|
|
54
|
+
let x = k === -d || (k !== d && v[off + k - 1] < v[off + k + 1]) ? v[off + k + 1] : v[off + k - 1] + 1;
|
|
55
|
+
let y = x - k;
|
|
56
|
+
while (x < N && y < M && a[x] === b[y]) {
|
|
57
|
+
x++;
|
|
58
|
+
y++;
|
|
59
|
+
}
|
|
60
|
+
v[off + k] = x;
|
|
61
|
+
if (x >= N && y >= M) {
|
|
62
|
+
found = d;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (found >= 0)
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
if (found < 0)
|
|
70
|
+
return null;
|
|
71
|
+
// walk the trace back, recording the diagonal (matching) moves
|
|
72
|
+
let x = N;
|
|
73
|
+
let y = M;
|
|
74
|
+
for (let d = found; d > 0; d--) {
|
|
75
|
+
v = trace[d];
|
|
76
|
+
const k = x - y;
|
|
77
|
+
const prevK = k === -d || (k !== d && v[off + k - 1] < v[off + k + 1]) ? k + 1 : k - 1;
|
|
78
|
+
const prevX = v[off + prevK];
|
|
79
|
+
const prevY = prevX - prevK;
|
|
80
|
+
while (x > prevX && y > prevY) {
|
|
81
|
+
toOld.set(pre + y, pre + x);
|
|
82
|
+
x--;
|
|
83
|
+
y--;
|
|
84
|
+
}
|
|
85
|
+
if (prevK === k + 1)
|
|
86
|
+
changed.push(pre + y);
|
|
87
|
+
x = prevX;
|
|
88
|
+
y = prevY;
|
|
89
|
+
}
|
|
90
|
+
while (x > 0 && y > 0) {
|
|
91
|
+
toOld.set(pre + y, pre + x);
|
|
92
|
+
x--;
|
|
93
|
+
y--;
|
|
94
|
+
}
|
|
95
|
+
changed.sort((p, q) => p - q);
|
|
96
|
+
return { changed, toOld };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=line-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-diff.js","sourceRoot":"","sources":["../../src/path-set/line-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,6FAA6F;AAC7F,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAA2B,EAAE,QAA2B,EAAE,IAAI,GAAG,IAAI;IAC7F,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC1B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC;QAAE,GAAG,EAAE,CAAC;IACpE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAAE,GAAG,EAAE,CAAC;IAChG,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,mDAAmD;QAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,GAAG,GAAG,GAAG,CAAC;IAChB,IAAI,CAAC,GAAe,IAAI,UAAU,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACvG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC;YACN,CAAC;YACD,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,KAAK,GAAG,CAAC,CAAC;gBACV,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM;IACxB,CAAC;IACD,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3B,+DAA+D;IAC/D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAC5B,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YAC5B,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;QACN,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,GAAG,KAAK,CAAC;QACV,CAAC,GAAG,KAAK,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path sets of one weakness class, and their difference between two versions
|
|
3
|
+
* of a tree.
|
|
4
|
+
*
|
|
5
|
+
* `pathSetOf` collects every source-to-sink path whose sink carries the given
|
|
6
|
+
* CWE from an already analysed project (per-file `taint.flows` and project
|
|
7
|
+
* `taint_paths`) and gives each a **pin-independent key**: no line number
|
|
8
|
+
* takes part, so an edit that only shifts lines keeps every key. The key is
|
|
9
|
+
* built from the declaration that holds each end (a stable id where the
|
|
10
|
+
* caller supplies `ids@0.1` for the file, else a qualified name built from the
|
|
11
|
+
* IR), the call shape of the end, and its ordinal among same-shape ends in
|
|
12
|
+
* that declaration.
|
|
13
|
+
*
|
|
14
|
+
* `diffPathSets` compares two sets as a set operation and counts, per version,
|
|
15
|
+
* the unresolved edges and the analysis budgets hit, so an empty set on a
|
|
16
|
+
* partly analysed tree is never read as clean. Neither function judges a
|
|
17
|
+
* change: they report which paths exist where.
|
|
18
|
+
*
|
|
19
|
+
* Pure: IR in, values out. Browser and Node compatible.
|
|
20
|
+
*/
|
|
21
|
+
import { type BranchFact } from './branches.js';
|
|
22
|
+
import type { TemplateFact } from './templates.js';
|
|
23
|
+
import type { StableIdFile } from '../stable-ids/types.js';
|
|
24
|
+
import type { CallInfo, CircleIR, ProjectAnalysis, TypeInfo } from '../types/index.js';
|
|
25
|
+
import { type DeclRef, type PathChange, type PathSet, type PathSetDiff, type PathState, type PinFacts } from './types.js';
|
|
26
|
+
/** What `pathSetOf` reads: the per-file IR and, when present, cross-file paths. */
|
|
27
|
+
export type PathSetInput = Pick<ProjectAnalysis, 'files'> & Partial<Pick<ProjectAnalysis, 'taint_paths' | 'cross_file_calls'>>;
|
|
28
|
+
export interface PathSetOptions {
|
|
29
|
+
/** The weakness class, `CWE-89` or `89`. */
|
|
30
|
+
cwe: string | number;
|
|
31
|
+
/** `ids@0.1` per repository-relative file path, for files the ids cover. */
|
|
32
|
+
stableIds?: Record<string, StableIdFile>;
|
|
33
|
+
/**
|
|
34
|
+
* Branch facts per file (`deriveBranchFacts`). With them a path whose endpoint
|
|
35
|
+
* runs only on one side of a check of the path's own data is reported
|
|
36
|
+
* `guarded`; without them no path is.
|
|
37
|
+
*/
|
|
38
|
+
branches?: Record<string, BranchFact[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Template facts per template file (`deriveTemplateFacts`). With them a sink
|
|
41
|
+
* call that hands a value to a view under a literal name (`addAttribute("q", q)`)
|
|
42
|
+
* carries the template constructs that render that name (`sink.templates`).
|
|
43
|
+
*/
|
|
44
|
+
templates?: Record<string, TemplateFact[]>;
|
|
45
|
+
}
|
|
46
|
+
/** `CWE-089`, `cwe-89` and `89` all normalise to `CWE-89`. */
|
|
47
|
+
export declare function normalizeCwe(cwe: string | number): string;
|
|
48
|
+
/** `package.Type$Inner` — the qualified@0.1 name of a type. */
|
|
49
|
+
export declare function typePath(t: TypeInfo): string;
|
|
50
|
+
/** `package.Type$Inner.method(T1,T2)` — the qualified@0.1 name of a method. */
|
|
51
|
+
export declare function qualifiedMethodName(type: TypeInfo, method: TypeInfo['methods'][number]): string;
|
|
52
|
+
/** The declaration that holds `line` in `file`. */
|
|
53
|
+
export declare function declAt(file: string, ir: CircleIR, line: number, ids?: StableIdFile): DeclRef;
|
|
54
|
+
/** Names a sink call hands on as string literals (`addAttribute("q", q)` → `q`). */
|
|
55
|
+
export declare function handedNames(c: CallInfo | undefined): string[];
|
|
56
|
+
/** Does the CFG block holding line `a` dominate the block holding line `b` (same method)? */
|
|
57
|
+
export declare function lineDominates(ir: CircleIR, a: number, b: number): boolean;
|
|
58
|
+
/** The pin-independent key of a path. */
|
|
59
|
+
export declare function pathKey(cwe: string, sourceAnchor: string, sinkAnchor: string): string;
|
|
60
|
+
/** Every path of class `cwe` in one analysed tree, keyed and sorted by key. */
|
|
61
|
+
export declare function pathSetOf(project: PathSetInput, options: PathSetOptions): PathSet;
|
|
62
|
+
/** The set change between two states. */
|
|
63
|
+
export declare function changeOf(before: PathState, after: PathState): PathChange;
|
|
64
|
+
/** Unresolved edges, budget flags and parse health of one analysed tree. */
|
|
65
|
+
export declare function pinFacts(project: ProjectAnalysis, pathFiles: ReadonlySet<string>, pathCount: number): PinFacts;
|
|
66
|
+
/** Compare two path sets of the same class. */
|
|
67
|
+
export declare function diffPathSets(before: PathSet, after: PathSet): Pick<PathSetDiff, 'entries' | 'counts'>;
|
|
68
|
+
/**
|
|
69
|
+
* Every path of class `cwe` at two versions of a tree, the change per key,
|
|
70
|
+
* and per version the unresolved edges and budget flags. Path files are the
|
|
71
|
+
* union over both versions, so both pins are counted over the same region.
|
|
72
|
+
*/
|
|
73
|
+
export declare function pathSetDiff(before: ProjectAnalysis, after: ProjectAnalysis, options: {
|
|
74
|
+
cwe: string | number;
|
|
75
|
+
stableIds?: {
|
|
76
|
+
before?: Record<string, StableIdFile>;
|
|
77
|
+
after?: Record<string, StableIdFile>;
|
|
78
|
+
};
|
|
79
|
+
branches?: {
|
|
80
|
+
before?: Record<string, BranchFact[]>;
|
|
81
|
+
after?: Record<string, BranchFact[]>;
|
|
82
|
+
};
|
|
83
|
+
templates?: {
|
|
84
|
+
before?: Record<string, TemplateFact[]>;
|
|
85
|
+
after?: Record<string, TemplateFact[]>;
|
|
86
|
+
};
|
|
87
|
+
}): PathSetDiff;
|
|
88
|
+
//# sourceMappingURL=path-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-set.d.ts","sourceRoot":"","sources":["../../src/path-set/path-set.ts"],"names":[],"mappings":"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"}
|