arkanalyzer 1.0.48 → 1.0.50
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/algorithm/ClassHierarchyAnalysis.d.ts +1 -0
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +16 -4
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/RapidTypeAnalysis.js +0 -3
- package/lib/callgraph/common/Statistics.d.ts +1 -0
- package/lib/callgraph/common/Statistics.d.ts.map +1 -1
- package/lib/callgraph/common/Statistics.js +38 -14
- package/package.json +2 -2
|
@@ -8,5 +8,6 @@ export declare class ClassHierarchyAnalysis extends AbstractAnalysis {
|
|
|
8
8
|
constructor(scene: Scene, cg: CallGraph, cb: CallGraphBuilder);
|
|
9
9
|
resolveCall(callerMethod: NodeID, invokeStmt: Stmt): CallSite[];
|
|
10
10
|
protected preProcessMethod(): CallSite[];
|
|
11
|
+
private checkSuperInvoke;
|
|
11
12
|
}
|
|
12
13
|
//# sourceMappingURL=ClassHierarchyAnalysis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClassHierarchyAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/ClassHierarchyAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"ClassHierarchyAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/ClassHierarchyAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAGrE,qBAAa,sBAAuB,SAAQ,gBAAgB;gBAC5C,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB;IAKtD,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IA+DtE,SAAS,CAAC,gBAAgB,IAAI,QAAQ,EAAE;IAKxC,OAAO,CAAC,gBAAgB;CAU3B"}
|
|
@@ -24,6 +24,7 @@ class ClassHierarchyAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
24
24
|
}
|
|
25
25
|
resolveCall(callerMethod, invokeStmt) {
|
|
26
26
|
let invokeExpr = invokeStmt.getInvokeExpr();
|
|
27
|
+
const stmtDeclareClass = invokeStmt.getCfg().getDeclaringMethod().getDeclaringArkClass().getSignature();
|
|
27
28
|
let resolveResult = [];
|
|
28
29
|
if (!invokeExpr) {
|
|
29
30
|
return [];
|
|
@@ -42,11 +43,12 @@ class ClassHierarchyAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
42
43
|
}
|
|
43
44
|
else {
|
|
44
45
|
let declareClass = calleeMethod.getDeclaringArkClass();
|
|
45
|
-
//
|
|
46
|
+
// block super invoke
|
|
47
|
+
if (this.checkSuperInvoke(invokeStmt, declareClass, stmtDeclareClass)) {
|
|
48
|
+
resolveResult.push(this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, this.cg.getCallGraphNodeByMethod(calleeMethod.getSignature()).getID(), callerMethod));
|
|
49
|
+
return resolveResult;
|
|
50
|
+
}
|
|
46
51
|
this.getClassHierarchy(declareClass).forEach((arkClass) => {
|
|
47
|
-
if (arkClass.isAbstract()) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
52
|
let possibleCalleeMethod = arkClass.getMethodWithName(calleeMethod.getName());
|
|
51
53
|
if (possibleCalleeMethod &&
|
|
52
54
|
possibleCalleeMethod.isGenerated() &&
|
|
@@ -65,5 +67,15 @@ class ClassHierarchyAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
65
67
|
// do nothing
|
|
66
68
|
return [];
|
|
67
69
|
}
|
|
70
|
+
checkSuperInvoke(invokeStmt, declareClass, stmtDeclareClass) {
|
|
71
|
+
const invokeExpr = invokeStmt.getInvokeExpr();
|
|
72
|
+
if (invokeExpr instanceof Expr_1.ArkInstanceInvokeExpr) {
|
|
73
|
+
const baseLocalName = invokeExpr.getBase().getName();
|
|
74
|
+
if (baseLocalName === 'this' && declareClass.getSignature() !== stmtDeclareClass) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
68
80
|
}
|
|
69
81
|
exports.ClassHierarchyAnalysis = ClassHierarchyAnalysis;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RapidTypeAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/RapidTypeAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAMtD,qBAAa,iBAAkB,SAAQ,gBAAgB;IAEnD,OAAO,CAAC,gBAAgB,CAAkC;IAE1D,OAAO,CAAC,YAAY,CAA2F;gBAEnG,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS;IAIhC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"RapidTypeAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/RapidTypeAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAMtD,qBAAa,iBAAkB,SAAQ,gBAAgB;IAEnD,OAAO,CAAC,gBAAgB,CAAkC;IAE1D,OAAO,CAAC,YAAY,CAA2F;gBAEnG,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS;IAIhC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IA4DtE,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IAqBtD,OAAO,CAAC,+BAA+B;IA4BhC,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI;CAK/G"}
|
|
@@ -72,9 +72,6 @@ class RapidTypeAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
72
72
|
let declareClass = calleeMethod.getDeclaringArkClass();
|
|
73
73
|
// TODO: super class method should be placed at the end
|
|
74
74
|
this.getClassHierarchy(declareClass).forEach((arkClass) => {
|
|
75
|
-
if (arkClass.isAbstract()) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
75
|
let possibleCalleeMethod = arkClass.getMethodWithName(calleeMethod.getName());
|
|
79
76
|
if (possibleCalleeMethod && possibleCalleeMethod.isGenerated() &&
|
|
80
77
|
arkClass.getSignature().toString() !== declareClass.getSignature().toString()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Statistics.d.ts","sourceRoot":"","sources":["../../../src/callgraph/common/Statistics.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"Statistics.d.ts","sourceRoot":"","sources":["../../../src/callgraph/common/Statistics.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAQrE,uBAAe,UAAU;IACrB,SAAS,EAAE,MAAM,CAAK;IACtB,SAAS,EAAE,MAAM,CAAK;IACtB,OAAO,EAAE,MAAM,CAAK;IAEb,OAAO,IAAI,MAAM;IAIjB,SAAS,IAAI,IAAI;CAG3B;AAED,qBAAa,OAAQ,SAAQ,UAAU;IACnC,GAAG,EAAE,eAAe,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAK;IAC7B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,iBAAiB,EAAE,MAAM,CAAK;IAC9B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,YAAY,EAAE,MAAM,CAAK;IACzB,WAAW,EAAE,MAAM,CAAK;IAExB,eAAe,EAAE,MAAM,CAAK;IAC5B,yBAAyB,EAAE,MAAM,CAAK;IACtC,oBAAoB,EAAE,MAAM,CAAK;IAGjC,sBAAsB,EAAE,MAAM,CAAK;IAEnC,uBAAuB,EAAE,MAAM,CAAK;IAEpC,wBAAwB,EAAE,MAAM,CAAK;IAErC,yBAAyB,EAAE,MAAM,CAAK;IACtC,gBAAgB,EAAE,MAAM,CAAK;IAE7B,SAAS,EAAE,MAAM,CAAK;IAEtB,aAAa,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,MAAM,CAAK;IACpB,QAAQ,EAAE,MAAM,CAAK;gBAET,GAAG,EAAE,eAAe;IAKzB,SAAS,IAAI,IAAI;IAKjB,OAAO,IAAI,IAAI;IAUf,MAAM,IAAI,MAAM;IAIvB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,yBAAyB;IA4BjC,OAAO,CAAC,oBAAoB;IAerB,OAAO,IAAI,MAAM;IAqBjB,SAAS,IAAI,IAAI;CAG3B;AAED,qBAAa,OAAQ,SAAQ,UAAU;IACnC,cAAc,EAAE,MAAM,CAAK;IAC3B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,YAAY,EAAE,MAAM,CAAK;IAElB,OAAO,IAAI,MAAM;IAUjB,SAAS,IAAI,IAAI;CAG3B;AAED,qBAAa,MAAO,SAAQ,UAAU;IAElC,YAAY,EAAE,MAAM,CAAK;IACzB,OAAO,EAAE,MAAM,CAAK;IACpB,UAAU,EAAE,MAAM,CAAK;IACvB,YAAY,EAAE,MAAM,CAAK;IACzB,cAAc,EAAE,MAAM,CAAK;IAC3B,QAAQ,EAAE,MAAM,CAAK;IAEd,SAAS,IAAI,IAAI;IAIjB,OAAO,IAAI,IAAI;IAKf,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAoB1C,OAAO,IAAI,MAAM;CAa3B"}
|
|
@@ -42,6 +42,8 @@ const Stmt_1 = require("../../core/base/Stmt");
|
|
|
42
42
|
const Type_1 = require("../../core/base/Type");
|
|
43
43
|
const CallGraph_1 = require("../model/CallGraph");
|
|
44
44
|
const logger_1 = __importStar(require("../../utils/logger"));
|
|
45
|
+
const Local_1 = require("../../core/base/Local");
|
|
46
|
+
const Ref_1 = require("../../core/base/Ref");
|
|
45
47
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'PTA');
|
|
46
48
|
const LABEL_WIDTH = 55;
|
|
47
49
|
class StatTraits {
|
|
@@ -101,6 +103,40 @@ class PTAStat extends StatTraits {
|
|
|
101
103
|
return new Date().getTime();
|
|
102
104
|
}
|
|
103
105
|
getInferedStat() {
|
|
106
|
+
let dm = this.pta.getTypeDiffMap();
|
|
107
|
+
for (let [v] of dm) {
|
|
108
|
+
if (v instanceof Local_1.Local) {
|
|
109
|
+
if (v.getName() === 'this') {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
let s = v.getDeclaringStmt();
|
|
113
|
+
if (s instanceof Stmt_1.ArkAssignStmt &&
|
|
114
|
+
s.getLeftOp() instanceof Local_1.Local &&
|
|
115
|
+
s.getLeftOp().getName() === 'this' &&
|
|
116
|
+
s.getRightOp() instanceof Ref_1.ArkThisRef) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (v.getType() instanceof Type_1.UnknownType) {
|
|
120
|
+
this.numInferedUnknownValue++;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.numInferedDiffTypeValue++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
if (v.getType() instanceof Type_1.UnknownType) {
|
|
128
|
+
this.numInferedUnknownValue++;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.numInferedDiffTypeValue++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
this.getNotInferredUnknownStat();
|
|
136
|
+
}
|
|
137
|
+
getNotInferredUnknownStat() {
|
|
138
|
+
let inferred = new Set(this.pta.getTypeDiffMap().keys());
|
|
139
|
+
let visited = new Set();
|
|
104
140
|
let stmtStat = (s) => {
|
|
105
141
|
if (!(s instanceof Stmt_1.ArkAssignStmt)) {
|
|
106
142
|
return;
|
|
@@ -110,23 +146,11 @@ class PTAStat extends StatTraits {
|
|
|
110
146
|
return;
|
|
111
147
|
}
|
|
112
148
|
visited.add(lop);
|
|
113
|
-
if (inferred.
|
|
114
|
-
|
|
115
|
-
this.numInferedUnknownValue++;
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
this.numInferedDiffTypeValue++;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
if (lop.getType() instanceof Type_1.UnknownType) {
|
|
123
|
-
this.numNotInferedUnknownValue++;
|
|
124
|
-
}
|
|
149
|
+
if (!inferred.has(lop) && lop.getType() instanceof Type_1.UnknownType) {
|
|
150
|
+
this.numNotInferedUnknownValue++;
|
|
125
151
|
}
|
|
126
152
|
this.totalValuesInVisitedFunc++;
|
|
127
153
|
};
|
|
128
|
-
let inferred = Array.from(this.pta.getTypeDiffMap().keys());
|
|
129
|
-
let visited = new Set();
|
|
130
154
|
let cg = this.pta.getCallGraph();
|
|
131
155
|
this.pta.getHandledFuncs().forEach(funcID => {
|
|
132
156
|
var _a;
|