arkanalyzer 1.0.75 → 1.0.77
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/callgraph/pointerAnalysis/PTAUtils.d.ts +12 -9
- package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PTAUtils.js +19 -9
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +10 -0
- package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.js +124 -4
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +24 -7
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +163 -42
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +3 -1
- package/lib/callgraph/pointerAnalysis/context/Context.d.ts +1 -0
- package/lib/callgraph/pointerAnalysis/context/Context.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/context/Context.js +5 -1
- package/lib/callgraph/pointerAnalysis/plugins/ContainerPlugin.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/plugins/ContainerPlugin.js +9 -1
- package/lib/core/common/Builtin.d.ts +2 -0
- package/lib/core/common/Builtin.d.ts.map +1 -1
- package/lib/core/common/Builtin.js +2 -0
- package/lib/core/common/IRInference.d.ts +4 -0
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +100 -0
- package/lib/core/common/TypeInference.d.ts.map +1 -1
- package/lib/core/common/TypeInference.js +5 -5
- package/lib/core/inference/ValueInference.d.ts +1 -3
- package/lib/core/inference/ValueInference.d.ts.map +1 -1
- package/lib/core/inference/ValueInference.js +23 -76
- package/lib/core/inference/abc/AbcInference.js +2 -1
- package/lib/core/inference/arkts/ArkTsInference.d.ts.map +1 -1
- package/lib/core/inference/arkts/ArkTsInference.js +2 -1
- package/package.json +2 -2
|
@@ -75,6 +75,8 @@ class PagBuilder {
|
|
|
75
75
|
this.globalThisValue = new Local_1.Local(TSConst_1.GLOBAL_THIS_NAME);
|
|
76
76
|
this.externalScopeVariableMap = new Map();
|
|
77
77
|
this.retriggerNodesList = new Set();
|
|
78
|
+
// Record arrow function object nodes: funcName -> function object node ID
|
|
79
|
+
this.arrowFunctionObjectMap = new Map();
|
|
78
80
|
this.pag = p;
|
|
79
81
|
this.cg = cg;
|
|
80
82
|
this.scale = config.analysisScale;
|
|
@@ -187,6 +189,9 @@ class PagBuilder {
|
|
|
187
189
|
}
|
|
188
190
|
buildInvokeExprInStmt(stmt, fpag) {
|
|
189
191
|
// TODO: discuss if we need a invokeStmt
|
|
192
|
+
if (!stmt.getInvokeExpr()) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
190
195
|
let callSites = this.cg.getCallSiteByStmt(stmt);
|
|
191
196
|
if (callSites.length !== 0) {
|
|
192
197
|
// direct call or constructor call is already existing in CG
|
|
@@ -278,6 +283,9 @@ class PagBuilder {
|
|
|
278
283
|
this.addCallsEdgesFromFuncPag(funcPag, cid);
|
|
279
284
|
this.addDynamicCallSite(funcPag, funcID, cid);
|
|
280
285
|
this.addUnknownCallSite(funcPag, funcID);
|
|
286
|
+
// Check if this is an arrow function and set up its 'this' binding
|
|
287
|
+
// Must be called after addEdgesFromFuncPag to ensure this node is created
|
|
288
|
+
this.setupArrowFunctionThis(funcID, cid);
|
|
281
289
|
this.handledFunc.add(`${cid}-${funcID}`);
|
|
282
290
|
}
|
|
283
291
|
/// Add Pag Nodes and Edges in function
|
|
@@ -292,6 +300,11 @@ class PagBuilder {
|
|
|
292
300
|
paramNodes = this.createDummyParamPagNodes(this.createDummyParamValue(funcID), funcID);
|
|
293
301
|
}
|
|
294
302
|
for (let e of inEdges) {
|
|
303
|
+
// handle closure field ref
|
|
304
|
+
if (e.src instanceof Ref_1.ClosureFieldRef) {
|
|
305
|
+
this.addClosureEdges(e, cid);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
295
308
|
let srcPagNode = this.getOrNewPagNode(cid, e.src, e.stmt);
|
|
296
309
|
let dstPagNode = this.getOrNewPagNode(cid, e.dst, e.stmt);
|
|
297
310
|
this.pag.addPagEdge(srcPagNode, dstPagNode, e.kind, e.stmt);
|
|
@@ -299,6 +312,10 @@ class PagBuilder {
|
|
|
299
312
|
if (dstPagNode.getStmt() instanceof Stmt_1.ArkReturnStmt) {
|
|
300
313
|
dstPagNode.setStmt(e.stmt);
|
|
301
314
|
}
|
|
315
|
+
// Record arrow function object node (for variable assignment, field assignment, etc.)
|
|
316
|
+
if (srcPagNode instanceof Pag_1.PagFuncNode) {
|
|
317
|
+
this.recordArrowFunctionObjectNode(srcPagNode, e.src);
|
|
318
|
+
}
|
|
302
319
|
// for demand-driven analysis, add fake parameter heapObj nodes
|
|
303
320
|
if (e.src instanceof Ref_1.ArkParameterRef && this.scale === PointerAnalysisConfig_1.PtaAnalysisScale.MethodLevel) {
|
|
304
321
|
let paramObjNodeID = paramNodes === null || paramNodes === void 0 ? void 0 : paramNodes.get(paramRefIndex++);
|
|
@@ -310,6 +327,34 @@ class PagBuilder {
|
|
|
310
327
|
}
|
|
311
328
|
return true;
|
|
312
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* handle closure field ref intra-procedural edge
|
|
332
|
+
* @param edge the intra-procedural edge with ClosureFieldRef as src
|
|
333
|
+
* @param cid
|
|
334
|
+
*/
|
|
335
|
+
addClosureEdges(edge, cid) {
|
|
336
|
+
let src = edge.src;
|
|
337
|
+
let dst = edge.dst;
|
|
338
|
+
let fieldName = src.getFieldName();
|
|
339
|
+
let closureValues = src.getBase().getType().getClosures();
|
|
340
|
+
// search out method closure local with closureFieldRef.fieldName
|
|
341
|
+
let srcValue = closureValues.find(value => value.getName() === fieldName);
|
|
342
|
+
let dstPagNode = this.getOrNewPagNode(cid, dst, edge.stmt);
|
|
343
|
+
if (srcValue) {
|
|
344
|
+
// unable to get parent method cid, connect all the value nodes in different cid
|
|
345
|
+
let srcPagNodes = this.pag.getNodesByValue(srcValue);
|
|
346
|
+
if (srcPagNodes) {
|
|
347
|
+
srcPagNodes.forEach(srcNodeID => {
|
|
348
|
+
let srcNode = this.pag.getNode(srcNodeID);
|
|
349
|
+
this.pag.addPagEdge(srcNode, dstPagNode, edge.kind, edge.stmt);
|
|
350
|
+
this.retriggerNodesList.add(srcNodeID);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
throw new Error(`error find closure local: ${fieldName}`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
313
358
|
/// add Copy edges interprocedural
|
|
314
359
|
addCallsEdgesFromFuncPag(funcPag, cid) {
|
|
315
360
|
for (let cs of funcPag.getNormalCallSites()) {
|
|
@@ -335,7 +380,7 @@ class PagBuilder {
|
|
|
335
380
|
this.addThisRefCallEdge(cid, ivkExpr.getBase(), callee, calleeCid, cs.callerFuncID);
|
|
336
381
|
}
|
|
337
382
|
else {
|
|
338
|
-
logger.
|
|
383
|
+
logger.debug(`constructor or intrinsic func is static ${ivkExpr.toString()}`);
|
|
339
384
|
}
|
|
340
385
|
}
|
|
341
386
|
const callerMethod = this.cg.getArkMethodByFuncID(cs.callerFuncID);
|
|
@@ -673,7 +718,7 @@ class PagBuilder {
|
|
|
673
718
|
return srcNodes;
|
|
674
719
|
}
|
|
675
720
|
if (calleeNode.isSdkMethod()) {
|
|
676
|
-
logger.
|
|
721
|
+
logger.warn(`SDK method ${calleeMethod.getSignature().toString()} should be handled by plugin (ignored)`);
|
|
677
722
|
return srcNodes;
|
|
678
723
|
}
|
|
679
724
|
if (!calleeMethod.getCfg()) {
|
|
@@ -699,7 +744,7 @@ class PagBuilder {
|
|
|
699
744
|
* only process the param PAG edge for invoke stmt
|
|
700
745
|
*/
|
|
701
746
|
addCallParamPagEdge(calleeMethod, args, cs, callerCid, calleeCid, offset) {
|
|
702
|
-
var _a
|
|
747
|
+
var _a;
|
|
703
748
|
let callStmt = cs.callStmt;
|
|
704
749
|
const params = (_a = this.pluginManager.getSDKParamValue(calleeMethod)) !== null && _a !== void 0 ? _a : calleeMethod
|
|
705
750
|
.getCfg()
|
|
@@ -707,16 +752,6 @@ class PagBuilder {
|
|
|
707
752
|
.filter(stmt => stmt instanceof Stmt_1.ArkAssignStmt && stmt.getRightOp() instanceof Ref_1.ArkParameterRef)
|
|
708
753
|
.map(stmt => stmt.getRightOp());
|
|
709
754
|
let srcNodes = [];
|
|
710
|
-
/**
|
|
711
|
-
* process foreach situation
|
|
712
|
-
* e.g. arr.forEach((item) => { ... })
|
|
713
|
-
* cs.args is anonymous method local, will have only 1 parameter
|
|
714
|
-
* but inside foreach will have >= 1 parameters
|
|
715
|
-
*/
|
|
716
|
-
if (((_b = callStmt.getInvokeExpr()) === null || _b === void 0 ? void 0 : _b.getMethodSignature().getMethodSubSignature().getMethodName()) === 'forEach') {
|
|
717
|
-
srcNodes.push(...this.addForeachParamPagEdge(callerCid, calleeCid, callStmt, params));
|
|
718
|
-
return srcNodes;
|
|
719
|
-
}
|
|
720
755
|
// add args to parameters edges
|
|
721
756
|
for (let i = offset; i <= args.length; i++) {
|
|
722
757
|
let arg = args[i];
|
|
@@ -731,37 +766,13 @@ class PagBuilder {
|
|
|
731
766
|
// Get or create new PAG node for argument and parameter
|
|
732
767
|
let srcPagNode = this.getOrNewPagNode(callerCid, arg, callStmt);
|
|
733
768
|
let dstPagNode = this.getOrNewPagNode(calleeCid, param, callStmt);
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
}
|
|
738
|
-
return srcNodes;
|
|
739
|
-
}
|
|
740
|
-
/**
|
|
741
|
-
* temporary solution for foreach
|
|
742
|
-
* deprecate when foreach is handled by built-in method
|
|
743
|
-
* connect the element node with the value inside foreach
|
|
744
|
-
*/
|
|
745
|
-
addForeachParamPagEdge(callerCid, calleeCid, callStmt, params) {
|
|
746
|
-
// container value is the base value of callstmt, its points-to is PagNewContainerExprNode
|
|
747
|
-
let srcNodes = [];
|
|
748
|
-
let containerValue = callStmt.getInvokeExpr().getBase();
|
|
749
|
-
let param = params[0];
|
|
750
|
-
if (!containerValue || !param) {
|
|
751
|
-
return srcNodes;
|
|
752
|
-
}
|
|
753
|
-
let basePagNode = this.getOrNewPagNode(callerCid, containerValue, callStmt);
|
|
754
|
-
let dstPagNode = this.getOrNewPagNode(calleeCid, param, callStmt);
|
|
755
|
-
for (let pt of basePagNode.getPointTo()) {
|
|
756
|
-
let newContainerExprPagNode = this.pag.getNode(pt);
|
|
757
|
-
// PagNewContainerExprNode's points-to is the element node
|
|
758
|
-
if (!newContainerExprPagNode || !newContainerExprPagNode.getElementNode()) {
|
|
759
|
-
continue;
|
|
769
|
+
// Record arrow function object node for later thisPt setup
|
|
770
|
+
if (srcPagNode instanceof Pag_1.PagFuncNode) {
|
|
771
|
+
this.recordArrowFunctionObjectNode(srcPagNode, arg);
|
|
760
772
|
}
|
|
761
|
-
let srcPagNode = this.pag.getNode(newContainerExprPagNode.getElementNode());
|
|
762
|
-
// connect the element node with the value inside foreach
|
|
763
773
|
this.pag.addPagEdge(srcPagNode, dstPagNode, Pag_1.PagEdgeKind.Copy, callStmt);
|
|
764
774
|
srcNodes.push(srcPagNode.getID());
|
|
775
|
+
// TODO: handle other types of parmeters
|
|
765
776
|
}
|
|
766
777
|
return srcNodes;
|
|
767
778
|
}
|
|
@@ -1013,7 +1024,9 @@ class PagBuilder {
|
|
|
1013
1024
|
let lhOp = stmt.getLeftOp();
|
|
1014
1025
|
let rhOp = stmt.getRightOp();
|
|
1015
1026
|
let condition = (lhOp instanceof Local_1.Local &&
|
|
1016
|
-
(rhOp instanceof Local_1.Local || rhOp instanceof Ref_1.ArkParameterRef ||
|
|
1027
|
+
(rhOp instanceof Local_1.Local || rhOp instanceof Ref_1.ArkParameterRef ||
|
|
1028
|
+
rhOp instanceof Ref_1.ArkThisRef || rhOp instanceof Ref_1.ArkStaticFieldRef ||
|
|
1029
|
+
rhOp instanceof Ref_1.ClosureFieldRef)) ||
|
|
1017
1030
|
(lhOp instanceof Ref_1.ArkStaticFieldRef && rhOp instanceof Local_1.Local);
|
|
1018
1031
|
if (condition) {
|
|
1019
1032
|
return true;
|
|
@@ -1245,5 +1258,113 @@ class PagBuilder {
|
|
|
1245
1258
|
getContextSelector() {
|
|
1246
1259
|
return this.ctxSelector;
|
|
1247
1260
|
}
|
|
1261
|
+
/**
|
|
1262
|
+
* Record arrow function object node for later thisPt setup
|
|
1263
|
+
*/
|
|
1264
|
+
recordArrowFunctionObjectNode(funcNode, funcValue) {
|
|
1265
|
+
const methodSig = funcNode.getMethod();
|
|
1266
|
+
if (!methodSig) {
|
|
1267
|
+
return;
|
|
1268
|
+
}
|
|
1269
|
+
const funcName = methodSig.getMethodSubSignature().getMethodName();
|
|
1270
|
+
// Only record arrow functions (name contains %AM)
|
|
1271
|
+
if (funcName.includes('%AM')) {
|
|
1272
|
+
this.arrowFunctionObjectMap.set(funcName, funcNode.getID());
|
|
1273
|
+
logger.debug(`Recorded arrow function object: ${funcName} -> Node ${funcNode.getID()}`);
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
/**
|
|
1277
|
+
* Set up 'this' binding for arrow functions
|
|
1278
|
+
* 1. Set the thisPt of arrow function object node (pointing to ThisRef node inside arrow function body)
|
|
1279
|
+
* 2. Establish This edge from arrow function's ThisRef to outer function's this
|
|
1280
|
+
*/
|
|
1281
|
+
setupArrowFunctionThis(funcID, cid) {
|
|
1282
|
+
const arkMethod = this.cg.getArkMethodByFuncID(funcID);
|
|
1283
|
+
if (!arkMethod) {
|
|
1284
|
+
return;
|
|
1285
|
+
}
|
|
1286
|
+
// Check if this is an arrow function (name contains %AM)
|
|
1287
|
+
const funcName = arkMethod.getName();
|
|
1288
|
+
if (!funcName.includes('%AM')) {
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
logger.debug(`Setting up arrow function this for ${funcName} (FuncID: ${funcID}, Ctx: ${cid})`);
|
|
1292
|
+
// 1. Get ThisRef node inside the arrow function body
|
|
1293
|
+
const arrowFuncThisRefID = this.recordThisRefNode(arkMethod, cid);
|
|
1294
|
+
if (arrowFuncThisRefID === -1) {
|
|
1295
|
+
return;
|
|
1296
|
+
}
|
|
1297
|
+
// 2. Look up arrow function object node from map (O(1))
|
|
1298
|
+
const arrowFuncObjNodeID = this.arrowFunctionObjectMap.get(funcName);
|
|
1299
|
+
if (arrowFuncObjNodeID !== undefined) {
|
|
1300
|
+
const funcNode = this.pag.getNode(arrowFuncObjNodeID);
|
|
1301
|
+
funcNode.setThisPt(arrowFuncThisRefID);
|
|
1302
|
+
logger.debug(`Set function object node ${arrowFuncObjNodeID} thisPt to ThisRef ${arrowFuncThisRefID}`);
|
|
1303
|
+
}
|
|
1304
|
+
else {
|
|
1305
|
+
logger.warn(`Arrow function object node not found for ${funcName}`);
|
|
1306
|
+
}
|
|
1307
|
+
// 3. Get the outer function of arrow function and establish This edge
|
|
1308
|
+
const outerMethod = arkMethod.getOuterMethod();
|
|
1309
|
+
if (!outerMethod) {
|
|
1310
|
+
logger.warn(`Could not find outer method for arrow function ${funcName}`);
|
|
1311
|
+
return;
|
|
1312
|
+
}
|
|
1313
|
+
logger.debug(`Arrow function outer method: ${outerMethod.getName()}`);
|
|
1314
|
+
// Get context of arrow function object node (in which context of outer function the arrow function object is created)
|
|
1315
|
+
const arrowFuncObjNode = arrowFuncObjNodeID !== undefined ? this.pag.getNode(arrowFuncObjNodeID) : undefined;
|
|
1316
|
+
const outerContextID = arrowFuncObjNode === null || arrowFuncObjNode === void 0 ? void 0 : arrowFuncObjNode.getCid();
|
|
1317
|
+
// Find 'this' local node of outer function in specified context
|
|
1318
|
+
const outerThisNode = this.findThisNodeForMethod(outerMethod, outerContextID);
|
|
1319
|
+
if (outerThisNode) {
|
|
1320
|
+
const arrowFuncThisRef = this.pag.getNode(arrowFuncThisRefID);
|
|
1321
|
+
// Establish This edge: outer this -> arrow function ThisRef
|
|
1322
|
+
if (this.pag.addPagEdge(outerThisNode, arrowFuncThisRef, Pag_1.PagEdgeKind.This)) {
|
|
1323
|
+
logger.info(`Connected arrow function ${funcName} this (Node ${arrowFuncThisRefID}) to outer this (Node ${outerThisNode.getID()})`);
|
|
1324
|
+
// Add outer this node to retrigger list to ensure pointer propagation
|
|
1325
|
+
this.retriggerNodesList.add(outerThisNode.getID());
|
|
1326
|
+
}
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
/**
|
|
1330
|
+
* Find 'this' local node for the specified method in the specified context
|
|
1331
|
+
* @param method Target method
|
|
1332
|
+
* @param contextID Optional context ID. If not specified, returns the 'this' node in the first found context
|
|
1333
|
+
*/
|
|
1334
|
+
findThisNodeForMethod(method, contextID) {
|
|
1335
|
+
const cfg = method.getCfg();
|
|
1336
|
+
if (!cfg) {
|
|
1337
|
+
return undefined;
|
|
1338
|
+
}
|
|
1339
|
+
// Find 'this' assignment statement in method: this = this: ClassName
|
|
1340
|
+
const thisAssignStmt = cfg
|
|
1341
|
+
.getStmts()
|
|
1342
|
+
.find(s => s instanceof Stmt_1.ArkAssignStmt && s.getRightOp() instanceof Ref_1.ArkThisRef);
|
|
1343
|
+
if (!thisAssignStmt) {
|
|
1344
|
+
return undefined;
|
|
1345
|
+
}
|
|
1346
|
+
const thisLocal = thisAssignStmt.getLeftOp();
|
|
1347
|
+
if (!(thisLocal instanceof Local_1.Local)) {
|
|
1348
|
+
return undefined;
|
|
1349
|
+
}
|
|
1350
|
+
const ctx2NodeMap = this.pag.getNodesByValue(thisLocal);
|
|
1351
|
+
if (!ctx2NodeMap || ctx2NodeMap.size === 0) {
|
|
1352
|
+
return undefined;
|
|
1353
|
+
}
|
|
1354
|
+
// If context is specified, find node in that context
|
|
1355
|
+
if (contextID !== undefined) {
|
|
1356
|
+
const nodeID = ctx2NodeMap.get(contextID);
|
|
1357
|
+
if (nodeID === undefined) {
|
|
1358
|
+
return undefined;
|
|
1359
|
+
}
|
|
1360
|
+
return this.pag.getNode(nodeID);
|
|
1361
|
+
}
|
|
1362
|
+
// Otherwise return 'this' node in the first found context
|
|
1363
|
+
const firstNodeID = ctx2NodeMap.values().next().value;
|
|
1364
|
+
if (firstNodeID === undefined) {
|
|
1365
|
+
return undefined;
|
|
1366
|
+
}
|
|
1367
|
+
return this.pag.getNode(firstNodeID);
|
|
1368
|
+
}
|
|
1248
1369
|
}
|
|
1249
1370
|
exports.PagBuilder = PagBuilder;
|
|
@@ -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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"}
|
|
@@ -55,6 +55,7 @@ const PagBuilder_1 = require("./PagBuilder");
|
|
|
55
55
|
const PointerAnalysisConfig_1 = require("./PointerAnalysisConfig");
|
|
56
56
|
const PtsDS_1 = require("./PtsDS");
|
|
57
57
|
const Local_1 = require("../../core/base/Local");
|
|
58
|
+
const Context_1 = require("./context/Context");
|
|
58
59
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'PTA');
|
|
59
60
|
class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
60
61
|
constructor(p, cg, s, config) {
|
|
@@ -238,8 +239,9 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
238
239
|
instanceFieldNodeMap.forEach((nodeIDs, cid) => {
|
|
239
240
|
// TODO: check cid
|
|
240
241
|
// cid === -1 will escape the check, mainly for globalThis
|
|
242
|
+
// cid === CONTAINER_ELEMENT_CID will escape the check, for container element/field nodes
|
|
241
243
|
let baseCid = node.getCid();
|
|
242
|
-
if (baseCid !== -1 && cid !== baseCid) {
|
|
244
|
+
if (baseCid !== -1 && cid !== Context_1.CONTAINER_ELEMENT_CID && cid !== baseCid) {
|
|
243
245
|
return;
|
|
244
246
|
}
|
|
245
247
|
nodeIDs.forEach((nodeID) => {
|
|
@@ -2,6 +2,7 @@ import { CallGraph } from '../../model/CallGraph';
|
|
|
2
2
|
import { ContextItemManager } from './ContextItem';
|
|
3
3
|
export type ContextID = number;
|
|
4
4
|
export declare const DUMMY_CID = 0;
|
|
5
|
+
export declare const CONTAINER_ELEMENT_CID = -2;
|
|
5
6
|
/**
|
|
6
7
|
* An abstract base class representing a context in pointer analysis.
|
|
7
8
|
* A context is an immutable sequence of context elements (represented by their IDs).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Context.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/pointerAnalysis/context/Context.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAuB,kBAAkB,EAAmB,MAAM,eAAe,CAAC;AAEzF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,eAAO,MAAM,SAAS,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Context.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/pointerAnalysis/context/Context.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAuB,kBAAkB,EAAmB,MAAM,eAAe,CAAC;AAEzF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,eAAO,MAAM,SAAS,IAAI,CAAC;AAI3B,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;;GAGG;AACH,8BAAsB,OAAO;IACzB,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;gBAErB,YAAY,GAAE,MAAM,EAAO;IAQvC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC;IAIxD;;;;;OAKG;IACH,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC;IAI1F;;;;;;OAMG;IACH,MAAM,CAAC,kBAAkB,CAAC,CAAC,SAAS,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC;IAgBnF;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC;IAcxD,MAAM,IAAI,MAAM;IAIhB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAO1B,QAAQ,IAAI,MAAM;aAKT,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,OAAO;aACxF,IAAI,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM;CACrE;AAED,qBAAa,eAAgB,SAAQ,OAAO;IACjC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,eAAe;IAKjG,IAAI,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM;CAS5D;AAED,qBAAa,UAAW,SAAQ,OAAO;IAC5B,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,UAAU;IAKvF,IAAI,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM;CAI5D;AAED,qBAAa,WAAY,SAAQ,OAAO;IAC7B,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,WAAW;IAKzF,IAAI,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM;CAS5D;AAED,qBAAa,YAAY;IACrB,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,cAAc,CAAkC;;IAOjD,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS;IAa9C,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO;IAY/E,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS;IASrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAO3C,cAAc,IAAI,OAAO,EAAE;IAI3B,IAAI,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,EAAE,SAAS,GAAG,MAAM;CAS5D"}
|
|
@@ -14,8 +14,12 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.ContextCache = exports.FuncContext = exports.ObjContext = exports.CallSiteContext = exports.Context = exports.DUMMY_CID = void 0;
|
|
17
|
+
exports.ContextCache = exports.FuncContext = exports.ObjContext = exports.CallSiteContext = exports.Context = exports.CONTAINER_ELEMENT_CID = exports.DUMMY_CID = void 0;
|
|
18
18
|
exports.DUMMY_CID = 0;
|
|
19
|
+
// Special context ID for container element/field nodes
|
|
20
|
+
// These nodes should be shared across all contexts for the same container object (identified by basePt)
|
|
21
|
+
// but should NOT be shared between different container objects (even with same cid=0)
|
|
22
|
+
exports.CONTAINER_ELEMENT_CID = -2;
|
|
19
23
|
/**
|
|
20
24
|
* An abstract base class representing a context in pointer analysis.
|
|
21
25
|
* A context is an immutable sequence of context elements (represented by their IDs).
|
|
@@ -1 +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;
|
|
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;CAmCzB"}
|
|
@@ -156,7 +156,15 @@ class ContainerPlugin {
|
|
|
156
156
|
if (!paramRefValues || paramRefValues.length < 1) {
|
|
157
157
|
return;
|
|
158
158
|
}
|
|
159
|
-
|
|
159
|
+
/**
|
|
160
|
+
* NOTE!: paramRefValues[0] OR paramRefValues[1]?
|
|
161
|
+
* when the callback use the closure, the first parameter is LexicalEnvType,
|
|
162
|
+
* when not use, we need to use the second parameter as the element type.
|
|
163
|
+
*/
|
|
164
|
+
let elementRef = paramRefValues[0];
|
|
165
|
+
if (elementRef.getType() instanceof Type_1.LexicalEnvType) {
|
|
166
|
+
elementRef = paramRefValues[1];
|
|
167
|
+
}
|
|
160
168
|
const elementNode = this.pag.getOrNewNode(calleeCid, elementRef, cs.callStmt);
|
|
161
169
|
this.pag.addPagEdge(containerFieldNode, elementNode, Pag_1.PagEdgeKind.Copy, cs.callStmt);
|
|
162
170
|
srcNodes.push(containerFieldNode.getID());
|
|
@@ -6,6 +6,8 @@ export declare class Builtin {
|
|
|
6
6
|
static SET: string;
|
|
7
7
|
static MAP: string;
|
|
8
8
|
static REGEXP: string;
|
|
9
|
+
static BIGINT: string;
|
|
10
|
+
static FUNCTION: string;
|
|
9
11
|
static BUILT_IN_CLASSES: Set<string>;
|
|
10
12
|
static DUMMY_PROJECT_NAME: string;
|
|
11
13
|
static DUMMY_FILE_NAME: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builtin.d.ts","sourceRoot":"","sources":["../../../src/core/common/Builtin.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAsB,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,SAAS,EAA2B,MAAM,cAAc,CAAC;AAElE,qBAAa,OAAO;IAGhB,OAAc,MAAM,SAAY;IAChC,OAAc,KAAK,SAAW;IAC9B,OAAc,GAAG,SAAS;IAC1B,OAAc,GAAG,SAAS;IAC1B,OAAc,MAAM,SAAY;
|
|
1
|
+
{"version":3,"file":"Builtin.d.ts","sourceRoot":"","sources":["../../../src/core/common/Builtin.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAsB,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,SAAS,EAA2B,MAAM,cAAc,CAAC;AAElE,qBAAa,OAAO;IAGhB,OAAc,MAAM,SAAY;IAChC,OAAc,KAAK,SAAW;IAC9B,OAAc,GAAG,SAAS;IAC1B,OAAc,GAAG,SAAS;IAC1B,OAAc,MAAM,SAAY;IAChC,OAAc,MAAM,SAAY;IAChC,OAAc,QAAQ,SAAc;IAEpC,OAAc,gBAAgB,cAA8B;IAG5D,OAAc,kBAAkB,SAAY;IAC5C,OAAc,eAAe,SAAkB;IAE/C,OAAc,+BAA+B,gBAA8C;IAC3F,OAAc,sBAAsB,iBAAgD;IACpF,OAAc,iBAAiB,YAA8C;IAC7E,OAAc,qBAAqB,iBAA+C;IAClF,OAAc,mBAAmB,iBAA6C;IAC9E,OAAc,mBAAmB,iBAA6C;IAC9E,OAAc,sBAAsB,iBAAgD;IACpF,OAAc,iBAAiB,YAA8C;IAC7E,OAAc,4BAA4B,8BAAwC;IAGlF,OAAc,iBAAiB,SAAqB;IACpD,OAAc,QAAQ,SAAsB;IAC5C,OAAc,aAAa,SAAU;IACrC,OAAc,eAAe,SAAoB;IACjD,OAAc,oBAAoB,SAAU;IAC5C,OAAc,qBAAqB,SAAW;IAE9C,OAAc,wBAAwB,iBAAkD;IACxF,OAAc,+BAA+B,iBAAyD;IACtG,OAAc,mBAAmB,YAAwE;IACzG,OAAc,0BAA0B,YAA+E;IAGvH,OAAc,SAAS,SAAc;IACrC,OAAc,0BAA0B,kBAGtC;IAGF,OAAc,KAAK,SAAW;IAC9B,OAAc,MAAM,SAAY;IAEhC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAUlC,OAAO,CAAC,MAAM,CAAC,gCAAgC;WAIjC,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IAI3E,OAAO,CAAC,MAAM,CAAC,6BAA6B;WAU9B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAG3D"}
|
|
@@ -56,6 +56,8 @@ Builtin.ARRAY = 'Array';
|
|
|
56
56
|
Builtin.SET = 'Set';
|
|
57
57
|
Builtin.MAP = 'Map';
|
|
58
58
|
Builtin.REGEXP = 'RegExp';
|
|
59
|
+
Builtin.BIGINT = 'BigInt';
|
|
60
|
+
Builtin.FUNCTION = 'Function';
|
|
59
61
|
Builtin.BUILT_IN_CLASSES = _a.buildBuiltInClasses();
|
|
60
62
|
// signature for built-in class
|
|
61
63
|
Builtin.DUMMY_PROJECT_NAME = 'ES2015';
|
|
@@ -6,6 +6,7 @@ import { Scene } from '../../Scene';
|
|
|
6
6
|
import { ArkClass } from '../model/ArkClass';
|
|
7
7
|
import { ClassSignature, FieldSignature, FileSignature, MethodSignature } from '../model/ArkSignature';
|
|
8
8
|
import { AbstractFieldRef, AbstractRef, ArkInstanceFieldRef, ArkParameterRef } from '../base/Ref';
|
|
9
|
+
import { Value } from '../base/Value';
|
|
9
10
|
import { ArkFile } from '../model/ArkFile';
|
|
10
11
|
import { KeyofTypeExpr, TypeQueryExpr } from '../base/TypeExpr';
|
|
11
12
|
export declare class IRInference {
|
|
@@ -39,7 +40,10 @@ export declare class IRInference {
|
|
|
39
40
|
static replaceMethodSignature(init: MethodSignature, declared: MethodSignature): MethodSignature;
|
|
40
41
|
private static processForEach;
|
|
41
42
|
static inferLocal(base: Local, arkMethod: ArkMethod): void;
|
|
43
|
+
static inferInstanceMember<T extends U, U extends Value>(baseType: Type, value: T, arkMethod: ArkMethod, inferMember: (declareType: Type, value: T, arkMethod: ArkMethod) => U | null): U | null;
|
|
42
44
|
static generateNewFieldSignature(ref: AbstractFieldRef, arkClass: ArkClass, baseType: Type): FieldSignature | null;
|
|
45
|
+
static updateRefSignature(baseType: Type, ref: AbstractFieldRef, arkMethod: ArkMethod): AbstractRef | null;
|
|
46
|
+
private static genFieldSignature;
|
|
43
47
|
private static getFieldSignature;
|
|
44
48
|
private static findPropertyFormChildrenClass;
|
|
45
49
|
private static repairType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IRInference.d.ts","sourceRoot":"","sources":["../../../src/core/common/IRInference.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAIH,SAAS,
|
|
1
|
+
{"version":3,"file":"IRInference.d.ts","sourceRoot":"","sources":["../../../src/core/common/IRInference.ts"],"names":[],"mappings":"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"}
|
|
@@ -609,6 +609,41 @@ class IRInference {
|
|
|
609
609
|
base.setType(baseType);
|
|
610
610
|
}
|
|
611
611
|
}
|
|
612
|
+
static inferInstanceMember(baseType, value, arkMethod, inferMember) {
|
|
613
|
+
var _a, _b;
|
|
614
|
+
if (baseType instanceof Type_1.PrimitiveType) {
|
|
615
|
+
// Convert primitive types to their wrapper class types
|
|
616
|
+
const name = baseType instanceof Type_1.LiteralType ? typeof baseType.getLiteralName() : baseType.getName();
|
|
617
|
+
const className = baseType instanceof Type_1.BigIntType ? Builtin_1.Builtin.BIGINT : name.charAt(0).toUpperCase() + name.slice(1);
|
|
618
|
+
const arrayClass = arkMethod.getDeclaringArkFile().getScene().getSdkGlobal(className);
|
|
619
|
+
if (arrayClass instanceof ArkClass_1.ArkClass) {
|
|
620
|
+
return inferMember(new Type_1.ClassType(arrayClass.getSignature(), arrayClass.getRealTypes()), value, arkMethod);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
else if (baseType instanceof Type_1.EnumValueType) {
|
|
624
|
+
const newType = (_a = baseType.getConstant()) === null || _a === void 0 ? void 0 : _a.getType();
|
|
625
|
+
return newType ? IRInference.inferInstanceMember(newType, value, arkMethod, inferMember) : null;
|
|
626
|
+
}
|
|
627
|
+
else if (baseType instanceof Type_1.AliasType) {
|
|
628
|
+
return IRInference.inferInstanceMember(TypeInference_1.TypeInference.replaceAliasType(baseType), value, arkMethod, inferMember);
|
|
629
|
+
}
|
|
630
|
+
else if (baseType instanceof Type_1.UnionType || baseType instanceof Type_1.IntersectionType) {
|
|
631
|
+
for (let type of baseType.getTypes()) {
|
|
632
|
+
if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
let result = IRInference.inferInstanceMember(type, value, arkMethod, inferMember);
|
|
636
|
+
if (result) {
|
|
637
|
+
return result;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
else if (baseType instanceof Type_1.GenericType) {
|
|
642
|
+
const newType = (_b = baseType.getDefaultType()) !== null && _b !== void 0 ? _b : baseType.getConstraint();
|
|
643
|
+
return newType ? IRInference.inferInstanceMember(newType, value, arkMethod, inferMember) : null;
|
|
644
|
+
}
|
|
645
|
+
return inferMember(baseType, value, arkMethod);
|
|
646
|
+
}
|
|
612
647
|
static generateNewFieldSignature(ref, arkClass, baseType) {
|
|
613
648
|
if (baseType instanceof Type_1.UnionType) {
|
|
614
649
|
for (let type of baseType.flatType()) {
|
|
@@ -633,6 +668,71 @@ class IRInference {
|
|
|
633
668
|
}
|
|
634
669
|
return IRInference.getFieldSignature(ref, baseType, arkClass);
|
|
635
670
|
}
|
|
671
|
+
static updateRefSignature(baseType, ref, arkMethod) {
|
|
672
|
+
const fieldName = ref.getFieldName().replace(/[\"|\']/g, '');
|
|
673
|
+
if (baseType instanceof Type_1.TupleType) {
|
|
674
|
+
const n = Number(fieldName);
|
|
675
|
+
if (!isNaN(n) && n < baseType.getTypes().length) {
|
|
676
|
+
ref.getFieldSignature().setType(baseType.getTypes()[n]);
|
|
677
|
+
}
|
|
678
|
+
return ref;
|
|
679
|
+
}
|
|
680
|
+
else if (baseType instanceof Type_1.ArrayType) {
|
|
681
|
+
if (ref instanceof Ref_1.ArkInstanceFieldRef && ref.isDynamic()) {
|
|
682
|
+
const index = TypeInference_1.TypeInference.getLocalFromMethodBody(fieldName, arkMethod);
|
|
683
|
+
return new Ref_1.ArkArrayRef(ref.getBase(), index !== null && index !== void 0 ? index : ValueUtil_1.ValueUtil.createConst(fieldName));
|
|
684
|
+
}
|
|
685
|
+
else {
|
|
686
|
+
const arrayClass = arkMethod.getDeclaringArkFile().getScene().getSdkGlobal(Builtin_1.Builtin.ARRAY);
|
|
687
|
+
if (arrayClass instanceof ArkClass_1.ArkClass) {
|
|
688
|
+
baseType = new Type_1.ClassType(arrayClass.getSignature(), [baseType.getBaseType()]);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
else if (baseType instanceof Type_1.FunctionType) {
|
|
693
|
+
const arrayClass = arkMethod.getDeclaringArkFile().getScene().getSdkGlobal(Builtin_1.Builtin.FUNCTION);
|
|
694
|
+
if (arrayClass instanceof ArkClass_1.ArkClass) {
|
|
695
|
+
baseType = new Type_1.ClassType(arrayClass.getSignature());
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
let { staticFlag, signature } = IRInference.genFieldSignature(fieldName, baseType, ref, arkMethod);
|
|
699
|
+
if (!signature) {
|
|
700
|
+
return null;
|
|
701
|
+
}
|
|
702
|
+
if (staticFlag) {
|
|
703
|
+
return new Ref_1.ArkStaticFieldRef(signature);
|
|
704
|
+
}
|
|
705
|
+
else {
|
|
706
|
+
ref.setFieldSignature(signature);
|
|
707
|
+
return ref;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
static genFieldSignature(fieldName, baseType, ref, arkMethod) {
|
|
711
|
+
var _a;
|
|
712
|
+
const arkClass = arkMethod.getDeclaringArkClass();
|
|
713
|
+
const propertyAndType = TypeInference_1.TypeInference.inferFieldType(baseType, fieldName, arkClass);
|
|
714
|
+
let propertyType = IRInference.repairType(propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[1], fieldName, arkClass);
|
|
715
|
+
let staticFlag = false;
|
|
716
|
+
let signature = null;
|
|
717
|
+
if (baseType instanceof Type_1.ClassType) {
|
|
718
|
+
const property = (_a = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[0]) !== null && _a !== void 0 ? _a : IRInference.findPropertyFormChildrenClass(fieldName, arkClass, baseType);
|
|
719
|
+
staticFlag = baseType.getClassSignature().getClassName() === Const_1.DEFAULT_ARK_CLASS_NAME ||
|
|
720
|
+
((property instanceof ArkField_1.ArkField || property instanceof ArkMethod_1.ArkMethod) && property.isStatic());
|
|
721
|
+
if (property instanceof ArkField_1.ArkField && property.getCategory() !== ArkField_1.FieldCategory.ENUM_MEMBER &&
|
|
722
|
+
!(property.getType() instanceof Type_1.GenericType)) {
|
|
723
|
+
signature = property.getSignature();
|
|
724
|
+
}
|
|
725
|
+
else {
|
|
726
|
+
const baseSignature = property instanceof ArkMethod_1.ArkMethod ? property.getSignature().getDeclaringClassSignature() : baseType.getClassSignature();
|
|
727
|
+
signature = new ArkSignature_1.FieldSignature(fieldName, baseSignature, propertyType !== null && propertyType !== void 0 ? propertyType : ref.getType(), staticFlag);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
else if (baseType instanceof Type_1.AnnotationNamespaceType) {
|
|
731
|
+
staticFlag = true;
|
|
732
|
+
signature = new ArkSignature_1.FieldSignature(fieldName, baseType.getNamespaceSignature(), propertyType !== null && propertyType !== void 0 ? propertyType : ref.getType(), staticFlag);
|
|
733
|
+
}
|
|
734
|
+
return { staticFlag, signature };
|
|
735
|
+
}
|
|
636
736
|
static getFieldSignature(ref, baseType, arkClass) {
|
|
637
737
|
const fieldName = ref.getFieldName().replace(/[\"|\']/g, '');
|
|
638
738
|
const propertyAndType = TypeInference_1.TypeInference.inferFieldType(baseType, fieldName, arkClass);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypeInference.d.ts","sourceRoot":"","sources":["../../../src/core/common/TypeInference.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TypeInference.d.ts","sourceRoot":"","sources":["../../../src/core/common/TypeInference.ts"],"names":[],"mappings":"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"}
|
|
@@ -664,11 +664,10 @@ class TypeInference {
|
|
|
664
664
|
* @returns
|
|
665
665
|
*/
|
|
666
666
|
static inferUnclearRefType(urType, arkClass) {
|
|
667
|
-
var _a;
|
|
668
667
|
const realTypes = urType.getGenericTypes();
|
|
669
668
|
this.inferRealGenericTypes(realTypes, arkClass);
|
|
670
|
-
if (urType.getName() === Builtin_1.Builtin.ARRAY) {
|
|
671
|
-
return new Type_1.ArrayType(
|
|
669
|
+
if (urType.getName() === Builtin_1.Builtin.ARRAY && realTypes.length > 0) {
|
|
670
|
+
return new Type_1.ArrayType(realTypes[0], 1);
|
|
672
671
|
}
|
|
673
672
|
const type = this.inferUnclearRefName(urType.getName(), arkClass);
|
|
674
673
|
return type ? this.replaceTypeWithReal(type, realTypes) : null;
|
|
@@ -1054,9 +1053,10 @@ class TypeInference {
|
|
|
1054
1053
|
}
|
|
1055
1054
|
else if (leftType instanceof Type_1.UnionType) {
|
|
1056
1055
|
const isExist = leftType.getTypes().find(t => this.isSameType(t, rightType));
|
|
1057
|
-
if (isExist) {
|
|
1058
|
-
|
|
1056
|
+
if (!isExist) {
|
|
1057
|
+
leftType.getTypes().push(type2);
|
|
1059
1058
|
}
|
|
1059
|
+
return type1;
|
|
1060
1060
|
}
|
|
1061
1061
|
else if (leftType instanceof Type_1.IntersectionType) {
|
|
1062
1062
|
const isExist = leftType.getTypes().find(t => !this.isSameType(t, rightType));
|
|
@@ -6,7 +6,6 @@ import { Type } from '../base/Type';
|
|
|
6
6
|
import { ArkMethod } from '../model/ArkMethod';
|
|
7
7
|
import { AbstractInvokeExpr, AliasTypeExpr, ArkCastExpr, ArkConditionExpr, ArkInstanceInvokeExpr, ArkInstanceOfExpr, ArkNewArrayExpr, ArkNewExpr, ArkNormalBinopExpr, ArkPtrInvokeExpr, ArkStaticInvokeExpr } from '../base/Expr';
|
|
8
8
|
import { Local } from '../base/Local';
|
|
9
|
-
import { Scene } from '../../Scene';
|
|
10
9
|
export declare enum InferLanguage {
|
|
11
10
|
UNKNOWN = -1,
|
|
12
11
|
COMMON = 0,
|
|
@@ -167,8 +166,7 @@ export declare class InstanceInvokeExprInference extends ValueInference<ArkInsta
|
|
|
167
166
|
*/
|
|
168
167
|
postInfer(value: ArkInstanceInvokeExpr, newValue: Value, stmt: Stmt): void;
|
|
169
168
|
getMethodName(expr: AbstractInvokeExpr, arkMethod: ArkMethod): string;
|
|
170
|
-
static inferInvokeExpr(baseType: Type, expr: AbstractInvokeExpr, arkMethod: ArkMethod
|
|
171
|
-
static inferMethodFromBase(baseType: Type, expr: AbstractInvokeExpr, scene: Scene, methodName: string): AbstractInvokeExpr | null;
|
|
169
|
+
static inferInvokeExpr(baseType: Type, expr: AbstractInvokeExpr, arkMethod: ArkMethod): AbstractInvokeExpr | null;
|
|
172
170
|
}
|
|
173
171
|
export declare class StaticInvokeExprInference extends InstanceInvokeExprInference {
|
|
174
172
|
getValueName(): string;
|