arkanalyzer 1.0.27 → 1.0.29
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/config/arkanalyzer.json +1 -0
- package/lib/Config.d.ts.map +1 -1
- package/lib/Config.js +9 -1
- package/lib/VFG/DVFG.d.ts +43 -0
- package/lib/VFG/DVFG.d.ts.map +1 -0
- package/lib/VFG/DVFG.js +109 -0
- package/lib/VFG/builder/DVFGBuilder.d.ts +17 -0
- package/lib/VFG/builder/DVFGBuilder.d.ts.map +1 -0
- package/lib/VFG/builder/DVFGBuilder.js +111 -0
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/AbstractAnalysis.js +1 -0
- package/lib/callgraph/model/CallGraph.d.ts +5 -1
- package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
- package/lib/callgraph/model/CallGraph.js +35 -2
- package/lib/callgraph/pointerAnalysis/Pag.js +3 -3
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +11 -3
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +151 -62
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +2 -0
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +33 -7
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +7 -2
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +10 -4
- package/lib/core/base/Expr.d.ts.map +1 -1
- package/lib/core/base/Expr.js +6 -4
- package/lib/core/base/Ref.d.ts +0 -1
- package/lib/core/base/Ref.d.ts.map +1 -1
- package/lib/core/base/Ref.js +0 -11
- package/lib/core/base/Type.d.ts.map +1 -1
- package/lib/core/common/IRInference.d.ts +3 -0
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +62 -23
- package/lib/core/common/SdkUtils.js +1 -1
- package/lib/core/common/TypeInference.d.ts +5 -3
- package/lib/core/common/TypeInference.d.ts.map +1 -1
- package/lib/core/common/TypeInference.js +93 -60
- package/lib/core/dataflow/ReachingDef.d.ts.map +1 -1
- package/lib/core/dataflow/ReachingDef.js +1 -0
- package/lib/core/graph/BaseImplicitGraph.d.ts +1 -0
- package/lib/core/graph/BaseImplicitGraph.d.ts.map +1 -1
- package/lib/core/graph/BaseImplicitGraph.js +6 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -2
- package/lib/utils/pathTransfer.d.ts +1 -0
- package/lib/utils/pathTransfer.d.ts.map +1 -1
- package/lib/utils/pathTransfer.js +10 -1
- package/package.json +2 -2
package/config/arkanalyzer.json
CHANGED
package/lib/Config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD,MAAM,WAAW,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE;YACJ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;SAC3B,CAAC;KACL,CAAC;CAEL;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;AAC9G,MAAM,WAAW,YAAY;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAC,OAAO,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;CACvC;AAID,qBAAa,WAAW;IACpB,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,sBAAsB,CAAc;IAE5C,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAAa;IAE5B,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,WAAW,CAAsD;IAEzE,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,CAAC,EAAE,YAAY;IAK3B,UAAU,IAAI,YAAY;IAIjC;;;;;;;OAOG;IACI,WAAW,CACd,iBAAiB,EAAE,MAAM,EACzB,sBAAsB,EAAE,MAAM,EAC9B,IAAI,EAAE,GAAG,EAAE,EACX,YAAY,CAAC,EAAE,MAAM,EAAE;IAU3B;;;;;;;;;;;;OAYG;IACI,mBAAmB,CAAC,sBAAsB,EAAE,MAAM;IAUlD,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,EACnF,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI;IAgBxE,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,sBAAsB;IAiBvB,aAAa,CAAC,cAAc,EAAE,MAAM;IAmCpC,oBAAoB;IAIpB,yBAAyB;IAIzB,eAAe;IAIf,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;IAIzC,WAAW;IAIX,cAAc;IAId,aAAa;IAIb,UAAU;IAIjB,OAAO,CAAC,iBAAiB;CAmB5B"}
|
package/lib/Config.js
CHANGED
|
@@ -45,6 +45,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
45
45
|
const path_1 = __importDefault(require("path"));
|
|
46
46
|
const logger_1 = __importStar(require("./utils/logger"));
|
|
47
47
|
const getAllFiles_1 = require("./utils/getAllFiles");
|
|
48
|
+
const pathTransfer_1 = require("./utils/pathTransfer");
|
|
48
49
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'Config');
|
|
49
50
|
const CONFIG_FILENAME = 'arkanalyzer.json';
|
|
50
51
|
const DEFAULT_CONFIG_FILE = path_1.default.join(__dirname, '../config', CONFIG_FILENAME);
|
|
@@ -209,13 +210,20 @@ class SceneConfig {
|
|
|
209
210
|
}
|
|
210
211
|
loadDefaultConfig(options) {
|
|
211
212
|
let configFile = DEFAULT_CONFIG_FILE;
|
|
213
|
+
const modulePath = (0, pathTransfer_1.getArkAnalyzerModulePath)('arkanalyzer');
|
|
214
|
+
if (modulePath !== null) {
|
|
215
|
+
configFile = path_1.default.join(modulePath, 'config', CONFIG_FILENAME);
|
|
216
|
+
}
|
|
212
217
|
if (!fs_1.default.existsSync(configFile)) {
|
|
213
218
|
configFile = path_1.default.join(__dirname, 'config', CONFIG_FILENAME);
|
|
214
219
|
}
|
|
220
|
+
logger.info(`try to parse config file ${configFile}`);
|
|
215
221
|
try {
|
|
216
222
|
this.options = Object.assign(Object.assign({}, this.options), JSON.parse(fs_1.default.readFileSync(configFile, 'utf-8')));
|
|
217
223
|
}
|
|
218
|
-
catch (error) {
|
|
224
|
+
catch (error) {
|
|
225
|
+
logger.error(`Failed to parse config file with error: ${error}`);
|
|
226
|
+
}
|
|
219
227
|
if (options) {
|
|
220
228
|
this.options = Object.assign(Object.assign({}, this.options), options);
|
|
221
229
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BaseEdge, BaseExplicitGraph, BaseNode, NodeID } from '../core/graph/BaseExplicitGraph';
|
|
2
|
+
import { CallGraph } from '../callgraph/model/CallGraph';
|
|
3
|
+
import { Stmt } from '../core/base/Stmt';
|
|
4
|
+
/**
|
|
5
|
+
* Direct value flow graph
|
|
6
|
+
* Consist of stmt(node) and direct Def-Use edge
|
|
7
|
+
* Is basic of VFG. And VFG is building on DVFG
|
|
8
|
+
*/
|
|
9
|
+
export declare class DVFG extends BaseExplicitGraph {
|
|
10
|
+
private cg;
|
|
11
|
+
private stmtToVFGMap;
|
|
12
|
+
constructor(cg: CallGraph);
|
|
13
|
+
getCG(): CallGraph;
|
|
14
|
+
getGraphName(): string;
|
|
15
|
+
getOrNewDVFGNode(stmt: Stmt): DVFGNode;
|
|
16
|
+
addDVFGNode(stmt: Stmt, kind: DVFGNodeKind): DVFGNode;
|
|
17
|
+
addDVFGEdge(src: DVFGNode, dst: DVFGNode): boolean;
|
|
18
|
+
dump(name: string): void;
|
|
19
|
+
}
|
|
20
|
+
export declare enum DVFGNodeKind {
|
|
21
|
+
assign = 0,
|
|
22
|
+
copy = 1,
|
|
23
|
+
write = 2,
|
|
24
|
+
load = 3,
|
|
25
|
+
addr = 4,
|
|
26
|
+
if = 5,
|
|
27
|
+
actualParm = 6,
|
|
28
|
+
formalParm = 7,
|
|
29
|
+
actualRet = 8,
|
|
30
|
+
formalRet = 9,
|
|
31
|
+
unary = 10,
|
|
32
|
+
binary = 11,
|
|
33
|
+
normal = 12
|
|
34
|
+
}
|
|
35
|
+
export declare class DVFGNode extends BaseNode {
|
|
36
|
+
private stmt;
|
|
37
|
+
constructor(i: NodeID, k: DVFGNodeKind, s: Stmt);
|
|
38
|
+
getDotLabel(): string;
|
|
39
|
+
getStmt(): Stmt;
|
|
40
|
+
}
|
|
41
|
+
export declare class DVFGEdge extends BaseEdge {
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=DVFG.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DVFG.d.ts","sourceRoot":"","sources":["../../src/VFG/DVFG.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAChG,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAiB,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;;;GAIG;AACH,qBAAa,IAAK,SAAQ,iBAAiB;IACvC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,YAAY,CAAoB;gBAC5B,EAAE,EAAE,SAAS;IAMlB,KAAK,IAAI,SAAS;IAIlB,YAAY,IAAI,MAAM;IAItB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ;IAiBtC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,GAAG,QAAQ;IASrD,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO;IAalD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAIlC;AAED,oBAAY,YAAY;IACpB,MAAM,IAAA;IAAE,IAAI,IAAA;IAAE,KAAK,IAAA;IAAE,IAAI,IAAA;IAAE,IAAI,IAAA;IAAE,EAAE,IAAA;IAAE,UAAU,IAAA;IAAE,UAAU,IAAA;IAAE,SAAS,IAAA;IACtE,SAAS,IAAA;IAAE,KAAK,KAAA;IAAE,MAAM,KAAA;IAAE,MAAM,KAAA;CACnC;AAED,qBAAa,QAAS,SAAQ,QAAQ;IAClC,OAAO,CAAC,IAAI,CAAO;gBAEP,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI;IAKxC,WAAW,IAAI,MAAM;IAMrB,OAAO,IAAI,IAAI;CAGzB;AAED,qBAAa,QAAS,SAAQ,QAAQ;CAAG"}
|
package/lib/VFG/DVFG.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DVFGEdge = exports.DVFGNode = exports.DVFGNodeKind = exports.DVFG = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
const BaseExplicitGraph_1 = require("../core/graph/BaseExplicitGraph");
|
|
18
|
+
const Stmt_1 = require("../core/base/Stmt");
|
|
19
|
+
const GraphPrinter_1 = require("../save/GraphPrinter");
|
|
20
|
+
const PrinterBuilder_1 = require("../save/PrinterBuilder");
|
|
21
|
+
/**
|
|
22
|
+
* Direct value flow graph
|
|
23
|
+
* Consist of stmt(node) and direct Def-Use edge
|
|
24
|
+
* Is basic of VFG. And VFG is building on DVFG
|
|
25
|
+
*/
|
|
26
|
+
class DVFG extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
27
|
+
constructor(cg) {
|
|
28
|
+
super();
|
|
29
|
+
this.cg = cg;
|
|
30
|
+
this.stmtToVFGMap = new Map();
|
|
31
|
+
}
|
|
32
|
+
getCG() {
|
|
33
|
+
return this.cg;
|
|
34
|
+
}
|
|
35
|
+
getGraphName() {
|
|
36
|
+
return 'Direct-VFG';
|
|
37
|
+
}
|
|
38
|
+
getOrNewDVFGNode(stmt) {
|
|
39
|
+
let node = this.stmtToVFGMap.get(stmt);
|
|
40
|
+
if (node) {
|
|
41
|
+
return this.getNode(node);
|
|
42
|
+
}
|
|
43
|
+
let kind = DVFGNodeKind.normal;
|
|
44
|
+
if (stmt instanceof Stmt_1.ArkAssignStmt) {
|
|
45
|
+
//TODO: split assign to copy, write, load
|
|
46
|
+
kind = DVFGNodeKind.assign;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// TODO: handle other type of stmt
|
|
50
|
+
}
|
|
51
|
+
return this.addDVFGNode(stmt, kind);
|
|
52
|
+
}
|
|
53
|
+
addDVFGNode(stmt, kind) {
|
|
54
|
+
let id = this.nodeNum;
|
|
55
|
+
let dvfgNode = new DVFGNode(id, kind, stmt);
|
|
56
|
+
this.addNode(dvfgNode);
|
|
57
|
+
this.stmtToVFGMap.set(stmt, dvfgNode.getID());
|
|
58
|
+
return dvfgNode;
|
|
59
|
+
}
|
|
60
|
+
addDVFGEdge(src, dst) {
|
|
61
|
+
let kind = 0; //common kind
|
|
62
|
+
let edge = new DVFGEdge(src, dst, kind);
|
|
63
|
+
if (this.ifEdgeExisting(edge)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
src.addOutgoingEdge(edge);
|
|
67
|
+
dst.addIncomingEdge(edge);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
dump(name) {
|
|
71
|
+
let printer = new GraphPrinter_1.GraphPrinter(this);
|
|
72
|
+
PrinterBuilder_1.PrinterBuilder.dump(printer, name);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.DVFG = DVFG;
|
|
76
|
+
var DVFGNodeKind;
|
|
77
|
+
(function (DVFGNodeKind) {
|
|
78
|
+
DVFGNodeKind[DVFGNodeKind["assign"] = 0] = "assign";
|
|
79
|
+
DVFGNodeKind[DVFGNodeKind["copy"] = 1] = "copy";
|
|
80
|
+
DVFGNodeKind[DVFGNodeKind["write"] = 2] = "write";
|
|
81
|
+
DVFGNodeKind[DVFGNodeKind["load"] = 3] = "load";
|
|
82
|
+
DVFGNodeKind[DVFGNodeKind["addr"] = 4] = "addr";
|
|
83
|
+
DVFGNodeKind[DVFGNodeKind["if"] = 5] = "if";
|
|
84
|
+
DVFGNodeKind[DVFGNodeKind["actualParm"] = 6] = "actualParm";
|
|
85
|
+
DVFGNodeKind[DVFGNodeKind["formalParm"] = 7] = "formalParm";
|
|
86
|
+
DVFGNodeKind[DVFGNodeKind["actualRet"] = 8] = "actualRet";
|
|
87
|
+
DVFGNodeKind[DVFGNodeKind["formalRet"] = 9] = "formalRet";
|
|
88
|
+
DVFGNodeKind[DVFGNodeKind["unary"] = 10] = "unary";
|
|
89
|
+
DVFGNodeKind[DVFGNodeKind["binary"] = 11] = "binary";
|
|
90
|
+
DVFGNodeKind[DVFGNodeKind["normal"] = 12] = "normal";
|
|
91
|
+
})(DVFGNodeKind = exports.DVFGNodeKind || (exports.DVFGNodeKind = {}));
|
|
92
|
+
class DVFGNode extends BaseExplicitGraph_1.BaseNode {
|
|
93
|
+
constructor(i, k, s) {
|
|
94
|
+
super(i, k);
|
|
95
|
+
this.stmt = s;
|
|
96
|
+
}
|
|
97
|
+
getDotLabel() {
|
|
98
|
+
let label = 'ID: ' + this.getID() + '\n';
|
|
99
|
+
label = label + this.stmt.toString();
|
|
100
|
+
return label;
|
|
101
|
+
}
|
|
102
|
+
getStmt() {
|
|
103
|
+
return this.stmt;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.DVFGNode = DVFGNode;
|
|
107
|
+
class DVFGEdge extends BaseExplicitGraph_1.BaseEdge {
|
|
108
|
+
}
|
|
109
|
+
exports.DVFGEdge = DVFGEdge;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Stmt } from '../../core/base/Stmt';
|
|
2
|
+
import { ArkMethod } from '../../core/model/ArkMethod';
|
|
3
|
+
import { Scene } from '../../Scene';
|
|
4
|
+
import { DVFG } from '../DVFG';
|
|
5
|
+
export declare class DVFGBuilder {
|
|
6
|
+
private dvfg;
|
|
7
|
+
private scene;
|
|
8
|
+
constructor(dvfg: DVFG, s: Scene);
|
|
9
|
+
build(): void;
|
|
10
|
+
buildForSingleMethod(m: ArkMethod): void;
|
|
11
|
+
private getStmtUsedValues;
|
|
12
|
+
private getUsedValues;
|
|
13
|
+
getOrNewDVFGNode(stmt: Stmt): import("../DVFG").DVFGNode;
|
|
14
|
+
addDVFGNodes(): void;
|
|
15
|
+
addDVFGEdges(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=DVFGBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DVFGBuilder.d.ts","sourceRoot":"","sources":["../../../src/VFG/builder/DVFGBuilder.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAwE,IAAI,EAA6C,MAAM,sBAAsB,CAAC;AAK7J,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,qBAAa,WAAW;IACpB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,KAAK,CAAQ;gBAET,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK;IAKzB,KAAK;IAIL,oBAAoB,CAAC,CAAC,EAAE,SAAS;IAsCxC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,aAAa;IAcd,gBAAgB,CAAC,IAAI,EAAE,IAAI;IAI3B,YAAY,IAAI,IAAI;IAEpB,YAAY,IAAI,IAAI;CAC9B"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.
|
|
5
|
+
* You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
* See the License for the specific language governing permissions and
|
|
13
|
+
* limitations under the License.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.DVFGBuilder = void 0;
|
|
17
|
+
const Constant_1 = require("../../core/base/Constant");
|
|
18
|
+
const Expr_1 = require("../../core/base/Expr");
|
|
19
|
+
const Ref_1 = require("../../core/base/Ref");
|
|
20
|
+
const Stmt_1 = require("../../core/base/Stmt");
|
|
21
|
+
const ArkIRTransformer_1 = require("../../core/common/ArkIRTransformer");
|
|
22
|
+
const GenericDataFlow_1 = require("../../core/dataflow/GenericDataFlow");
|
|
23
|
+
const ReachingDef_1 = require("../../core/dataflow/ReachingDef");
|
|
24
|
+
class DVFGBuilder {
|
|
25
|
+
constructor(dvfg, s) {
|
|
26
|
+
this.dvfg = dvfg;
|
|
27
|
+
this.scene = s;
|
|
28
|
+
}
|
|
29
|
+
build() {
|
|
30
|
+
this.scene.getMethods().map(m => this.buildForSingleMethod(m));
|
|
31
|
+
}
|
|
32
|
+
buildForSingleMethod(m) {
|
|
33
|
+
let problem = new ReachingDef_1.ReachingDefProblem(m);
|
|
34
|
+
let solver = new GenericDataFlow_1.MFPDataFlowSolver();
|
|
35
|
+
let solution = solver.calculateMopSolutionForwards(problem);
|
|
36
|
+
let defMap = new Map();
|
|
37
|
+
m.getCfg().getStmts().forEach((s) => {
|
|
38
|
+
var _a;
|
|
39
|
+
let def = s.getDef();
|
|
40
|
+
if (def != null) {
|
|
41
|
+
if (def instanceof Ref_1.AbstractFieldRef) {
|
|
42
|
+
def = def.getFieldSignature();
|
|
43
|
+
}
|
|
44
|
+
let defStmts = (_a = defMap.get(def)) !== null && _a !== void 0 ? _a : new Set();
|
|
45
|
+
defStmts.add(s);
|
|
46
|
+
defMap.set(def, defStmts);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
solution.in.forEach((defs, reach) => {
|
|
50
|
+
const reachStmt = problem.flowGraph.getNode(reach);
|
|
51
|
+
this.getStmtUsedValues(reachStmt).forEach(use => {
|
|
52
|
+
var _a;
|
|
53
|
+
let target = use;
|
|
54
|
+
if (target instanceof Ref_1.AbstractFieldRef) {
|
|
55
|
+
target = target.getFieldSignature();
|
|
56
|
+
}
|
|
57
|
+
(_a = defMap.get(target)) === null || _a === void 0 ? void 0 : _a.forEach((defStmt) => {
|
|
58
|
+
let defId = problem.flowGraph.getNodeID(defStmt);
|
|
59
|
+
if (defs.test(defId)) {
|
|
60
|
+
let srcNode = this.dvfg.getOrNewDVFGNode(defStmt);
|
|
61
|
+
let dstNode = this.dvfg.getOrNewDVFGNode(reachStmt);
|
|
62
|
+
this.dvfg.addDVFGEdge(srcNode, dstNode);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getStmtUsedValues(stmt) {
|
|
69
|
+
if (stmt instanceof Stmt_1.ArkAssignStmt) {
|
|
70
|
+
return this.getUsedValues(stmt.getRightOp());
|
|
71
|
+
}
|
|
72
|
+
else if (stmt instanceof Stmt_1.ArkInvokeStmt) {
|
|
73
|
+
return this.getUsedValues(stmt.getInvokeExpr());
|
|
74
|
+
}
|
|
75
|
+
else if (stmt instanceof Stmt_1.ArkIfStmt) {
|
|
76
|
+
return this.getUsedValues(stmt.getConditionExpr());
|
|
77
|
+
}
|
|
78
|
+
else if (stmt instanceof Stmt_1.ArkReturnStmt) {
|
|
79
|
+
return this.getUsedValues(stmt.getOp());
|
|
80
|
+
}
|
|
81
|
+
else if (stmt instanceof Stmt_1.ArkThrowStmt) {
|
|
82
|
+
return this.getUsedValues(stmt.getOp());
|
|
83
|
+
}
|
|
84
|
+
else if (stmt instanceof Stmt_1.ArkReturnVoidStmt || stmt instanceof Stmt_1.ArkAliasTypeDefineStmt || stmt instanceof ArkIRTransformer_1.DummyStmt) {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
throw new Error('unsupported stmt');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
getUsedValues(val) {
|
|
92
|
+
if (val instanceof Expr_1.AbstractExpr) {
|
|
93
|
+
if (val instanceof Expr_1.AbstractInvokeExpr) {
|
|
94
|
+
return val.getArgs().flatMap((current) => { return this.getUsedValues(current); }, []);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
return val.getUses().flatMap((current) => { return this.getUsedValues(current); }, []);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (val instanceof Constant_1.Constant) {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
return [val];
|
|
104
|
+
}
|
|
105
|
+
getOrNewDVFGNode(stmt) {
|
|
106
|
+
return this.dvfg.getOrNewDVFGNode(stmt);
|
|
107
|
+
}
|
|
108
|
+
addDVFGNodes() { }
|
|
109
|
+
addDVFGEdges() { }
|
|
110
|
+
}
|
|
111
|
+
exports.DVFGBuilder = DVFGBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/AbstractAnalysis.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAiB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAIrE,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IACvB,SAAS,CAAC,EAAE,EAAG,SAAS,CAAC;IACzB,SAAS,CAAC,SAAS,EAAG,gBAAgB,CAAC;IACvC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAM;IAClC,SAAS,CAAC,eAAe,EAAG,GAAG,CAAC,MAAM,CAAC,CAAC;gBAE5B,CAAC,EAAE,KAAK;IAIb,QAAQ,IAAI,KAAK;IAIjB,YAAY,IAAI,SAAS;IAIhC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IAClF,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IAExD,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS;IAOxE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE;IAgBjD,KAAK,CAAC,sBAAsB,EAAE,OAAO,GAAG,IAAI;IA8BnD,SAAS,CAAC,IAAI,IAAI,IAAI;IAOtB,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"AbstractAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/AbstractAnalysis.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAiB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAIrE,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IACvB,SAAS,CAAC,EAAE,EAAG,SAAS,CAAC;IACzB,SAAS,CAAC,SAAS,EAAG,gBAAgB,CAAC;IACvC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAM;IAClC,SAAS,CAAC,eAAe,EAAG,GAAG,CAAC,MAAM,CAAC,CAAC;gBAE5B,CAAC,EAAE,KAAK;IAIb,QAAQ,IAAI,KAAK;IAIjB,YAAY,IAAI,SAAS;IAIhC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IAClF,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IAExD,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS;IAOxE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE;IAgBjD,KAAK,CAAC,sBAAsB,EAAE,OAAO,GAAG,IAAI;IA8BnD,SAAS,CAAC,IAAI,IAAI,IAAI;IAOtB,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;IA0BrD,SAAS,CAAC,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,eAAe,EAAE;IAapF,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,sBAAsB,EAAE,OAAO,GAAG,IAAI;CAU5H"}
|
|
@@ -117,6 +117,7 @@ class AbstractAnalysis {
|
|
|
117
117
|
this.resolveCall(cgNode.getID(), stmt).forEach((callSite) => {
|
|
118
118
|
calleeMethods.push(callSite);
|
|
119
119
|
this.cg.addStmtToCallSiteMap(stmt, callSite);
|
|
120
|
+
this.cg.addMethodToCallSiteMap(callSite.calleeFuncID, callSite);
|
|
120
121
|
});
|
|
121
122
|
}
|
|
122
123
|
});
|
|
@@ -63,6 +63,7 @@ export declare class CallGraph extends BaseExplicitGraph {
|
|
|
63
63
|
private stmtToDynCallSitemap;
|
|
64
64
|
private methodToCGNodeMap;
|
|
65
65
|
private callPairToEdgeMap;
|
|
66
|
+
private methodToCallSiteMap;
|
|
66
67
|
private callSiteNum;
|
|
67
68
|
private entries;
|
|
68
69
|
private cgStat;
|
|
@@ -79,7 +80,10 @@ export declare class CallGraph extends BaseExplicitGraph {
|
|
|
79
80
|
addDynamicCallEdge(callerID: NodeID, calleeID: NodeID, callStmt: Stmt): void;
|
|
80
81
|
getDynCallsiteByStmt(stmt: Stmt): DynCallSite | undefined;
|
|
81
82
|
addStmtToCallSiteMap(stmt: Stmt, cs: CallSite): boolean;
|
|
82
|
-
getCallSiteByStmt(stmt: Stmt): CallSite
|
|
83
|
+
getCallSiteByStmt(stmt: Stmt): CallSite[];
|
|
84
|
+
addMethodToCallSiteMap(funcID: FuncID, cs: CallSite): void;
|
|
85
|
+
getCallSitesByMethod(func: FuncID | MethodSignature): Set<CallSite>;
|
|
86
|
+
getInvokeStmtByMethod(func: FuncID | MethodSignature): Stmt[];
|
|
83
87
|
getDynEdges(): Map<Method, Set<Method>>;
|
|
84
88
|
getMethodByFuncID(id: FuncID): Method | null;
|
|
85
89
|
getArkMethodByFuncID(id: FuncID): ArkMethod | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CallGraph.d.ts","sourceRoot":"","sources":["../../../src/callgraph/model/CallGraph.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGvD,MAAM,MAAM,MAAM,GAAG,eAAe,CAAC;AACrC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAChC,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAG5B,oBAAY,iBAAiB;IACzB,IAAI,IAAA;IAAE,MAAM,IAAA;IAAE,SAAS,IAAA;IAAE,WAAW,IAAA;CACvC;AAED,qBAAa,QAAQ;IACV,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;gBAEhB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;CAMtE;AAED,qBAAa,WAAW;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IAC1B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEtC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS;CAM7F;AAED,qBAAa,UAAW,SAAQ,QAAQ;IAC7B,GAAG,EAAE,SAAS,CAAC;gBAEV,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ;CAI1C;AAED,qBAAa,aAAc,SAAQ,QAAQ;IACvC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,aAAa,CAAsB;gBAG/B,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa;IAI3C,iBAAiB,CAAC,IAAI,EAAE,IAAI;IAI5B,kBAAkB,CAAC,IAAI,EAAE,IAAI;IAI7B,mBAAmB,CAAC,IAAI,EAAE,IAAI;IAI9B,UAAU,IAAI,MAAM;CAkB9B;AAED,qBAAa,aAAc,SAAQ,QAAQ;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,OAAO,CAAkB;gBAErB,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAE,iBAA0C;IAKzE,SAAS,IAAI,MAAM;IAInB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAI9B,WAAW,IAAI,OAAO;IAI7B,IAAW,aAAa,IAAI,OAAO,CAElC;IAED,IAAW,aAAa,CAAC,EAAE,EAAE,OAAO,EAEnC;IAEM,UAAU,IAAI,MAAM;IAOpB,WAAW,IAAI,MAAM;CAK/B;AAED,qBAAa,SAAU,SAAQ,iBAAiB;IAC5C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"CallGraph.d.ts","sourceRoot":"","sources":["../../../src/callgraph/model/CallGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.CallGraph = exports.CallGraphNode = exports.CallGraphEdge = exports.CSCallSite = exports.DynCallSite = exports.CallSite = exports.CallGraphNodeKind = void 0;
|
|
18
|
+
const ArkSignature_1 = require("../../core/model/ArkSignature");
|
|
18
19
|
const GraphPrinter_1 = require("../../save/GraphPrinter");
|
|
19
20
|
const PrinterBuilder_1 = require("../../save/PrinterBuilder");
|
|
20
21
|
const BaseExplicitGraph_1 = require("../../core/graph/BaseExplicitGraph");
|
|
@@ -135,6 +136,7 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
135
136
|
this.stmtToDynCallSitemap = new Map();
|
|
136
137
|
this.methodToCGNodeMap = new Map();
|
|
137
138
|
this.callPairToEdgeMap = new Map();
|
|
139
|
+
this.methodToCallSiteMap = new Map();
|
|
138
140
|
this.callSiteNum = 0;
|
|
139
141
|
this.scene = s;
|
|
140
142
|
this.cgStat = new Statistics_1.CGStat();
|
|
@@ -251,14 +253,45 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
251
253
|
return this.stmtToDynCallSitemap.get(stmt);
|
|
252
254
|
}
|
|
253
255
|
addStmtToCallSiteMap(stmt, cs) {
|
|
256
|
+
var _a;
|
|
254
257
|
if (this.stmtToCallSitemap.has(stmt)) {
|
|
258
|
+
let callSites = (_a = this.stmtToCallSitemap.get(stmt)) !== null && _a !== void 0 ? _a : [];
|
|
259
|
+
this.stmtToCallSitemap.set(stmt, [...callSites, cs]);
|
|
255
260
|
return false;
|
|
256
261
|
}
|
|
257
|
-
this.stmtToCallSitemap.set(stmt, cs);
|
|
262
|
+
this.stmtToCallSitemap.set(stmt, [cs]);
|
|
258
263
|
return true;
|
|
259
264
|
}
|
|
260
265
|
getCallSiteByStmt(stmt) {
|
|
261
|
-
|
|
266
|
+
var _a;
|
|
267
|
+
return (_a = this.stmtToCallSitemap.get(stmt)) !== null && _a !== void 0 ? _a : [];
|
|
268
|
+
}
|
|
269
|
+
addMethodToCallSiteMap(funcID, cs) {
|
|
270
|
+
if (this.methodToCallSiteMap.has(funcID)) {
|
|
271
|
+
this.methodToCallSiteMap.get(funcID).add(cs);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.methodToCallSiteMap.set(funcID, new Set([cs]));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
getCallSitesByMethod(func) {
|
|
278
|
+
var _a;
|
|
279
|
+
let funcID;
|
|
280
|
+
if (func instanceof ArkSignature_1.MethodSignature) {
|
|
281
|
+
funcID = this.getCallGraphNodeByMethod(func).getID();
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
funcID = func;
|
|
285
|
+
}
|
|
286
|
+
return (_a = this.methodToCallSiteMap.get(funcID)) !== null && _a !== void 0 ? _a : new Set();
|
|
287
|
+
}
|
|
288
|
+
getInvokeStmtByMethod(func) {
|
|
289
|
+
let callSites = this.getCallSitesByMethod(func);
|
|
290
|
+
let invokeStmts = [];
|
|
291
|
+
callSites.forEach((cs) => {
|
|
292
|
+
invokeStmts.push(cs.callStmt);
|
|
293
|
+
});
|
|
294
|
+
return invokeStmts;
|
|
262
295
|
}
|
|
263
296
|
getDynEdges() {
|
|
264
297
|
let callMap = new Map();
|
|
@@ -610,7 +610,7 @@ class Pag extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
610
610
|
return undefined;
|
|
611
611
|
}
|
|
612
612
|
addPagNode(cid, value, stmt, refresh = true) {
|
|
613
|
-
let id = this.nodeNum;
|
|
613
|
+
let id = this.nodeNum + 1;
|
|
614
614
|
let pagNode;
|
|
615
615
|
if (value instanceof Local_1.Local) {
|
|
616
616
|
pagNode = this.handleLocalNode(id, cid, value, stmt);
|
|
@@ -738,13 +738,13 @@ class Pag extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
738
738
|
* but point to node info
|
|
739
739
|
*/
|
|
740
740
|
addPagThisRefNode(value) {
|
|
741
|
-
let id = this.nodeNum;
|
|
741
|
+
let id = this.nodeNum + 1;
|
|
742
742
|
let pagNode = new PagThisRefNode(id, value);
|
|
743
743
|
this.addNode(pagNode);
|
|
744
744
|
return pagNode;
|
|
745
745
|
}
|
|
746
746
|
addPagThisLocalNode(ptNode, value) {
|
|
747
|
-
let id = this.nodeNum;
|
|
747
|
+
let id = this.nodeNum + 1;
|
|
748
748
|
let pagNode = new PagLocalNode(id, ptNode, value);
|
|
749
749
|
this.addNode(pagNode);
|
|
750
750
|
return pagNode;
|
|
@@ -8,6 +8,7 @@ import { NodeID } from '../../core/graph/BaseExplicitGraph';
|
|
|
8
8
|
import { ContextID } from './Context';
|
|
9
9
|
import { FuncPag, InterFuncPag, Pag, PagNode, PagNodeType, StorageType } from './Pag';
|
|
10
10
|
import { IPtsCollection } from './PtsDS';
|
|
11
|
+
import { PtaAnalysisScale } from './PointerAnalysisConfig';
|
|
11
12
|
export declare class CSFuncID {
|
|
12
13
|
cid: ContextID;
|
|
13
14
|
funcID: FuncID;
|
|
@@ -16,6 +17,7 @@ export declare class CSFuncID {
|
|
|
16
17
|
export declare class PagBuilder {
|
|
17
18
|
private pag;
|
|
18
19
|
private cg;
|
|
20
|
+
private scale;
|
|
19
21
|
private funcPags;
|
|
20
22
|
private interFuncPags?;
|
|
21
23
|
private handledFunc;
|
|
@@ -29,7 +31,7 @@ export declare class PagBuilder {
|
|
|
29
31
|
private cid2ThisRefMap;
|
|
30
32
|
private cid2ThisLocalMap;
|
|
31
33
|
private sdkMethodReturnValueMap;
|
|
32
|
-
private
|
|
34
|
+
private methodParamValueMap;
|
|
33
35
|
private fakeSdkMethodParamDeclaringStmt;
|
|
34
36
|
private funcHandledThisRound;
|
|
35
37
|
private updatedNodesThisRound;
|
|
@@ -38,19 +40,24 @@ export declare class PagBuilder {
|
|
|
38
40
|
private globalThisPagNode?;
|
|
39
41
|
private storagePropertyMap;
|
|
40
42
|
private externalScopeVariableMap;
|
|
41
|
-
constructor(p: Pag, cg: CallGraph, s: Scene, kLimit: number);
|
|
43
|
+
constructor(p: Pag, cg: CallGraph, s: Scene, kLimit: number, scale: PtaAnalysisScale);
|
|
42
44
|
private buildFuncPagAndAddToWorklist;
|
|
43
45
|
private addToFuncHandledListThisRound;
|
|
44
46
|
buildForEntries(funcIDs: FuncID[]): void;
|
|
45
47
|
handleReachable(): boolean;
|
|
46
48
|
build(): void;
|
|
47
49
|
buildFuncPag(funcID: FuncID): boolean;
|
|
50
|
+
private buildInvokeExprInAssignStmt;
|
|
51
|
+
private addFuncPagCallSite;
|
|
52
|
+
private buildInvokeExprInInvokeStmt;
|
|
48
53
|
/**
|
|
49
54
|
* will not create real funcPag, only create param values
|
|
50
55
|
*/
|
|
51
56
|
private buildSDKFuncPag;
|
|
57
|
+
private createDummyParamValue;
|
|
58
|
+
private createDummyParamPagNodes;
|
|
52
59
|
buildPagFromFuncPag(funcID: FuncID, cid: ContextID): void;
|
|
53
|
-
addEdgesFromFuncPag(funcPag: FuncPag, cid: ContextID): boolean;
|
|
60
|
+
addEdgesFromFuncPag(funcPag: FuncPag, cid: ContextID, funcID: FuncID): boolean;
|
|
54
61
|
addCallsEdgesFromFuncPag(funcPag: FuncPag, cid: ContextID): boolean;
|
|
55
62
|
/**
|
|
56
63
|
* process Storage API
|
|
@@ -74,6 +81,7 @@ export declare class PagBuilder {
|
|
|
74
81
|
handleUnprocessedCallSites(processedCallSites: Set<DynCallSite>): NodeID[];
|
|
75
82
|
private addThisRefCallEdge;
|
|
76
83
|
addStaticPagCallEdge(cs: CallSite, callerCid: ContextID, calleeCid?: ContextID): NodeID[];
|
|
84
|
+
addStaticPagCallReturnEdge(cs: CallSite, callerCid: ContextID, calleeCid: ContextID): NodeID[];
|
|
77
85
|
addCallParamPagEdge(params: Value[], cs: CallSite, callerCid: ContextID, calleeCid: ContextID): NodeID[];
|
|
78
86
|
private addSDKMethodPagCallEdge;
|
|
79
87
|
private addSDKMethodReturnPagEdge;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PagBuilder.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PagBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAoC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAA+C,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAUxF,OAAO,EAMH,UAAU,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG9C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAM5D,OAAO,EAAE,SAAS,EAAuC,MAAM,WAAW,CAAC;AAC3E,OAAO,EACH,OAAO,EACP,YAAY,EAGZ,GAAG,EAMH,OAAO,EACP,WAAW,EAGX,WAAW,EACd,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"PagBuilder.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PagBuilder.ts"],"names":[],"mappings":"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"}
|