arkanalyzer 1.0.42 → 1.0.44
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/lib/Scene.d.ts +1 -2
- package/lib/Scene.d.ts.map +1 -1
- package/lib/Scene.js +59 -47
- package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts +11 -5
- package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PTAUtils.js +42 -24
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +6 -11
- package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.js +26 -23
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +11 -63
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +62 -495
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +4 -2
- package/lib/callgraph/pointerAnalysis/plugins/ContainerPlugin.d.ts +24 -0
- package/lib/callgraph/pointerAnalysis/plugins/ContainerPlugin.d.ts.map +1 -0
- package/lib/callgraph/pointerAnalysis/plugins/ContainerPlugin.js +167 -0
- package/lib/callgraph/pointerAnalysis/plugins/FunctionPlugin.d.ts +26 -0
- package/lib/callgraph/pointerAnalysis/plugins/FunctionPlugin.d.ts.map +1 -0
- package/lib/callgraph/pointerAnalysis/plugins/FunctionPlugin.js +151 -0
- package/lib/callgraph/pointerAnalysis/plugins/IPagPlugin.d.ts +15 -0
- package/lib/callgraph/pointerAnalysis/plugins/IPagPlugin.d.ts.map +1 -0
- package/lib/callgraph/pointerAnalysis/plugins/IPagPlugin.js +16 -0
- package/lib/callgraph/pointerAnalysis/plugins/PluginManager.d.ts +25 -0
- package/lib/callgraph/pointerAnalysis/plugins/PluginManager.d.ts.map +1 -0
- package/lib/callgraph/pointerAnalysis/plugins/PluginManager.js +66 -0
- package/lib/callgraph/pointerAnalysis/plugins/SdkPlugin.d.ts +37 -0
- package/lib/callgraph/pointerAnalysis/plugins/SdkPlugin.d.ts.map +1 -0
- package/lib/callgraph/pointerAnalysis/plugins/SdkPlugin.js +160 -0
- package/lib/callgraph/pointerAnalysis/plugins/StoragePlugin.d.ts +68 -0
- package/lib/callgraph/pointerAnalysis/plugins/StoragePlugin.d.ts.map +1 -0
- package/lib/callgraph/pointerAnalysis/plugins/StoragePlugin.js +288 -0
- package/lib/core/common/DummyMainCreater.js +1 -1
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +4 -0
- package/lib/core/common/SdkUtils.d.ts +1 -1
- package/lib/core/common/SdkUtils.d.ts.map +1 -1
- package/lib/core/common/SdkUtils.js +18 -18
- package/lib/core/common/TypeInference.d.ts.map +1 -1
- package/lib/core/common/TypeInference.js +11 -2
- package/lib/core/graph/builder/CfgBuilder.js +1 -1
- package/lib/core/graph/builder/ConditionBuilder.js +1 -1
- package/lib/core/model/ArkClass.d.ts.map +1 -1
- package/lib/core/model/ArkClass.js +2 -1
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +1 -0
- package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkMethodBuilder.js +40 -5
- package/lib/core/model/builder/BodyBuilder.js +1 -1
- package/lib/pass/Dispatcher.d.ts +2 -2
- package/lib/pass/Dispatcher.d.ts.map +1 -1
- package/lib/pass/Pass.d.ts +3 -3
- package/lib/pass/Pass.d.ts.map +1 -1
- package/lib/pass/ScenePassMgr.d.ts +4 -4
- package/lib/pass/ScenePassMgr.d.ts.map +1 -1
- package/lib/pass/validators/Exprs.d.ts +9 -0
- package/lib/pass/validators/Exprs.d.ts.map +1 -0
- package/lib/pass/validators/Exprs.js +40 -0
- package/lib/pass/validators/Models.d.ts +14 -0
- package/lib/pass/validators/Models.d.ts.map +1 -0
- package/lib/pass/validators/Models.js +42 -0
- package/lib/pass/validators/SceneValidator.d.ts +19 -0
- package/lib/pass/validators/SceneValidator.d.ts.map +1 -0
- package/lib/pass/validators/SceneValidator.js +77 -0
- package/lib/pass/validators/Stmts.d.ts +7 -0
- package/lib/pass/validators/Stmts.d.ts.map +1 -0
- package/lib/pass/validators/Stmts.js +36 -0
- package/lib/pass/{SceneValidator.d.ts → validators/Validator.d.ts} +100 -108
- package/lib/pass/validators/Validator.d.ts.map +1 -0
- package/lib/pass/{SceneValidator.js → validators/Validator.js} +147 -143
- package/lib/pass/validators/Values.d.ts +7 -0
- package/lib/pass/validators/Values.d.ts.map +1 -0
- package/lib/pass/validators/Values.js +34 -0
- package/lib/save/source/SourceStmt.js +1 -1
- package/lib/save/source/SourceTransformer.d.ts.map +1 -1
- package/lib/save/source/SourceTransformer.js +16 -1
- package/lib/utils/FileUtils.js +1 -1
- package/package.json +2 -2
- package/lib/pass/SceneValidator.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PointerAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PointerAnalysis.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAG5D,OAAO,EAAE,SAAS,EAAiB,QAAQ,EAAe,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAa,IAAI,EAAe,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAI5C,OAAO,EAAE,GAAG,EAAgF,MAAM,OAAO,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAoB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"PointerAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PointerAnalysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -272,7 +272,8 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
272
272
|
// clone the real field node with abstract field node
|
|
273
273
|
let dstNode;
|
|
274
274
|
if (fieldNode instanceof Pag_1.PagArrayNode) {
|
|
275
|
-
|
|
275
|
+
let arrayBase = fieldNode.getValue().getBase();
|
|
276
|
+
dstNode = this.pag.getOrClonePagContainerFieldNode(pt, arrayBase, 'Array');
|
|
276
277
|
}
|
|
277
278
|
else {
|
|
278
279
|
dstNode = this.pag.getOrClonePagFieldNode(fieldNode, pt);
|
|
@@ -297,7 +298,8 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
297
298
|
for (let pt of diffPts) {
|
|
298
299
|
let srcNode;
|
|
299
300
|
if (fieldNode instanceof Pag_1.PagArrayNode) {
|
|
300
|
-
|
|
301
|
+
let arrayBase = fieldNode.getValue().getBase();
|
|
302
|
+
srcNode = this.pag.getOrClonePagContainerFieldNode(pt, arrayBase, 'Array');
|
|
301
303
|
}
|
|
302
304
|
else {
|
|
303
305
|
srcNode = this.pag.getOrClonePagFieldNode(fieldNode, pt);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { NodeID } from '../../../core/graph/GraphTraits';
|
|
2
|
+
import { CallGraph, CallGraphNode, ICallSite } from '../../model/CallGraph';
|
|
3
|
+
import { ContextID } from '../context/Context';
|
|
4
|
+
import { Pag } from '../Pag';
|
|
5
|
+
import { PagBuilder } from '../PagBuilder';
|
|
6
|
+
import { IPagPlugin } from './IPagPlugin';
|
|
7
|
+
/**
|
|
8
|
+
* ContainerPlugin processes built-in container APIs like Array, Set, and Map.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ContainerPlugin implements IPagPlugin {
|
|
11
|
+
pag: Pag;
|
|
12
|
+
pagBuilder: PagBuilder;
|
|
13
|
+
cg: CallGraph;
|
|
14
|
+
constructor(pag: Pag, pagBuilder: PagBuilder, cg: CallGraph);
|
|
15
|
+
getName(): string;
|
|
16
|
+
canHandle(cs: ICallSite, cgNode: CallGraphNode): boolean;
|
|
17
|
+
processCallSite(cs: ICallSite, cid: ContextID, basePTNode: NodeID): NodeID[];
|
|
18
|
+
private processArrayPush;
|
|
19
|
+
private processSetAdd;
|
|
20
|
+
private processMapSet;
|
|
21
|
+
private processMapGet;
|
|
22
|
+
private processForeach;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ContainerPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContainerPlugin.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/pointerAnalysis/plugins/ContainerPlugin.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAU,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAiD,MAAM,QAAQ,CAAC;AAC5E,OAAO,EAAY,UAAU,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc1C;;GAEG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAC9C,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,SAAS,CAAC;gBAEF,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS;IAM3D,OAAO,IAAI,MAAM;IAIjB,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;IAWxD,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAiC5E,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,cAAc;CA0BzB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ContainerPlugin = void 0;
|
|
18
|
+
const Pag_1 = require("../Pag");
|
|
19
|
+
const PagBuilder_1 = require("../PagBuilder");
|
|
20
|
+
const PTAUtils_1 = require("../PTAUtils");
|
|
21
|
+
const Stmt_1 = require("../../../core/base/Stmt");
|
|
22
|
+
const Type_1 = require("../../../core/base/Type");
|
|
23
|
+
// built-in container APIs
|
|
24
|
+
const containerApiList = [
|
|
25
|
+
PTAUtils_1.BuiltApiType.ArrayPush,
|
|
26
|
+
PTAUtils_1.BuiltApiType.MapSet,
|
|
27
|
+
PTAUtils_1.BuiltApiType.MapGet,
|
|
28
|
+
PTAUtils_1.BuiltApiType.SetAdd,
|
|
29
|
+
PTAUtils_1.BuiltApiType.Foreach,
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* ContainerPlugin processes built-in container APIs like Array, Set, and Map.
|
|
33
|
+
*/
|
|
34
|
+
class ContainerPlugin {
|
|
35
|
+
constructor(pag, pagBuilder, cg) {
|
|
36
|
+
this.pag = pag;
|
|
37
|
+
this.pagBuilder = pagBuilder;
|
|
38
|
+
this.cg = cg;
|
|
39
|
+
}
|
|
40
|
+
getName() {
|
|
41
|
+
return 'ContainerPlugin';
|
|
42
|
+
}
|
|
43
|
+
canHandle(cs, cgNode) {
|
|
44
|
+
let calleeFuncID = cs.getCalleeFuncID();
|
|
45
|
+
let calleeMethod = this.cg.getArkMethodByFuncID(calleeFuncID);
|
|
46
|
+
if (!calleeMethod) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
let methodType = (0, PTAUtils_1.getBuiltInApiType)(calleeMethod.getSignature());
|
|
50
|
+
return containerApiList.includes(methodType);
|
|
51
|
+
}
|
|
52
|
+
processCallSite(cs, cid, basePTNode) {
|
|
53
|
+
const baseValue = cs.callStmt.getInvokeExpr().getBase();
|
|
54
|
+
const baseNode = this.pag.getNode(basePTNode);
|
|
55
|
+
const calleeFuncID = cs.getCalleeFuncID();
|
|
56
|
+
const calleeMethod = this.cg.getArkMethodByFuncID(calleeFuncID);
|
|
57
|
+
const methodType = (0, PTAUtils_1.getBuiltInApiType)(calleeMethod.getSignature());
|
|
58
|
+
let srcNodes = [];
|
|
59
|
+
if (!(baseNode instanceof Pag_1.PagNewContainerExprNode)) {
|
|
60
|
+
return srcNodes;
|
|
61
|
+
}
|
|
62
|
+
switch (methodType) {
|
|
63
|
+
case PTAUtils_1.BuiltApiType.ArrayPush:
|
|
64
|
+
// TODO: process push(...[])
|
|
65
|
+
this.processArrayPush(cs, cid, basePTNode, baseValue, srcNodes);
|
|
66
|
+
break;
|
|
67
|
+
case PTAUtils_1.BuiltApiType.SetAdd:
|
|
68
|
+
this.processSetAdd(cs, cid, basePTNode, baseValue, srcNodes);
|
|
69
|
+
break;
|
|
70
|
+
case PTAUtils_1.BuiltApiType.MapSet:
|
|
71
|
+
this.processMapSet(cs, cid, basePTNode, baseValue, srcNodes);
|
|
72
|
+
break;
|
|
73
|
+
case PTAUtils_1.BuiltApiType.MapGet:
|
|
74
|
+
this.processMapGet(cs, cid, basePTNode, baseValue, srcNodes);
|
|
75
|
+
case PTAUtils_1.BuiltApiType.Foreach:
|
|
76
|
+
this.processForeach(cs, cid, basePTNode, baseValue, srcNodes, calleeMethod);
|
|
77
|
+
break;
|
|
78
|
+
default:
|
|
79
|
+
}
|
|
80
|
+
;
|
|
81
|
+
return srcNodes;
|
|
82
|
+
}
|
|
83
|
+
processArrayPush(cs, cid, basePt, baseValue, srcNodes) {
|
|
84
|
+
const argIndex = 0;
|
|
85
|
+
let argValue = cs.args[argIndex];
|
|
86
|
+
if (!argValue) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const argNode = this.pag.getOrNewNode(cid, argValue, cs.callStmt);
|
|
90
|
+
const containerFieldNode = this.pag.getOrClonePagContainerFieldNode(basePt, baseValue, 'Array');
|
|
91
|
+
if (!containerFieldNode) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this.pag.addPagEdge(argNode, containerFieldNode, Pag_1.PagEdgeKind.Copy, cs.callStmt);
|
|
95
|
+
srcNodes.push(argNode.getID());
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
processSetAdd(cs, cid, basePt, baseValue, srcNodes) {
|
|
99
|
+
const argIndex = 0;
|
|
100
|
+
let argValue = cs.args[argIndex];
|
|
101
|
+
if (!argValue) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const argNode = this.pag.getOrNewNode(cid, argValue, cs.callStmt);
|
|
105
|
+
const containerFieldNode = this.pag.getOrClonePagContainerFieldNode(basePt, baseValue, 'Set');
|
|
106
|
+
if (!containerFieldNode) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.pag.addPagEdge(argNode, containerFieldNode, Pag_1.PagEdgeKind.Copy, cs.callStmt);
|
|
110
|
+
srcNodes.push(argNode.getID());
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
processMapSet(cs, cid, basePt, baseValue, srcNodes) {
|
|
114
|
+
const argIndex = 1;
|
|
115
|
+
let argValue = cs.args[argIndex];
|
|
116
|
+
if (!argValue) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const argNode = this.pag.getOrNewNode(cid, argValue, cs.callStmt);
|
|
120
|
+
const containerFieldNode = this.pag.getOrClonePagContainerFieldNode(basePt, baseValue, 'Map');
|
|
121
|
+
if (!containerFieldNode) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.pag.addPagEdge(argNode, containerFieldNode, Pag_1.PagEdgeKind.Copy, cs.callStmt);
|
|
125
|
+
srcNodes.push(argNode.getID());
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
processMapGet(cs, cid, basePt, baseValue, srcNodes) {
|
|
129
|
+
const ivkExpr = cs.callStmt.getInvokeExpr();
|
|
130
|
+
if (!ivkExpr || !(cs.callStmt instanceof Stmt_1.ArkAssignStmt)) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const leftValue = cs.callStmt.getLeftOp();
|
|
134
|
+
const leftValueNode = this.pag.getOrNewNode(cid, leftValue, cs.callStmt);
|
|
135
|
+
const containerFieldNode = this.pag.getOrClonePagContainerFieldNode(basePt, baseValue, 'Map');
|
|
136
|
+
if (!containerFieldNode) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
this.pag.addPagEdge(containerFieldNode, leftValueNode, Pag_1.PagEdgeKind.Copy, cs.callStmt);
|
|
140
|
+
srcNodes.push(containerFieldNode.getID());
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
processForeach(cs, cid, basePt, baseValue, srcNodes, calleeMethod) {
|
|
144
|
+
const containerName = calleeMethod.getDeclaringArkClass().getName();
|
|
145
|
+
const callbackLocalType = cs.args[0].getType();
|
|
146
|
+
if (!(callbackLocalType instanceof Type_1.FunctionType)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const callbackMethodSig = callbackLocalType.getMethodSignature();
|
|
150
|
+
const callbackNode = this.cg.getCallGraphNodeByMethod(callbackMethodSig);
|
|
151
|
+
const callbackFuncID = callbackNode.getID();
|
|
152
|
+
const callbackMethod = this.cg.getArkMethodByFuncID(callbackFuncID);
|
|
153
|
+
const containerFieldNode = this.pag.getOrClonePagContainerFieldNode(basePt, baseValue, containerName);
|
|
154
|
+
let calleeCid = this.pagBuilder.getContextSelector().selectContext(cid, cs, basePt, callbackFuncID);
|
|
155
|
+
const paramRefValues = callbackMethod === null || callbackMethod === void 0 ? void 0 : callbackMethod.getParameterRefs();
|
|
156
|
+
if (!paramRefValues || paramRefValues.length < 1) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const elementRef = paramRefValues[0];
|
|
160
|
+
const elementNode = this.pag.getOrNewNode(calleeCid, elementRef, cs.callStmt);
|
|
161
|
+
this.pag.addPagEdge(containerFieldNode, elementNode, Pag_1.PagEdgeKind.Copy, cs.callStmt);
|
|
162
|
+
srcNodes.push(containerFieldNode.getID());
|
|
163
|
+
this.pagBuilder.buildFuncPagAndAddToWorklist(new PagBuilder_1.CSFuncID(calleeCid, callbackFuncID));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.ContainerPlugin = ContainerPlugin;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { NodeID } from '../../../core/graph/GraphTraits';
|
|
2
|
+
import { CallGraphNode, CallGraph } from '../../model/CallGraph';
|
|
3
|
+
import { ICallSite, CallSite } from '../../model/CallSite';
|
|
4
|
+
import { ContextID } from '../context/Context';
|
|
5
|
+
import { Pag } from '../Pag';
|
|
6
|
+
import { PagBuilder } from '../PagBuilder';
|
|
7
|
+
import { IPagPlugin } from './IPagPlugin';
|
|
8
|
+
/**
|
|
9
|
+
* FunctionPlugin processes Function.call, Function.apply, Function.bind.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FunctionPlugin implements IPagPlugin {
|
|
12
|
+
pag: Pag;
|
|
13
|
+
pagBuilder: PagBuilder;
|
|
14
|
+
cg: CallGraph;
|
|
15
|
+
constructor(pag: Pag, pagBuilder: PagBuilder, cg: CallGraph);
|
|
16
|
+
getName(): string;
|
|
17
|
+
canHandle(cs: ICallSite, cgNode: CallGraphNode): boolean;
|
|
18
|
+
processCallSite(cs: CallSite, cid: ContextID, basePTNode: NodeID): NodeID[];
|
|
19
|
+
private handleFunctionCall;
|
|
20
|
+
private handleFunctionApply;
|
|
21
|
+
private handleFunctionBind;
|
|
22
|
+
private transferArrayValues;
|
|
23
|
+
private setFunctionThisPt;
|
|
24
|
+
private addThisEdge;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=FunctionPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionPlugin.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/pointerAnalysis/plugins/FunctionPlugin.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAA4B,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAY,UAAU,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC7C,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,SAAS,CAAC;gBAEF,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS;IAM3D,OAAO,IAAI,MAAM;IAIjB,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;IAQxD,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IA+C3E,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,WAAW;CAStB"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.FunctionPlugin = void 0;
|
|
18
|
+
const Constant_1 = require("../../../core/base/Constant");
|
|
19
|
+
const Local_1 = require("../../../core/base/Local");
|
|
20
|
+
const Stmt_1 = require("../../../core/base/Stmt");
|
|
21
|
+
const Type_1 = require("../../../core/base/Type");
|
|
22
|
+
const Pag_1 = require("../Pag");
|
|
23
|
+
const PagBuilder_1 = require("../PagBuilder");
|
|
24
|
+
const PTAUtils_1 = require("../PTAUtils");
|
|
25
|
+
/**
|
|
26
|
+
* FunctionPlugin processes Function.call, Function.apply, Function.bind.
|
|
27
|
+
*/
|
|
28
|
+
class FunctionPlugin {
|
|
29
|
+
constructor(pag, pagBuilder, cg) {
|
|
30
|
+
this.pag = pag;
|
|
31
|
+
this.pagBuilder = pagBuilder;
|
|
32
|
+
this.cg = cg;
|
|
33
|
+
}
|
|
34
|
+
getName() {
|
|
35
|
+
return 'FunctionPlugin';
|
|
36
|
+
}
|
|
37
|
+
canHandle(cs, cgNode) {
|
|
38
|
+
let ivkExpr = cs.callStmt.getInvokeExpr();
|
|
39
|
+
const methodType = (0, PTAUtils_1.getBuiltInApiType)(ivkExpr.getMethodSignature());
|
|
40
|
+
return methodType === PTAUtils_1.BuiltApiType.FunctionCall ||
|
|
41
|
+
methodType === PTAUtils_1.BuiltApiType.FunctionApply ||
|
|
42
|
+
methodType === PTAUtils_1.BuiltApiType.FunctionBind;
|
|
43
|
+
}
|
|
44
|
+
processCallSite(cs, cid, basePTNode) {
|
|
45
|
+
let srcNodes = [];
|
|
46
|
+
let calleeFuncID = cs.getCalleeFuncID();
|
|
47
|
+
if (!calleeFuncID) {
|
|
48
|
+
return srcNodes;
|
|
49
|
+
}
|
|
50
|
+
const calleeMethod = this.cg.getArkMethodByFuncID(calleeFuncID);
|
|
51
|
+
if (!calleeMethod) {
|
|
52
|
+
return srcNodes;
|
|
53
|
+
}
|
|
54
|
+
let ivkExpr = cs.callStmt.getInvokeExpr();
|
|
55
|
+
const methodType = (0, PTAUtils_1.getBuiltInApiType)(ivkExpr.getMethodSignature());
|
|
56
|
+
const calleeCid = this.pagBuilder.getContextSelector().selectContext(cid, cs, basePTNode, calleeFuncID);
|
|
57
|
+
// TODO: call and apply can return.
|
|
58
|
+
switch (methodType) {
|
|
59
|
+
case PTAUtils_1.BuiltApiType.FunctionCall:
|
|
60
|
+
/**
|
|
61
|
+
* set this and param
|
|
62
|
+
* function.call(thisArg, arg1, arg2, ...)
|
|
63
|
+
*/
|
|
64
|
+
this.handleFunctionCall(cs, cid, calleeCid, calleeMethod, srcNodes);
|
|
65
|
+
break;
|
|
66
|
+
case PTAUtils_1.BuiltApiType.FunctionApply:
|
|
67
|
+
/**
|
|
68
|
+
* set this, resolve array param
|
|
69
|
+
* function.apply(thisArg, [argsArray])
|
|
70
|
+
*/
|
|
71
|
+
this.handleFunctionApply(cs, cid, calleeCid, calleeMethod, srcNodes);
|
|
72
|
+
break;
|
|
73
|
+
case PTAUtils_1.BuiltApiType.FunctionBind:
|
|
74
|
+
/**
|
|
75
|
+
* clone the function node and add the this pointer, origin callSite, args offset to it
|
|
76
|
+
* let f = function.bind(thisArg, arg1, arg2, ...)
|
|
77
|
+
* f();
|
|
78
|
+
*/
|
|
79
|
+
this.handleFunctionBind(cs, cid, basePTNode, srcNodes);
|
|
80
|
+
break;
|
|
81
|
+
default:
|
|
82
|
+
}
|
|
83
|
+
return srcNodes;
|
|
84
|
+
}
|
|
85
|
+
handleFunctionCall(staticCS, cid, calleeCid, realCallee, srcNodes) {
|
|
86
|
+
this.pagBuilder.buildFuncPagAndAddToWorklist(new PagBuilder_1.CSFuncID(calleeCid, staticCS.calleeFuncID));
|
|
87
|
+
srcNodes.push(...this.pagBuilder.addCallParamPagEdge(realCallee, staticCS.args, staticCS, cid, calleeCid, 1));
|
|
88
|
+
this.addThisEdge(staticCS, cid, realCallee, srcNodes, calleeCid);
|
|
89
|
+
}
|
|
90
|
+
handleFunctionApply(staticCS, cid, calleeCid, realCallee, srcNodes) {
|
|
91
|
+
this.pagBuilder.buildFuncPagAndAddToWorklist(new PagBuilder_1.CSFuncID(calleeCid, staticCS.calleeFuncID));
|
|
92
|
+
let callerMethod = this.cg.getArkMethodByFuncID(staticCS.callerFuncID);
|
|
93
|
+
if (!callerMethod) {
|
|
94
|
+
throw new Error('Cannot get caller method');
|
|
95
|
+
}
|
|
96
|
+
let argsRealValues = this.transferArrayValues(staticCS.args[1]);
|
|
97
|
+
srcNodes.push(...this.pagBuilder.addCallParamPagEdge(realCallee, argsRealValues, staticCS, cid, calleeCid, 0));
|
|
98
|
+
this.addThisEdge(staticCS, cid, realCallee, srcNodes, calleeCid);
|
|
99
|
+
}
|
|
100
|
+
handleFunctionBind(staticCS, cid, baseClassPTNode, srcNodes) {
|
|
101
|
+
let srcNode = this.pag.getOrClonePagFuncNode(baseClassPTNode);
|
|
102
|
+
if (!srcNode) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.setFunctionThisPt(staticCS, srcNode, cid);
|
|
106
|
+
let dstNode = this.pagBuilder.getOrNewPagNode(cid, staticCS.callStmt.getLeftOp());
|
|
107
|
+
this.pag.addPagEdge(srcNode, dstNode, Pag_1.PagEdgeKind.Copy, staticCS.callStmt);
|
|
108
|
+
srcNode.setCS(staticCS);
|
|
109
|
+
srcNode.setArgsOffset(1);
|
|
110
|
+
srcNode.setOriginCid(cid);
|
|
111
|
+
}
|
|
112
|
+
transferArrayValues(arrayLocal) {
|
|
113
|
+
if (!(arrayLocal instanceof Local_1.Local) || !(arrayLocal.getType() instanceof Type_1.ArrayType)) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* TODO: get array element values
|
|
118
|
+
* need to resolve multi dimension array
|
|
119
|
+
*/
|
|
120
|
+
const usedValuesInArray = arrayLocal.getUsedStmts().flatMap(stmt => {
|
|
121
|
+
if (stmt instanceof Stmt_1.ArkAssignStmt) {
|
|
122
|
+
const rightOp = stmt.getRightOp();
|
|
123
|
+
if (rightOp instanceof Local_1.Local) {
|
|
124
|
+
return rightOp;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return [];
|
|
128
|
+
});
|
|
129
|
+
return usedValuesInArray;
|
|
130
|
+
}
|
|
131
|
+
setFunctionThisPt(staticCS, srcNode, cid) {
|
|
132
|
+
let thisLocal = staticCS.args[0];
|
|
133
|
+
if (!(thisLocal instanceof Local_1.Local)) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
let thisInstanceLocal = this.pagBuilder.getRealThisLocal(thisLocal, staticCS.callerFuncID);
|
|
137
|
+
let baseThisNode = this.pag.getOrNewNode(cid, thisInstanceLocal);
|
|
138
|
+
for (let pt of baseThisNode.getPointTo()) {
|
|
139
|
+
srcNode.setThisPt(pt);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
addThisEdge(staticCS, cid, realCallee, srcNodes, calleeCid) {
|
|
143
|
+
if (!(staticCS.args[0] instanceof Constant_1.NullConstant) && !realCallee.isStatic()) {
|
|
144
|
+
let srcNodeID = this.pagBuilder.addThisRefCallEdge(cid, staticCS.args[0], realCallee, calleeCid, staticCS.callerFuncID);
|
|
145
|
+
if (srcNodeID !== -1) {
|
|
146
|
+
srcNodes.push(srcNodeID);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.FunctionPlugin = FunctionPlugin;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NodeID } from '../../../core/graph/GraphTraits';
|
|
2
|
+
import { CallGraph, CallGraphNode } from '../../model/CallGraph';
|
|
3
|
+
import { ICallSite } from '../../model/CallSite';
|
|
4
|
+
import { ContextID } from '../context/Context';
|
|
5
|
+
import { Pag } from '../Pag';
|
|
6
|
+
import { PagBuilder } from '../PagBuilder';
|
|
7
|
+
export interface IPagPlugin {
|
|
8
|
+
pag: Pag;
|
|
9
|
+
pagBuilder: PagBuilder;
|
|
10
|
+
cg: CallGraph;
|
|
11
|
+
getName(): string;
|
|
12
|
+
canHandle(cs: ICallSite, cgNode: CallGraphNode): boolean;
|
|
13
|
+
processCallSite(cs: ICallSite, cid: ContextID, basePTNode: NodeID): NodeID[];
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=IPagPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPagPlugin.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/pointerAnalysis/plugins/IPagPlugin.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,SAAS,CAAC;IAEd,OAAO,IAAI,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;IACzD,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CallGraph, CallGraphNode, FuncID } from '../../model/CallGraph';
|
|
2
|
+
import { ICallSite } from '../../model/CallSite';
|
|
3
|
+
import { Pag } from '../Pag';
|
|
4
|
+
import { PagBuilder } from '../PagBuilder';
|
|
5
|
+
import { IPagPlugin } from './IPagPlugin';
|
|
6
|
+
import { NodeID } from '../../../core/graph/GraphTraits';
|
|
7
|
+
import { ArkMethod } from '../../../core/model/ArkMethod';
|
|
8
|
+
import { Value } from '../../../core/base/Value';
|
|
9
|
+
export declare class PluginManager {
|
|
10
|
+
private plugins;
|
|
11
|
+
constructor(pag: Pag, pagBuilder: PagBuilder, cg: CallGraph);
|
|
12
|
+
private init;
|
|
13
|
+
registerPlugin(plugin: IPagPlugin): void;
|
|
14
|
+
findPlugin(cs: ICallSite, cgNode: CallGraphNode): IPagPlugin | undefined;
|
|
15
|
+
getAllPlugins(): IPagPlugin[];
|
|
16
|
+
processCallSite(cs: ICallSite, cid: number, basePTNode: NodeID, cg: CallGraph): {
|
|
17
|
+
handled: boolean;
|
|
18
|
+
srcNodes: NodeID[];
|
|
19
|
+
};
|
|
20
|
+
processSDKFuncPag(funcID: FuncID, method: ArkMethod): {
|
|
21
|
+
handled: boolean;
|
|
22
|
+
};
|
|
23
|
+
getSDKParamValue(method: ArkMethod): Value[] | undefined;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=PluginManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/pointerAnalysis/plugins/PluginManager.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAKzD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGjD,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAAoB;gBAEvB,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS;IAI3D,OAAO,CAAC,IAAI;IAOL,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIxC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,UAAU,GAAG,SAAS;IAIxE,aAAa,IAAI,UAAU,EAAE;IAI7B,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IAcxH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE;IAU1E,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,SAAS;CAGlE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.PluginManager = void 0;
|
|
18
|
+
const ContainerPlugin_1 = require("./ContainerPlugin");
|
|
19
|
+
const FunctionPlugin_1 = require("./FunctionPlugin");
|
|
20
|
+
const SdkPlugin_1 = require("./SdkPlugin");
|
|
21
|
+
const StoragePlugin_1 = require("./StoragePlugin");
|
|
22
|
+
// plugins/PluginManager.ts
|
|
23
|
+
class PluginManager {
|
|
24
|
+
constructor(pag, pagBuilder, cg) {
|
|
25
|
+
this.plugins = [];
|
|
26
|
+
this.init(pag, pagBuilder, cg);
|
|
27
|
+
}
|
|
28
|
+
init(pag, pagBuilder, cg) {
|
|
29
|
+
this.registerPlugin(new StoragePlugin_1.StoragePlugin(pag, pagBuilder, cg));
|
|
30
|
+
this.registerPlugin(new FunctionPlugin_1.FunctionPlugin(pag, pagBuilder, cg));
|
|
31
|
+
this.registerPlugin(new SdkPlugin_1.SdkPlugin(pag, pagBuilder, cg));
|
|
32
|
+
this.registerPlugin(new ContainerPlugin_1.ContainerPlugin(pag, pagBuilder, cg));
|
|
33
|
+
}
|
|
34
|
+
registerPlugin(plugin) {
|
|
35
|
+
this.plugins.push(plugin);
|
|
36
|
+
}
|
|
37
|
+
findPlugin(cs, cgNode) {
|
|
38
|
+
return this.plugins.find(plugin => plugin.canHandle(cs, cgNode));
|
|
39
|
+
}
|
|
40
|
+
getAllPlugins() {
|
|
41
|
+
return this.plugins;
|
|
42
|
+
}
|
|
43
|
+
processCallSite(cs, cid, basePTNode, cg) {
|
|
44
|
+
const cgNode = cg.getNode(cs.getCalleeFuncID());
|
|
45
|
+
const plugin = this.findPlugin(cs, cgNode);
|
|
46
|
+
let srcNodes = [];
|
|
47
|
+
if (plugin) {
|
|
48
|
+
srcNodes.push(...plugin.processCallSite(cs, cid, basePTNode));
|
|
49
|
+
return { handled: true, srcNodes: srcNodes };
|
|
50
|
+
}
|
|
51
|
+
return { handled: false, srcNodes: srcNodes };
|
|
52
|
+
}
|
|
53
|
+
// sdk plugin interfaces
|
|
54
|
+
processSDKFuncPag(funcID, method) {
|
|
55
|
+
const plugin = this.plugins.find(p => p.getName() === 'SdkPlugin');
|
|
56
|
+
if (plugin) {
|
|
57
|
+
plugin.buildSDKFuncPag(funcID, method);
|
|
58
|
+
return { handled: true };
|
|
59
|
+
}
|
|
60
|
+
return { handled: false };
|
|
61
|
+
}
|
|
62
|
+
getSDKParamValue(method) {
|
|
63
|
+
return this.plugins.find(p => p.getName() === 'SdkPlugin').getParamValues(method);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.PluginManager = PluginManager;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Value } from '../../../core/base/Value';
|
|
2
|
+
import { NodeID } from '../../../core/graph/GraphTraits';
|
|
3
|
+
import { ArkMethod } from '../../../core/model/ArkMethod';
|
|
4
|
+
import { CallGraph, CallGraphNode, FuncID, ICallSite } from '../../model/CallGraph';
|
|
5
|
+
import { ContextID } from '../context/Context';
|
|
6
|
+
import { Pag } from '../Pag';
|
|
7
|
+
import { PagBuilder } from '../PagBuilder';
|
|
8
|
+
import { IPagPlugin } from './IPagPlugin';
|
|
9
|
+
/**
|
|
10
|
+
* SdkPlugin processes OpenHarmony and built-in SDK APIs.
|
|
11
|
+
* creates fake PAG nodes for SDK method return values and parameters.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SdkPlugin implements IPagPlugin {
|
|
14
|
+
pag: Pag;
|
|
15
|
+
pagBuilder: PagBuilder;
|
|
16
|
+
cg: CallGraph;
|
|
17
|
+
private sdkMethodReturnValueMap;
|
|
18
|
+
private methodParamValueMap;
|
|
19
|
+
private fakeSdkMethodParamDeclaringStmt;
|
|
20
|
+
constructor(pag: Pag, pagBuilder: PagBuilder, cg: CallGraph);
|
|
21
|
+
getName(): string;
|
|
22
|
+
canHandle(cs: ICallSite, cgNode: CallGraphNode): boolean;
|
|
23
|
+
processCallSite(cs: ICallSite, cid: ContextID, basePTNode: NodeID): NodeID[];
|
|
24
|
+
private addSDKMethodPagCallEdge;
|
|
25
|
+
/**
|
|
26
|
+
* will not create real funcPag, only create param values
|
|
27
|
+
*/
|
|
28
|
+
buildSDKFuncPag(funcID: FuncID, sdkMethod: ArkMethod): void;
|
|
29
|
+
private createDummyParamValue;
|
|
30
|
+
private addSDKMethodReturnPagEdge;
|
|
31
|
+
/**
|
|
32
|
+
* process the anonymous method param, create a new CallSite for it and invoke it.
|
|
33
|
+
*/
|
|
34
|
+
private addSDKMethodParamPagEdge;
|
|
35
|
+
getParamValues(method: ArkMethod): Value[] | undefined;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=SdkPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SdkPlugin.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/pointerAnalysis/plugins/SdkPlugin.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAA6B,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;GAGG;AACH,qBAAa,SAAU,YAAW,UAAU;IACxC,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,SAAS,CAAC;IAEd,OAAO,CAAC,uBAAuB,CAA6C;IAC5E,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,+BAA+B,CAAO;gBAElC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS;IAS3D,OAAO,IAAI,MAAM;IAIjB,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;IAKxD,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAM5E,OAAO,CAAC,uBAAuB;IAiB/B;;OAEG;IACI,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAMlE,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,yBAAyB;IA4BjC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsDzB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,SAAS;CAIhE"}
|