arkanalyzer 1.0.76 → 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/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/package.json +2 -2
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { ClassSignature, FieldSignature, MethodSignature } from '../../core/model/ArkSignature';
|
|
2
2
|
export declare function IsCollectionClass(classSignature: ClassSignature): boolean;
|
|
3
3
|
export declare enum BuiltApiType {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
SetConstructor = 0,
|
|
5
|
+
MapConstructor = 1,
|
|
6
|
+
ArrayConstructor = 2,
|
|
7
|
+
SetAdd = 3,
|
|
8
|
+
MapSet = 4,
|
|
9
|
+
MapGet = 5,
|
|
10
|
+
ArrayPush = 6,
|
|
11
|
+
Foreach = 7,
|
|
12
|
+
FunctionCall = 8,
|
|
13
|
+
FunctionApply = 9,
|
|
14
|
+
FunctionBind = 10,
|
|
15
|
+
NotBuiltIn = 11
|
|
13
16
|
}
|
|
14
17
|
export declare const ARRAY_FIELD_SIGNATURE: FieldSignature;
|
|
15
18
|
export declare const SET_FIELD_SIGNATURE: FieldSignature;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PTAUtils.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PTAUtils.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAiB,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE/G,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAKzE;AAED,oBAAY,YAAY;IACpB,MAAM,IAAA;IACN,MAAM,IAAA;IACN,MAAM,IAAA;IACN,SAAS,IAAA;IACT,OAAO,IAAA;IACP,YAAY,IAAA;IACZ,aAAa,IAAA;IACb,YAAY,
|
|
1
|
+
{"version":3,"file":"PTAUtils.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PTAUtils.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAiB,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAE/G,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAKzE;AAED,oBAAY,YAAY;IACpB,cAAc,IAAA;IACd,cAAc,IAAA;IACd,gBAAgB,IAAA;IAChB,MAAM,IAAA;IACN,MAAM,IAAA;IACN,MAAM,IAAA;IACN,SAAS,IAAA;IACT,OAAO,IAAA;IACP,YAAY,IAAA;IACZ,aAAa,IAAA;IACb,YAAY,KAAA;IACZ,UAAU,KAAA;CACb;AAED,eAAO,MAAM,qBAAqB,gBAIjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,gBAI/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,gBAI/B,CAAC;AA6BF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAoBvE"}
|
|
@@ -26,20 +26,30 @@ function IsCollectionClass(classSignature) {
|
|
|
26
26
|
exports.IsCollectionClass = IsCollectionClass;
|
|
27
27
|
var BuiltApiType;
|
|
28
28
|
(function (BuiltApiType) {
|
|
29
|
-
BuiltApiType[BuiltApiType["
|
|
30
|
-
BuiltApiType[BuiltApiType["
|
|
31
|
-
BuiltApiType[BuiltApiType["
|
|
32
|
-
BuiltApiType[BuiltApiType["
|
|
33
|
-
BuiltApiType[BuiltApiType["
|
|
34
|
-
BuiltApiType[BuiltApiType["
|
|
35
|
-
BuiltApiType[BuiltApiType["
|
|
36
|
-
BuiltApiType[BuiltApiType["
|
|
37
|
-
BuiltApiType[BuiltApiType["
|
|
29
|
+
BuiltApiType[BuiltApiType["SetConstructor"] = 0] = "SetConstructor";
|
|
30
|
+
BuiltApiType[BuiltApiType["MapConstructor"] = 1] = "MapConstructor";
|
|
31
|
+
BuiltApiType[BuiltApiType["ArrayConstructor"] = 2] = "ArrayConstructor";
|
|
32
|
+
BuiltApiType[BuiltApiType["SetAdd"] = 3] = "SetAdd";
|
|
33
|
+
BuiltApiType[BuiltApiType["MapSet"] = 4] = "MapSet";
|
|
34
|
+
BuiltApiType[BuiltApiType["MapGet"] = 5] = "MapGet";
|
|
35
|
+
BuiltApiType[BuiltApiType["ArrayPush"] = 6] = "ArrayPush";
|
|
36
|
+
BuiltApiType[BuiltApiType["Foreach"] = 7] = "Foreach";
|
|
37
|
+
BuiltApiType[BuiltApiType["FunctionCall"] = 8] = "FunctionCall";
|
|
38
|
+
BuiltApiType[BuiltApiType["FunctionApply"] = 9] = "FunctionApply";
|
|
39
|
+
BuiltApiType[BuiltApiType["FunctionBind"] = 10] = "FunctionBind";
|
|
40
|
+
BuiltApiType[BuiltApiType["NotBuiltIn"] = 11] = "NotBuiltIn";
|
|
38
41
|
})(BuiltApiType = exports.BuiltApiType || (exports.BuiltApiType = {}));
|
|
39
42
|
exports.ARRAY_FIELD_SIGNATURE = new ArkSignature_1.FieldSignature('field', new ArkSignature_1.ClassSignature('Array', new ArkSignature_1.FileSignature('container', 'lib.es5.d.ts')), new Type_1.UnclearReferenceType(''));
|
|
40
43
|
exports.SET_FIELD_SIGNATURE = new ArkSignature_1.FieldSignature('field', new ArkSignature_1.ClassSignature('Set', new ArkSignature_1.FileSignature('container', 'lib.es2015.collection.d.ts')), new Type_1.UnclearReferenceType(''));
|
|
41
44
|
exports.MAP_FIELD_SIGNATURE = new ArkSignature_1.FieldSignature('field', new ArkSignature_1.ClassSignature('Map', new ArkSignature_1.FileSignature('container', 'lib.es2015.collection.d.ts')), new Type_1.UnclearReferenceType(''));
|
|
45
|
+
/**
|
|
46
|
+
* register container built-in API patterns, these APIs will not be recognized as SDK APIs
|
|
47
|
+
*/
|
|
42
48
|
const BUILTIN_API_PATTERNS = new Map([
|
|
49
|
+
// constructor
|
|
50
|
+
['lib.es2015.collection.d.ts: SetConstructor.construct-signature()', BuiltApiType.SetConstructor],
|
|
51
|
+
['lib.es2015.collection.d.ts: MapConstructor.construct-signature()', BuiltApiType.MapConstructor],
|
|
52
|
+
['lib.es5.d.ts: ArrayConstructor.construct-signature()', BuiltApiType.ArrayConstructor],
|
|
43
53
|
// set
|
|
44
54
|
['lib.es2015.collection.d.ts: Set.add(T)', BuiltApiType.SetAdd],
|
|
45
55
|
['lib.es2015.collection.d.ts: Set.forEach(', BuiltApiType.Foreach],
|
|
@@ -109,6 +109,7 @@ export declare class PagNode extends BaseNode {
|
|
|
109
109
|
setClonedFrom(id: NodeID): void;
|
|
110
110
|
getDotAttr(): string;
|
|
111
111
|
getDotLabel(): string;
|
|
112
|
+
getFunctionNameFromThisRefNode(): string | undefined;
|
|
112
113
|
}
|
|
113
114
|
export declare class PagLocalNode extends PagNode {
|
|
114
115
|
private relatedDynamicCallSite?;
|
|
@@ -210,6 +211,15 @@ export declare class Pag extends BaseExplicitGraph {
|
|
|
210
211
|
getCG(): CallGraph;
|
|
211
212
|
getOrClonePagNode(src: PagNode, basePt: NodeID): PagNode;
|
|
212
213
|
getOrClonePagFieldNode(src: PagInstanceFieldNode, basePt: NodeID): PagInstanceFieldNode | undefined;
|
|
214
|
+
/**
|
|
215
|
+
* Handle field access on container types (Array, Set, Map)
|
|
216
|
+
* Distinguishes between element access and property access based on container type and field name
|
|
217
|
+
* @param baseNode The container node (PagNewContainerExprNode)
|
|
218
|
+
* @param src The abstract field node representing the access
|
|
219
|
+
* @param basePt The pointer ID of the base container
|
|
220
|
+
* @returns PagInstanceFieldNode for the access, or undefined if error
|
|
221
|
+
*/
|
|
222
|
+
private handleContainerFieldAccess;
|
|
213
223
|
getOrClonePagContainerFieldNode(basePt: NodeID, base: Local, className: string): PagInstanceFieldNode | undefined;
|
|
214
224
|
getOrClonePagFuncNode(basePt: NodeID): PagFuncNode | undefined;
|
|
215
225
|
addPagNode(cid: ContextID, value: PagNodeType, stmt?: Stmt, refresh?: boolean): PagNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pag.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/Pag.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACzG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAiB,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAA+B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzI,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAyB,YAAY,EAAkF,MAAM,YAAY,CAAC;AACjJ,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Pag.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/Pag.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACzG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAiB,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAA+B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzI,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG9C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAyB,YAAY,EAAkF,MAAM,YAAY,CAAC;AACjJ,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC;AAMhC,oBAAY,WAAW;IACnB,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,KAAK,IAAA;IACL,IAAI,IAAA;IACJ,OAAO,IAAA;IACP,mBAAmB,IAAA;CACtB;AAED,qBAAa,OAAQ,SAAQ,QAAQ;IACjC,OAAO,CAAC,IAAI,CAAmB;gBAEnB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI;IAKrD,UAAU,IAAI,MAAM;CAqB9B;AAED,qBAAa,WAAY,SAAQ,OAAO;gBACxB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;CAG9C;AAED,qBAAa,WAAY,SAAQ,OAAO;gBACxB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;CAG9C;AAED,qBAAa,WAAY,SAAQ,OAAO;gBACxB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;CAG9C;AAED,qBAAa,YAAa,SAAQ,OAAO;gBACzB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;CAG9C;AAED,qBAAa,WAAY,SAAQ,OAAO;gBACxB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;CAG9C;AAED,KAAK,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;AAE/B,oBAAY,WAAW;IACnB,OAAO,IAAA;IACP,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,KAAK,IAAA;IACL,OAAO,IAAA;IACP,QAAQ,IAAA;IACR,UAAU,IAAA;IACV,UAAU,IAAA;CACb;AAED,qBAAa,OAAQ,SAAQ,QAAQ;IACjC,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,OAAO,CAAyB;IAExC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAc;IAKlC,SAAS,CAAC,MAAM,EAAG,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAG,MAAM,CAAC;gBAElB,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI;IASxF,SAAS,IAAI,MAAM;IAInB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B,MAAM,IAAI,SAAS;IAOnB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAI5B,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI;IAItB,OAAO,IAAI,IAAI,GAAG,SAAS;IAI3B,mBAAmB,IAAI,OAAO;IAI9B,oBAAoB,IAAI,UAAU;IAIlC,oBAAoB,IAAI,UAAU;IAIlC,oBAAoB,IAAI,UAAU;IAIlC,qBAAqB,IAAI,UAAU;IAInC,qBAAqB,IAAI,UAAU;IAInC,oBAAoB,IAAI,UAAU;IAIlC,oBAAoB,IAAI,UAAU;IAIlC,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMtC,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMvC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMnC,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAOpC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMnC,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMpC,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI;IAMrC,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMrC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMnC,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMpC,QAAQ,IAAI,KAAK;IAIjB,UAAU,IAAI,cAAc,CAAC,MAAM,CAAC;IAIpC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI;IAI7C,WAAW,IAAI;QAClB,WAAW,EAAE,UAAU,CAAC;QACxB,QAAQ,EAAE,UAAU,CAAC;QACrB,QAAQ,EAAE,UAAU,CAAC;QACrB,SAAS,EAAE,UAAU,CAAC;KACzB;IASM,aAAa,IAAI,MAAM;IAIvB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI/B,UAAU,IAAI,MAAM;IAqBpB,WAAW,IAAI,MAAM;IAmDrB,8BAA8B,IAAI,MAAM,GAAG,SAAS;CAwB9D;AAED,qBAAa,YAAa,SAAQ,OAAO;IACrC,OAAO,CAAC,sBAAsB,CAAC,CAAmB;IAClD,OAAO,CAAC,sBAAsB,CAAC,CAAgB;IAC/C,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,YAAY,CAAC,CAAS;IAE9B,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI;IAIlF,qBAAqB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAM5C,sBAAsB,IAAI,GAAG,CAAC,WAAW,CAAC;IAI1C,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAM7C,0BAA0B,IAAI,GAAG,CAAC,QAAQ,CAAC;IAI3C,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMpE,UAAU,IAAI;QAAE,WAAW,EAAE,WAAW,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAOhE,eAAe,IAAI,OAAO;IAI1B,WAAW,IAAI,IAAI;IAInB,UAAU,IAAI,OAAO;CAG/B;AAED,qBAAa,oBAAqB,SAAQ,OAAO;gBACjC,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,IAAI;CAGrH;AAED,qBAAa,kBAAmB,SAAQ,OAAO;gBAC/B,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,cAAc,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,IAAI;CAGjH;AAED,qBAAa,cAAe,SAAQ,OAAO;IACvC,WAAW,EAAE,MAAM,EAAE,CAAC;gBACV,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,OAAO,EAAE,UAAU;IAK5E,aAAa,IAAI,MAAM,EAAE;IAIzB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGzC;AAED,qBAAa,YAAa,SAAQ,OAAO;IACrC,IAAI,EAAE,KAAK,CAAC;gBAEA,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI;CAIjG;AAED,qBAAa,eAAgB,SAAQ,OAAO;gBAC5B,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI;CAGlG;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,OAAO;IAEvC,UAAU,EAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAErB,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,IAAI;IAIxF,YAAY,CAAC,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAWvE,YAAY,CAAC,cAAc,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS;IAOlE,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;CAM1D;AAED,qBAAa,uBAAwB,SAAQ,OAAO;IAEhD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEpB,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI;IAIjF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAQvC,cAAc,IAAI,MAAM,GAAG,SAAS;CAM9C;AAED,qBAAa,YAAa,SAAQ,OAAO;gBACzB,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,IAAI;CAGlG;AAED,qBAAa,WAAY,SAAQ,OAAO;IACpC,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAa;gBAGlB,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,EAAE,MAAM;IAYjI,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAKxC,SAAS,IAAI,eAAe;IAI5B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,IAAI,MAAM;IAInB,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAI/B,KAAK,IAAI,QAAQ;IAIjB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAInC,aAAa,IAAI,MAAM;IAIvB,aAAa,IAAI,YAAY;IAI7B,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAIlC,YAAY,IAAI,SAAS;CAGnC;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,OAAO;IAC1C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEpB,EAAE,EAAE,MAAM,EAAE,GAAG,oBAAmC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI;IAK9E,YAAY,CAAC,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAQvE,YAAY,CAAC,cAAc,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS;IAIlE,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;CAG1D;AAED,qBAAa,GAAI,SAAQ,iBAAiB;IACtC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,mBAAmB,CAAiD;IAC5E,OAAO,CAAC,iBAAiB,CAAC,CAA0B;IAGpD,OAAO,CAAC,kBAAkB,CAAmD;IAE7E,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,aAAa,CAA+C;IAE7D,KAAK,IAAI,SAAS;IAQlB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAuBxD,sBAAsB,CAAC,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAqB1G;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAsE3B,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAiDjH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAW9D,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,GAAE,OAAc,GAAG,OAAO;IAgCpG,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IA6Cd,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAQtF,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS;IAKhD,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS;IAcxD,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS;IAc3D,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAiB/D,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,SAAS;IAI7D,mBAAmB,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS;IAInE,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO;IAyC/E,YAAY,IAAI,UAAU;IAI1B,cAAc,IAAI,IAAI;IAItB,YAAY,IAAI,MAAM;IAItB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAIlC;AAED,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAC3C,MAAM,MAAM,mBAAmB,GAAG;IAC9B,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,EAAE,KAAK,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;CACd,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,GAAG,EAAE,sBAAsB,CAAC;IAC5B,GAAG,EAAE,KAAK,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,qBAAa,OAAO;IAChB,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,gBAAgB,CAAiB;IAElC,gBAAgB,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,SAAS;IAIxD,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAKrC,kBAAkB,IAAI,GAAG,CAAC,QAAQ,CAAC;IAKnC,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAKzC,mBAAmB,IAAI,GAAG,CAAC,WAAW,CAAC;IAKvC,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAKtC,mBAAmB,IAAI,GAAG,CAAC,QAAQ,CAAC;IAKpC,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CAmBvE;AAED,qBAAa,YAAY;IACrB,OAAO,CAAC,cAAc,CAA2B;;IAM1C,uBAAuB,IAAI,GAAG,CAAC,mBAAmB,CAAC;IAInD,2BAA2B,CAAC,CAAC,EAAE,mBAAmB,GAAG,IAAI;CAGnE"}
|
|
@@ -52,6 +52,7 @@ const TSConst_1 = require("../../core/common/TSConst");
|
|
|
52
52
|
const ArkExport_1 = require("../../core/model/ArkExport");
|
|
53
53
|
const PTAUtils_1 = require("./PTAUtils");
|
|
54
54
|
const PointerAnalysisConfig_1 = require("./PointerAnalysisConfig");
|
|
55
|
+
const Context_1 = require("./context/Context");
|
|
55
56
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'PTA');
|
|
56
57
|
/*
|
|
57
58
|
* Implementation of pointer-to assignment graph for pointer analysis
|
|
@@ -305,10 +306,21 @@ class PagNode extends BaseExplicitGraph_1.BaseNode {
|
|
|
305
306
|
label = label + `\nParam#${param.getIndex()} ${param.toString()}`;
|
|
306
307
|
}
|
|
307
308
|
if (this.getKind() === PagNodeKind.ThisRef) {
|
|
308
|
-
|
|
309
|
+
const thisRef = this.value;
|
|
310
|
+
label = label + `\n${thisRef.toString()}`;
|
|
311
|
+
const funcName = this.getFunctionNameFromThisRefNode();
|
|
312
|
+
if (funcName) {
|
|
313
|
+
label = label + `\n${funcName}()`;
|
|
314
|
+
}
|
|
309
315
|
}
|
|
310
316
|
if (this.getKind() === PagNodeKind.Function) {
|
|
311
|
-
|
|
317
|
+
const funcNode = this;
|
|
318
|
+
label = label + ` thisPt:{${funcNode.getThisPt()}}`;
|
|
319
|
+
const methodSig = funcNode.getMethod();
|
|
320
|
+
if (methodSig) {
|
|
321
|
+
const funcName = methodSig.getMethodSubSignature().getMethodName();
|
|
322
|
+
label = label + `\nFunc: ${funcName}()`;
|
|
323
|
+
}
|
|
312
324
|
}
|
|
313
325
|
if (this.stmt) {
|
|
314
326
|
label = label + `\n${this.stmt.toString()}`;
|
|
@@ -323,6 +335,34 @@ class PagNode extends BaseExplicitGraph_1.BaseNode {
|
|
|
323
335
|
}
|
|
324
336
|
return label;
|
|
325
337
|
}
|
|
338
|
+
getFunctionNameFromThisRefNode() {
|
|
339
|
+
var _a;
|
|
340
|
+
const outgoingEdges = this.getOutgoingEdges();
|
|
341
|
+
for (const edge of outgoingEdges) {
|
|
342
|
+
const dstNode = edge.getDstNode();
|
|
343
|
+
if (!dstNode) {
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const value = dstNode.getValue();
|
|
347
|
+
if (!(value instanceof Local_1.Local)) {
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
const local = value;
|
|
351
|
+
if (local.getName() !== 'this') {
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
const declaringStmt = local.getDeclaringStmt();
|
|
355
|
+
if (!declaringStmt) {
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
const method = (_a = declaringStmt.getCfg()) === null || _a === void 0 ? void 0 : _a.getDeclaringMethod();
|
|
359
|
+
if (!method) {
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
return method.getName();
|
|
363
|
+
}
|
|
364
|
+
return undefined;
|
|
365
|
+
}
|
|
326
366
|
}
|
|
327
367
|
exports.PagNode = PagNode;
|
|
328
368
|
class PagLocalNode extends PagNode {
|
|
@@ -589,11 +629,86 @@ class Pag extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
589
629
|
fieldNode.setBasePt(basePt);
|
|
590
630
|
return fieldNode;
|
|
591
631
|
}
|
|
632
|
+
else if (baseNode instanceof PagNewContainerExprNode) {
|
|
633
|
+
return this.handleContainerFieldAccess(baseNode, src, basePt);
|
|
634
|
+
}
|
|
592
635
|
else {
|
|
593
|
-
logger.error(`Error clone field node ${src.getValue()}`);
|
|
636
|
+
logger.error(`Error clone field node ${src.getValue()}, baseNode type: ${baseNode === null || baseNode === void 0 ? void 0 : baseNode.constructor.name}`);
|
|
594
637
|
return undefined;
|
|
595
638
|
}
|
|
596
639
|
}
|
|
640
|
+
/**
|
|
641
|
+
* Handle field access on container types (Array, Set, Map)
|
|
642
|
+
* Distinguishes between element access and property access based on container type and field name
|
|
643
|
+
* @param baseNode The container node (PagNewContainerExprNode)
|
|
644
|
+
* @param src The abstract field node representing the access
|
|
645
|
+
* @param basePt The pointer ID of the base container
|
|
646
|
+
* @returns PagInstanceFieldNode for the access, or undefined if error
|
|
647
|
+
*/
|
|
648
|
+
handleContainerFieldAccess(baseNode, src, basePt) {
|
|
649
|
+
// Container types (Array, Set, Map) have two kinds of access:
|
|
650
|
+
// 1. Element access (arr[0]) - should create element node via getOrClonePagContainerFieldNode
|
|
651
|
+
// 2. Property access (arr.length) - should create field node as regular object fields
|
|
652
|
+
const fieldRef = src.getValue();
|
|
653
|
+
const fieldName = fieldRef.getFieldSignature().getFieldName();
|
|
654
|
+
const base = fieldRef.getBase();
|
|
655
|
+
// Get container type from the node's value
|
|
656
|
+
// PagNewContainerExprNode can contain either ArkNewExpr or ArkNewArrayExpr
|
|
657
|
+
const containerValue = baseNode.getValue();
|
|
658
|
+
let containerClassSig = '';
|
|
659
|
+
if (containerValue instanceof Expr_1.ArkNewExpr) {
|
|
660
|
+
// Regular container object: new Map(), new Set()
|
|
661
|
+
containerClassSig = containerValue.getClassType().getClassSignature().toString();
|
|
662
|
+
}
|
|
663
|
+
else if (containerValue instanceof Expr_1.ArkNewArrayExpr) {
|
|
664
|
+
// Array created via array literal: [1, 2, 3]
|
|
665
|
+
containerClassSig = 'lib.es5.d.ts: Array';
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
// Fallback: check base type
|
|
669
|
+
const baseType = base.getType();
|
|
670
|
+
containerClassSig = baseType.toString();
|
|
671
|
+
}
|
|
672
|
+
// Determine if this is element access or property access based on container type
|
|
673
|
+
let isElementAccess = false;
|
|
674
|
+
let containerType = '';
|
|
675
|
+
if (containerClassSig.includes('lib.es5.d.ts: Array') || containerClassSig.includes('ArrayType')) {
|
|
676
|
+
containerType = 'Array';
|
|
677
|
+
// Array: exclude known properties (length, push, pop, etc.)
|
|
678
|
+
// Everything else should be treated as element access
|
|
679
|
+
const arrayProperties = ['length', 'push', 'pop', 'shift', 'unshift', 'splice',
|
|
680
|
+
'slice', 'concat', 'join', 'reverse', 'sort', 'indexOf',
|
|
681
|
+
'lastIndexOf', 'forEach', 'map', 'filter', 'reduce',
|
|
682
|
+
'reduceRight', 'every', 'some', 'find', 'findIndex'];
|
|
683
|
+
isElementAccess = !arrayProperties.includes(fieldName);
|
|
684
|
+
}
|
|
685
|
+
else if (containerClassSig.includes('lib.es2015.collection.d.ts: Map')) {
|
|
686
|
+
containerType = 'Map';
|
|
687
|
+
// Map: 'field' is the virtual field name for element access
|
|
688
|
+
isElementAccess = (fieldName === 'field');
|
|
689
|
+
}
|
|
690
|
+
else if (containerClassSig.includes('lib.es2015.collection.d.ts: Set')) {
|
|
691
|
+
containerType = 'Set';
|
|
692
|
+
// Set: 'field' is the virtual field name for element access
|
|
693
|
+
isElementAccess = (fieldName === 'field');
|
|
694
|
+
}
|
|
695
|
+
if (isElementAccess && containerType) {
|
|
696
|
+
// This is element access (e.g., arr[i], map.get(key), set elements)
|
|
697
|
+
// IMPORTANT: In some cases, the type of arr.i may be unknow,
|
|
698
|
+
// so this is actually ArrayRef rather than InstanceFieldRef
|
|
699
|
+
// Redirect to container element node handling
|
|
700
|
+
logger.debug(`[PTA]: Detected element access on ${containerType}: ${fieldRef}, redirecting to container element node`);
|
|
701
|
+
return this.getOrClonePagContainerFieldNode(basePt, base, containerType);
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
// This is property access (e.g., arr.length)
|
|
705
|
+
// Create field node without caching in baseNode.fieldNodes
|
|
706
|
+
logger.debug(`[PTA]: Detected property access on ${containerType || 'container'}: ${fieldName}, treating as regular field`);
|
|
707
|
+
let fieldNode = this.getOrClonePagNode(src, basePt);
|
|
708
|
+
fieldNode.setBasePt(basePt);
|
|
709
|
+
return fieldNode;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
597
712
|
getOrClonePagContainerFieldNode(basePt, base, className) {
|
|
598
713
|
let baseNode = this.getNode(basePt);
|
|
599
714
|
if (baseNode instanceof PagNewContainerExprNode) {
|
|
@@ -618,7 +733,12 @@ class Pag extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
618
733
|
logger.error(`Error clone array field node ${className}`);
|
|
619
734
|
return undefined;
|
|
620
735
|
}
|
|
621
|
-
|
|
736
|
+
// Use special container element context ID (CONTAINER_ELEMENT_CID = -2)
|
|
737
|
+
// This allows:
|
|
738
|
+
// 1. Same container object's elements to be shared across all contexts (via basePt)
|
|
739
|
+
// 2. Different container objects NOT to share elements (via different basePt)
|
|
740
|
+
// 3. Avoid global abstract containers (cid=0) from polluting concrete containers
|
|
741
|
+
fieldNode = this.addPagNode(Context_1.CONTAINER_ELEMENT_CID, fieldRef);
|
|
622
742
|
baseNode.addElementNode(fieldNode.getID());
|
|
623
743
|
fieldNode.setBasePt(basePt);
|
|
624
744
|
return fieldNode;
|
|
@@ -5,7 +5,7 @@ import { Value } from '../../core/base/Value';
|
|
|
5
5
|
import { ArkMethod } from '../../core/model/ArkMethod';
|
|
6
6
|
import { Local } from '../../core/base/Local';
|
|
7
7
|
import { NodeID } from '../../core/graph/BaseExplicitGraph';
|
|
8
|
-
import { FuncPag, InterFuncPag, Pag, PagNode, PagNodeType } from './Pag';
|
|
8
|
+
import { FuncPag, InterFuncPag, IntraProceduralEdge, Pag, PagNode, PagNodeType } from './Pag';
|
|
9
9
|
import { IPtsCollection } from './PtsDS';
|
|
10
10
|
import { PointerAnalysisConfig } from './PointerAnalysisConfig';
|
|
11
11
|
import { ContextID } from './context/Context';
|
|
@@ -37,6 +37,7 @@ export declare class PagBuilder {
|
|
|
37
37
|
private globalThisPagNode?;
|
|
38
38
|
private externalScopeVariableMap;
|
|
39
39
|
private retriggerNodesList;
|
|
40
|
+
private arrowFunctionObjectMap;
|
|
40
41
|
constructor(p: Pag, cg: CallGraph, s: Scene, config: PointerAnalysisConfig);
|
|
41
42
|
buildFuncPagAndAddToWorklist(cs: CSFuncID): CSFuncID;
|
|
42
43
|
private addToFuncHandledListThisRound;
|
|
@@ -53,6 +54,12 @@ export declare class PagBuilder {
|
|
|
53
54
|
private createDummyParamPagNodes;
|
|
54
55
|
buildPagFromFuncPag(funcID: FuncID, cid: ContextID): void;
|
|
55
56
|
addEdgesFromFuncPag(funcPag: FuncPag, cid: ContextID, funcID: FuncID): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* handle closure field ref intra-procedural edge
|
|
59
|
+
* @param edge the intra-procedural edge with ClosureFieldRef as src
|
|
60
|
+
* @param cid
|
|
61
|
+
*/
|
|
62
|
+
addClosureEdges(edge: IntraProceduralEdge, cid: ContextID): void;
|
|
56
63
|
addCallsEdgesFromFuncPag(funcPag: FuncPag, cid: ContextID): boolean;
|
|
57
64
|
addDynamicCallSite(funcPag: FuncPag, funcID: FuncID, cid: ContextID): void;
|
|
58
65
|
addUnknownCallSite(funcPag: FuncPag, funcID: FuncID): void;
|
|
@@ -72,12 +79,6 @@ export declare class PagBuilder {
|
|
|
72
79
|
* only process the param PAG edge for invoke stmt
|
|
73
80
|
*/
|
|
74
81
|
addCallParamPagEdge(calleeMethod: ArkMethod, args: Value[], cs: ICallSite, callerCid: ContextID, calleeCid: ContextID, offset: number): NodeID[];
|
|
75
|
-
/**
|
|
76
|
-
* temporary solution for foreach
|
|
77
|
-
* deprecate when foreach is handled by built-in method
|
|
78
|
-
* connect the element node with the value inside foreach
|
|
79
|
-
*/
|
|
80
|
-
private addForeachParamPagEdge;
|
|
81
82
|
/**
|
|
82
83
|
* process the return value PAG edge for invoke stmt
|
|
83
84
|
*/
|
|
@@ -133,5 +134,21 @@ export declare class PagBuilder {
|
|
|
133
134
|
getUpdatedNodes(): Map<number, IPtsCollection<number>>;
|
|
134
135
|
resetUpdatedNodes(): void;
|
|
135
136
|
getContextSelector(): ContextSelector;
|
|
137
|
+
/**
|
|
138
|
+
* Record arrow function object node for later thisPt setup
|
|
139
|
+
*/
|
|
140
|
+
private recordArrowFunctionObjectNode;
|
|
141
|
+
/**
|
|
142
|
+
* Set up 'this' binding for arrow functions
|
|
143
|
+
* 1. Set the thisPt of arrow function object node (pointing to ThisRef node inside arrow function body)
|
|
144
|
+
* 2. Establish This edge from arrow function's ThisRef to outer function's this
|
|
145
|
+
*/
|
|
146
|
+
private setupArrowFunctionThis;
|
|
147
|
+
/**
|
|
148
|
+
* Find 'this' local node for the specified method in the specified context
|
|
149
|
+
* @param method Target method
|
|
150
|
+
* @param contextID Optional context ID. If not specified, returns the 'this' node in the first found context
|
|
151
|
+
*/
|
|
152
|
+
private findThisNodeForMethod;
|
|
136
153
|
}
|
|
137
154
|
//# sourceMappingURL=PagBuilder.d.ts.map
|
|
@@ -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,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3H,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAA+C,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAUzF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAM5D,OAAO,EACH,OAAO,EACP,YAAY,
|
|
1
|
+
{"version":3,"file":"PagBuilder.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PagBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -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);
|
|
@@ -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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValueInference.d.ts","sourceRoot":"","sources":["../../../src/core/inference/ValueInference.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"ValueInference.d.ts","sourceRoot":"","sources":["../../../src/core/inference/ValueInference.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,13 +56,13 @@ const TSConst_1 = require("../common/TSConst");
|
|
|
56
56
|
const Expr_1 = require("../base/Expr");
|
|
57
57
|
const ModelUtils_1 = require("../common/ModelUtils");
|
|
58
58
|
const Local_1 = require("../base/Local");
|
|
59
|
-
const Builtin_1 = require("../common/Builtin");
|
|
60
59
|
const ArkClass_1 = require("../model/ArkClass");
|
|
61
60
|
const Constant_1 = require("../base/Constant");
|
|
62
61
|
const logger_1 = __importStar(require("../../utils/logger"));
|
|
63
62
|
const ArkSignature_1 = require("../model/ArkSignature");
|
|
64
63
|
const ArkImport_1 = require("../model/ArkImport");
|
|
65
64
|
const ArkField_1 = require("../model/ArkField");
|
|
65
|
+
const Builtin_1 = require("../common/Builtin");
|
|
66
66
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'ValueInference');
|
|
67
67
|
var InferLanguage;
|
|
68
68
|
(function (InferLanguage) {
|
|
@@ -225,27 +225,11 @@ let FieldRefInference = class FieldRefInference extends ValueInference {
|
|
|
225
225
|
* or undefined for regular instance fields
|
|
226
226
|
*/
|
|
227
227
|
infer(value, stmt) {
|
|
228
|
-
const baseType =
|
|
228
|
+
const baseType = value.getBase().getType();
|
|
229
229
|
const arkMethod = stmt.getCfg().getDeclaringMethod();
|
|
230
|
-
// Special handling for array types with dynamic field access
|
|
231
|
-
if (baseType instanceof Type_1.ArrayType && value.isDynamic()) {
|
|
232
|
-
const index = TypeInference_1.TypeInference.getLocalFromMethodBody(value.getFieldName(), arkMethod);
|
|
233
|
-
if (index) {
|
|
234
|
-
return new Ref_1.ArkArrayRef(value.getBase(), index);
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
return new Ref_1.ArkArrayRef(value.getBase(), ValueUtil_1.ValueUtil.createConst(value.getFieldName()));
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
230
|
// Generate updated field signature based on current context
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
value.setFieldSignature(newFieldSignature);
|
|
244
|
-
if (newFieldSignature.isStatic()) {
|
|
245
|
-
return new Ref_1.ArkStaticFieldRef(newFieldSignature);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
return undefined;
|
|
231
|
+
const result = IRInference_1.IRInference.inferInstanceMember(baseType, value, arkMethod, IRInference_1.IRInference.updateRefSignature);
|
|
232
|
+
return !result || result === value ? undefined : result;
|
|
249
233
|
}
|
|
250
234
|
};
|
|
251
235
|
FieldRefInference = __decorate([
|
|
@@ -277,19 +261,13 @@ let StaticFieldRefInference = class StaticFieldRefInference extends ValueInferen
|
|
|
277
261
|
infer(value, stmt) {
|
|
278
262
|
const baseSignature = value.getFieldSignature().getDeclaringSignature();
|
|
279
263
|
const baseName = baseSignature instanceof ArkSignature_1.ClassSignature ? baseSignature.getClassName() : baseSignature.getNamespaceName();
|
|
280
|
-
const
|
|
281
|
-
const baseType = TypeInference_1.TypeInference.inferBaseType(baseName,
|
|
264
|
+
const arkMethod = stmt.getCfg().getDeclaringMethod();
|
|
265
|
+
const baseType = TypeInference_1.TypeInference.inferBaseType(baseName, arkMethod.getDeclaringArkClass());
|
|
282
266
|
if (!baseType) {
|
|
283
267
|
return undefined;
|
|
284
268
|
}
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
value.setFieldSignature(newFieldSignature);
|
|
288
|
-
if (newFieldSignature.isStatic()) {
|
|
289
|
-
return new Ref_1.ArkStaticFieldRef(newFieldSignature);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
return undefined;
|
|
269
|
+
const result = IRInference_1.IRInference.inferInstanceMember(baseType, value, arkMethod, IRInference_1.IRInference.updateRefSignature);
|
|
270
|
+
return !result || result === value ? undefined : result;
|
|
293
271
|
}
|
|
294
272
|
};
|
|
295
273
|
StaticFieldRefInference = __decorate([
|
|
@@ -320,7 +298,7 @@ let InstanceInvokeExprInference = InstanceInvokeExprInference_1 = class Instance
|
|
|
320
298
|
*/
|
|
321
299
|
infer(value, stmt) {
|
|
322
300
|
const arkMethod = stmt.getCfg().getDeclaringMethod();
|
|
323
|
-
const result =
|
|
301
|
+
const result = IRInference_1.IRInference.inferInstanceMember(value.getBase().getType(), value, arkMethod, InstanceInvokeExprInference_1.inferInvokeExpr);
|
|
324
302
|
return !result || result === value ? undefined : result;
|
|
325
303
|
}
|
|
326
304
|
/**
|
|
@@ -344,49 +322,21 @@ let InstanceInvokeExprInference = InstanceInvokeExprInference_1 = class Instance
|
|
|
344
322
|
getMethodName(expr, arkMethod) {
|
|
345
323
|
return expr.getMethodSignature().getMethodSubSignature().getMethodName();
|
|
346
324
|
}
|
|
347
|
-
static inferInvokeExpr(baseType, expr, arkMethod
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
if (baseType instanceof Type_1.
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
let result = this.inferInvokeExpr(type, expr, arkMethod, methodName);
|
|
359
|
-
if (result) {
|
|
360
|
-
return result;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
else if (baseType instanceof Type_1.ArrayType) {
|
|
365
|
-
const arrayClass = arkMethod.getDeclaringArkFile().getScene().getSdkGlobal(Builtin_1.Builtin.ARRAY);
|
|
366
|
-
if (arrayClass instanceof ArkClass_1.ArkClass) {
|
|
367
|
-
baseType = new Type_1.ClassType(arrayClass.getSignature(), [baseType.getBaseType()]);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
else if (baseType instanceof Type_1.GenericType) {
|
|
371
|
-
const newType = (_a = baseType.getDefaultType()) !== null && _a !== void 0 ? _a : baseType.getConstraint();
|
|
372
|
-
if (!newType) {
|
|
373
|
-
return null;
|
|
325
|
+
static inferInvokeExpr(baseType, expr, arkMethod) {
|
|
326
|
+
const methodName = expr.getMethodSignature().getMethodSubSignature().getMethodName();
|
|
327
|
+
const scene = arkMethod.getDeclaringArkFile().getScene();
|
|
328
|
+
if (baseType instanceof Type_1.ArrayType || baseType instanceof Type_1.TupleType) {
|
|
329
|
+
const arrayInterface = scene.getSdkGlobal(Builtin_1.Builtin.ARRAY);
|
|
330
|
+
const realTypes = baseType instanceof Type_1.ArrayType ? [baseType.getBaseType()] : undefined;
|
|
331
|
+
if (arrayInterface instanceof ArkClass_1.ArkClass) {
|
|
332
|
+
baseType = new Type_1.ClassType(arrayInterface.getSignature(), realTypes);
|
|
374
333
|
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
const name = baseType.getName();
|
|
380
|
-
const className = name.charAt(0).toUpperCase() + name.slice(1);
|
|
381
|
-
const arrayClass = arkMethod.getDeclaringArkFile().getScene().getSdkGlobal(className);
|
|
382
|
-
if (arrayClass instanceof ArkClass_1.ArkClass) {
|
|
383
|
-
baseType = new Type_1.ClassType(arrayClass.getSignature());
|
|
334
|
+
else if (methodName === Builtin_1.Builtin.ITERATOR_FUNCTION) {
|
|
335
|
+
expr.getMethodSignature().getMethodSubSignature().setReturnType(Builtin_1.Builtin.ITERATOR_CLASS_TYPE);
|
|
336
|
+
expr.setRealGenericTypes(realTypes !== null && realTypes !== void 0 ? realTypes : expr.getRealGenericTypes());
|
|
337
|
+
return expr;
|
|
384
338
|
}
|
|
385
339
|
}
|
|
386
|
-
const scene = arkMethod.getDeclaringArkFile().getScene();
|
|
387
|
-
return this.inferMethodFromBase(baseType, expr, scene, methodName);
|
|
388
|
-
}
|
|
389
|
-
static inferMethodFromBase(baseType, expr, scene, methodName) {
|
|
390
340
|
// Dispatch to appropriate inference method based on resolved base type
|
|
391
341
|
if (baseType instanceof Type_1.ClassType) {
|
|
392
342
|
return IRInference_1.IRInference.inferInvokeExprWithDeclaredClass(expr, baseType, methodName, scene);
|
|
@@ -406,9 +356,6 @@ let InstanceInvokeExprInference = InstanceInvokeExprInference_1 = class Instance
|
|
|
406
356
|
else if (baseType instanceof Type_1.FunctionType) {
|
|
407
357
|
return IRInference_1.IRInference.inferInvokeExprWithFunction(methodName, expr, baseType, scene);
|
|
408
358
|
}
|
|
409
|
-
else if (baseType instanceof Type_1.ArrayType) {
|
|
410
|
-
return IRInference_1.IRInference.inferInvokeExprWithArray(methodName, expr, baseType, scene);
|
|
411
|
-
}
|
|
412
359
|
return null;
|
|
413
360
|
}
|
|
414
361
|
};
|
|
@@ -447,7 +394,7 @@ let StaticInvokeExprInference = class StaticInvokeExprInference extends Instance
|
|
|
447
394
|
return undefined;
|
|
448
395
|
}
|
|
449
396
|
const baseType = this.getBaseType(expr, arkMethod);
|
|
450
|
-
const result = baseType ?
|
|
397
|
+
const result = baseType ? IRInference_1.IRInference.inferInstanceMember(baseType, expr, arkMethod, InstanceInvokeExprInference.inferInvokeExpr) :
|
|
451
398
|
IRInference_1.IRInference.inferStaticInvokeExprByMethodName(methodName, arkMethod, expr);
|
|
452
399
|
return !result || result === expr ? undefined : result;
|
|
453
400
|
}
|
|
@@ -690,7 +637,7 @@ let ArkTsInstanceInvokeExprInference = class ArkTsInstanceInvokeExprInference ex
|
|
|
690
637
|
var _a;
|
|
691
638
|
const arkMethod = stmt.getCfg().getDeclaringMethod();
|
|
692
639
|
TypeInference_1.TypeInference.inferRealGenericTypes(value.getRealGenericTypes(), arkMethod.getDeclaringArkClass());
|
|
693
|
-
const result = (_a =
|
|
640
|
+
const result = (_a = IRInference_1.IRInference.inferInstanceMember(value.getBase().getType(), value, arkMethod, InstanceInvokeExprInference.inferInvokeExpr)) !== null && _a !== void 0 ? _a : IRInference_1.IRInference.processExtendFunc(value, arkMethod, super.getMethodName(value, arkMethod));
|
|
694
641
|
return !result || result === value ? undefined : result;
|
|
695
642
|
}
|
|
696
643
|
};
|