arkanalyzer 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/arkanalyzer.json +8 -0
- package/docs/IR2ts-stmt.md +81 -0
- package/docs/IR2ts.md +82 -0
- package/lib/Config.d.ts +29 -1
- package/lib/Config.d.ts.map +1 -1
- package/lib/Config.js +44 -11
- package/lib/Scene.d.ts +152 -9
- package/lib/Scene.d.ts.map +1 -1
- package/lib/Scene.js +233 -66
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +2 -1
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/AbstractAnalysis.js +14 -7
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +2 -4
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/RapidTypeAnalysis.js +2 -3
- package/lib/callgraph/common/Statistics.js +1 -1
- package/lib/callgraph/model/BaseGraph.js +2 -2
- package/lib/callgraph/model/CallGraph.d.ts +3 -2
- package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
- package/lib/callgraph/model/CallGraph.js +23 -14
- package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +2 -2
- package/lib/callgraph/model/builder/CallGraphBuilder.js +3 -3
- package/lib/callgraph/pointerAnalysis/Context.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/Context.js +0 -1
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +36 -9
- package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.js +130 -37
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +34 -5
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +479 -126
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +6 -0
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +107 -45
- package/lib/callgraph/pointerAnalysis/PtsDS.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PtsDS.js +0 -2
- package/lib/core/base/Constant.d.ts +37 -5
- package/lib/core/base/Constant.d.ts.map +1 -1
- package/lib/core/base/Constant.js +58 -8
- package/lib/core/base/Expr.d.ts +98 -13
- package/lib/core/base/Expr.d.ts.map +1 -1
- package/lib/core/base/Expr.js +295 -127
- package/lib/core/base/Local.d.ts +70 -5
- package/lib/core/base/Local.d.ts.map +1 -1
- package/lib/core/base/Local.js +77 -4
- package/lib/core/base/Ref.d.ts +79 -5
- package/lib/core/base/Ref.d.ts.map +1 -1
- package/lib/core/base/Ref.js +143 -38
- package/lib/core/base/Stmt.d.ts +126 -12
- package/lib/core/base/Stmt.d.ts.map +1 -1
- package/lib/core/base/Stmt.js +135 -28
- package/lib/core/base/Type.d.ts +11 -2
- package/lib/core/base/Type.d.ts.map +1 -1
- package/lib/core/base/Type.js +47 -42
- package/lib/core/base/Value.d.ts +24 -2
- package/lib/core/base/Value.d.ts.map +1 -1
- package/lib/core/common/ArkError.d.ts +15 -0
- package/lib/core/common/ArkError.d.ts.map +1 -0
- package/lib/core/common/ArkError.js +28 -0
- package/lib/core/common/ArkIRTransformer.d.ts +12 -5
- package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
- package/lib/core/common/ArkIRTransformer.js +90 -45
- package/lib/core/common/BodyBuilder.d.ts +2 -0
- package/lib/core/common/BodyBuilder.d.ts.map +1 -1
- package/lib/core/common/BodyBuilder.js +5 -2
- package/lib/core/common/Builtin.js +1 -1
- package/lib/core/common/CfgBuilder.d.ts +12 -7
- package/lib/core/common/CfgBuilder.d.ts.map +1 -1
- package/lib/core/common/CfgBuilder.js +336 -140
- package/lib/core/common/Const.d.ts +15 -10
- package/lib/core/common/Const.d.ts.map +1 -1
- package/lib/core/common/Const.js +18 -11
- package/lib/core/common/DummyMainCreater.d.ts +5 -4
- package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
- package/lib/core/common/DummyMainCreater.js +43 -28
- package/lib/core/common/EtsConst.d.ts +1 -0
- package/lib/core/common/EtsConst.d.ts.map +1 -1
- package/lib/core/common/EtsConst.js +2 -1
- package/lib/core/common/ExprUseReplacer.js +8 -8
- package/lib/core/common/IRUtils.d.ts +7 -0
- package/lib/core/common/IRUtils.d.ts.map +1 -1
- package/lib/core/common/IRUtils.js +34 -2
- package/lib/core/common/ModelUtils.d.ts +1 -0
- package/lib/core/common/ModelUtils.d.ts.map +1 -1
- package/lib/core/common/ModelUtils.js +39 -36
- package/lib/core/common/RefUseReplacer.js +3 -3
- package/lib/core/common/StmtUseReplacer.js +4 -4
- package/lib/core/common/TSConst.d.ts +10 -3
- package/lib/core/common/TSConst.d.ts.map +1 -1
- package/lib/core/common/TSConst.js +11 -4
- package/lib/core/common/TypeInference.d.ts +8 -2
- package/lib/core/common/TypeInference.d.ts.map +1 -1
- package/lib/core/common/TypeInference.js +222 -90
- package/lib/core/common/ValueUtil.d.ts +0 -4
- package/lib/core/common/ValueUtil.d.ts.map +1 -1
- package/lib/core/common/ValueUtil.js +10 -27
- package/lib/core/common/VisibleValue.js +1 -1
- package/lib/core/dataflow/DataflowProblem.d.ts +1 -0
- package/lib/core/dataflow/DataflowProblem.d.ts.map +1 -1
- package/lib/core/dataflow/DataflowProblem.js +4 -4
- package/lib/core/dataflow/DataflowSolver.d.ts +20 -16
- package/lib/core/dataflow/DataflowSolver.d.ts.map +1 -1
- package/lib/core/dataflow/DataflowSolver.js +67 -78
- package/lib/core/dataflow/TiantAnalysis.d.ts +1 -0
- package/lib/core/dataflow/TiantAnalysis.d.ts.map +1 -1
- package/lib/core/dataflow/TiantAnalysis.js +42 -28
- package/lib/core/dataflow/UndefinedVariable.d.ts +15 -1
- package/lib/core/dataflow/UndefinedVariable.d.ts.map +1 -1
- package/lib/core/dataflow/UndefinedVariable.js +122 -76
- package/lib/core/dataflow/Util.d.ts +5 -1
- package/lib/core/dataflow/Util.d.ts.map +1 -1
- package/lib/core/dataflow/Util.js +43 -22
- package/lib/core/graph/BasicBlock.d.ts +72 -0
- package/lib/core/graph/BasicBlock.d.ts.map +1 -1
- package/lib/core/graph/BasicBlock.js +165 -3
- package/lib/core/graph/Cfg.d.ts +30 -1
- package/lib/core/graph/Cfg.d.ts.map +1 -1
- package/lib/core/graph/Cfg.js +131 -11
- package/lib/core/graph/DominanceFinder.js +7 -7
- package/lib/core/graph/DominanceTree.js +4 -4
- package/lib/core/graph/builder/ViewTreeBuilder.d.ts.map +1 -1
- package/lib/core/graph/builder/ViewTreeBuilder.js +6 -5
- package/lib/core/model/ArkBaseModel.d.ts +59 -0
- package/lib/core/model/ArkBaseModel.d.ts.map +1 -0
- package/lib/core/model/ArkBaseModel.js +271 -0
- package/lib/core/model/ArkBody.d.ts +3 -9
- package/lib/core/model/ArkBody.d.ts.map +1 -1
- package/lib/core/model/ArkBody.js +3 -14
- package/lib/core/model/ArkClass.d.ts +107 -13
- package/lib/core/model/ArkClass.d.ts.map +1 -1
- package/lib/core/model/ArkClass.js +152 -54
- package/lib/core/model/ArkExport.d.ts +8 -7
- package/lib/core/model/ArkExport.d.ts.map +1 -1
- package/lib/core/model/ArkExport.js +16 -18
- package/lib/core/model/ArkField.d.ts +16 -13
- package/lib/core/model/ArkField.d.ts.map +1 -1
- package/lib/core/model/ArkField.js +18 -62
- package/lib/core/model/ArkFile.d.ts +42 -0
- package/lib/core/model/ArkFile.d.ts.map +1 -1
- package/lib/core/model/ArkFile.js +58 -0
- package/lib/core/model/ArkImport.d.ts +9 -7
- package/lib/core/model/ArkImport.d.ts.map +1 -1
- package/lib/core/model/ArkImport.js +11 -12
- package/lib/core/model/ArkMetadata.d.ts +20 -0
- package/lib/core/model/ArkMetadata.d.ts.map +1 -0
- package/lib/core/model/ArkMetadata.js +44 -0
- package/lib/core/model/ArkMethod.d.ts +195 -17
- package/lib/core/model/ArkMethod.d.ts.map +1 -1
- package/lib/core/model/ArkMethod.js +363 -46
- package/lib/core/model/ArkNamespace.d.ts +6 -8
- package/lib/core/model/ArkNamespace.d.ts.map +1 -1
- package/lib/core/model/ArkNamespace.js +16 -20
- package/lib/core/model/ArkSignature.d.ts +41 -0
- package/lib/core/model/ArkSignature.d.ts.map +1 -1
- package/lib/core/model/ArkSignature.js +76 -19
- package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkClassBuilder.js +60 -49
- package/lib/core/model/builder/ArkExportBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkExportBuilder.js +12 -6
- package/lib/core/model/builder/ArkFieldBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkFieldBuilder.js +13 -9
- package/lib/core/model/builder/ArkFileBuilder.js +1 -3
- package/lib/core/model/builder/ArkImportBuilder.d.ts +2 -1
- package/lib/core/model/builder/ArkImportBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkImportBuilder.js +16 -13
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +3 -1
- package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkMethodBuilder.js +105 -45
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkNamespaceBuilder.js +4 -5
- package/lib/core/model/builder/builderUtils.d.ts +2 -1
- package/lib/core/model/builder/builderUtils.d.ts.map +1 -1
- package/lib/core/model/builder/builderUtils.js +63 -43
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -3
- package/lib/save/ArkStream.js +1 -1
- package/lib/save/DotPrinter.d.ts.map +1 -1
- package/lib/save/DotPrinter.js +1 -15
- package/lib/save/GraphPrinter.d.ts.map +1 -1
- package/lib/save/GraphPrinter.js +4 -2
- package/lib/save/JsonPrinter.js +5 -5
- package/lib/save/ViewTreePrinter.d.ts +16 -0
- package/lib/save/ViewTreePrinter.d.ts.map +1 -0
- package/lib/save/ViewTreePrinter.js +130 -0
- package/lib/save/source/SourceBase.d.ts +2 -2
- package/lib/save/source/SourceBase.d.ts.map +1 -1
- package/lib/save/source/SourceBase.js +6 -13
- package/lib/save/source/SourceBody.d.ts.map +1 -1
- package/lib/save/source/SourceBody.js +27 -14
- package/lib/save/source/SourceClass.d.ts.map +1 -1
- package/lib/save/source/SourceClass.js +12 -8
- package/lib/save/source/SourceField.d.ts.map +1 -1
- package/lib/save/source/SourceField.js +6 -2
- package/lib/save/source/SourceMethod.d.ts.map +1 -1
- package/lib/save/source/SourceMethod.js +10 -3
- package/lib/save/source/SourceModule.d.ts.map +1 -1
- package/lib/save/source/SourceModule.js +16 -10
- package/lib/save/source/SourceNamespace.d.ts.map +1 -1
- package/lib/save/source/SourceNamespace.js +4 -0
- package/lib/save/source/SourceStmt.d.ts +1 -1
- package/lib/save/source/SourceStmt.d.ts.map +1 -1
- package/lib/save/source/SourceStmt.js +37 -25
- package/lib/save/source/SourceTransformer.d.ts +6 -0
- package/lib/save/source/SourceTransformer.d.ts.map +1 -1
- package/lib/save/source/SourceTransformer.js +82 -51
- package/lib/save/source/SourceUtils.d.ts.map +1 -1
- package/lib/save/source/SourceUtils.js +12 -11
- package/lib/transformer/StaticSingleAssignmentFormer.js +3 -3
- package/lib/utils/CfgStructualAnalysis.d.ts +1 -0
- package/lib/utils/CfgStructualAnalysis.d.ts.map +1 -1
- package/lib/utils/CfgStructualAnalysis.js +103 -72
- package/lib/utils/callGraphUtils.d.ts.map +1 -1
- package/lib/utils/callGraphUtils.js +7 -10
- package/lib/utils/crypto_utils.d.ts +6 -0
- package/lib/utils/crypto_utils.d.ts.map +1 -0
- package/lib/utils/crypto_utils.js +57 -0
- package/lib/utils/entryMethodUtils.d.ts.map +1 -1
- package/lib/utils/entryMethodUtils.js +27 -26
- package/lib/utils/getAllFiles.d.ts +1 -1
- package/lib/utils/getAllFiles.d.ts.map +1 -1
- package/lib/utils/getAllFiles.js +4 -5
- package/lib/utils/logger.js +2 -2
- package/package.json +3 -2
package/lib/core/base/Ref.js
CHANGED
|
@@ -48,12 +48,13 @@ const ValueUtil_1 = require("../common/ValueUtil");
|
|
|
48
48
|
const ArkField_1 = require("../model/ArkField");
|
|
49
49
|
const ArkMethod_1 = require("../model/ArkMethod");
|
|
50
50
|
const Const_1 = require("../common/Const");
|
|
51
|
+
const TSConst_1 = require("../common/TSConst");
|
|
51
52
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'Ref');
|
|
52
53
|
/**
|
|
53
54
|
* @category core/base/ref
|
|
54
55
|
*/
|
|
55
56
|
class AbstractRef {
|
|
56
|
-
inferType(
|
|
57
|
+
inferType(arkMethod) {
|
|
57
58
|
return this;
|
|
58
59
|
}
|
|
59
60
|
}
|
|
@@ -64,12 +65,43 @@ class ArkArrayRef extends AbstractRef {
|
|
|
64
65
|
this.base = base;
|
|
65
66
|
this.index = index;
|
|
66
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Returns the base of this array reference. Array reference refers to access to array elements.
|
|
70
|
+
* Array references usually consist of an local variable and an index.
|
|
71
|
+
* For example, `a[i]` is a typical array reference, where `a` is the base (i.e., local variable)
|
|
72
|
+
* pointing to the actual memory location where the array is stored
|
|
73
|
+
* and `i` is the index indicating access to the `i-th` element from array `a`.
|
|
74
|
+
* @returns the base of this array reference.
|
|
75
|
+
* @example
|
|
76
|
+
* 1. Get the base and the specific elements.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// Create an array
|
|
80
|
+
let myArray: number[] = [10, 20, 30, 40];
|
|
81
|
+
// Create an ArrayRef object representing a reference to myArray[2]
|
|
82
|
+
let arrayRef = new ArkArrayRef(myArray, 2);
|
|
83
|
+
// Use the getBase() method to get the base of the array
|
|
84
|
+
let baseArray = arrayRef.getBase();
|
|
85
|
+
|
|
86
|
+
console.log("Base array:", baseArray); // Output: Base array: [10, 20, 30, 40]
|
|
87
|
+
|
|
88
|
+
// Use baseArray and obeject index of ArrayRef to access to specific array elements
|
|
89
|
+
let element = baseArray[arrayRef.index];
|
|
90
|
+
console.log("Element at index", arrayRef.index, ":", element); // Output: Element at index 2 : 30
|
|
91
|
+
```
|
|
92
|
+
*/
|
|
67
93
|
getBase() {
|
|
68
94
|
return this.base;
|
|
69
95
|
}
|
|
70
96
|
setBase(newBase) {
|
|
71
97
|
this.base = newBase;
|
|
72
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Returns the index of this array reference.
|
|
101
|
+
* In TypeScript, an array reference means that the variable stores
|
|
102
|
+
* the memory address of the array rather than the actual data of the array.
|
|
103
|
+
* @returns The index of this array reference.
|
|
104
|
+
*/
|
|
73
105
|
getIndex() {
|
|
74
106
|
return this.index;
|
|
75
107
|
}
|
|
@@ -78,6 +110,9 @@ class ArkArrayRef extends AbstractRef {
|
|
|
78
110
|
}
|
|
79
111
|
getType() {
|
|
80
112
|
const baseType = this.base.getType();
|
|
113
|
+
if (baseType instanceof Type_1.AliasType) {
|
|
114
|
+
return baseType.getOriginalType();
|
|
115
|
+
}
|
|
81
116
|
if (baseType instanceof Type_1.ArrayType) {
|
|
82
117
|
return baseType.getBaseType();
|
|
83
118
|
}
|
|
@@ -104,9 +139,31 @@ class AbstractFieldRef extends AbstractRef {
|
|
|
104
139
|
super();
|
|
105
140
|
this.fieldSignature = fieldSignature;
|
|
106
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Returns the the field name as a **string**.
|
|
144
|
+
* @returns The the field name.
|
|
145
|
+
*/
|
|
107
146
|
getFieldName() {
|
|
108
147
|
return this.fieldSignature.getFieldName();
|
|
109
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Returns a field signature, which consists of a class signature,
|
|
151
|
+
* a **string** field name, and a **boolean** label indicating whether it is static or not.
|
|
152
|
+
* @returns The field signature.
|
|
153
|
+
* @example
|
|
154
|
+
* 1. Compare two Fields
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
const fieldSignature = new FieldSignature();
|
|
158
|
+
fieldSignature.setFieldName(...);
|
|
159
|
+
const fieldRef = new ArkInstanceFieldRef(baseValue as Local, fieldSignature);
|
|
160
|
+
...
|
|
161
|
+
if (fieldRef.getFieldSignature().getFieldName() ===
|
|
162
|
+
targetField.getFieldSignature().getFieldName()) {
|
|
163
|
+
...
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
*/
|
|
110
167
|
getFieldSignature() {
|
|
111
168
|
return this.fieldSignature;
|
|
112
169
|
}
|
|
@@ -123,6 +180,26 @@ class ArkInstanceFieldRef extends AbstractFieldRef {
|
|
|
123
180
|
super(fieldSignature);
|
|
124
181
|
this.base = base;
|
|
125
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Returns the local of field, showing which object this field belongs to.
|
|
185
|
+
* A {@link Local} consists of :
|
|
186
|
+
* - Name: the **string** name of local value, e.g., "$temp0".
|
|
187
|
+
* - Type: the type of value.
|
|
188
|
+
* @returns The object that the field belongs to.
|
|
189
|
+
* @example
|
|
190
|
+
* 1. Get a base.
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
if (expr instanceof ArkInstanceFieldRef) {
|
|
194
|
+
...
|
|
195
|
+
let base = expr.getBase();
|
|
196
|
+
if (base.getName() == 'this') {
|
|
197
|
+
...
|
|
198
|
+
}
|
|
199
|
+
...
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
*/
|
|
126
203
|
getBase() {
|
|
127
204
|
return this.base;
|
|
128
205
|
}
|
|
@@ -138,7 +215,7 @@ class ArkInstanceFieldRef extends AbstractFieldRef {
|
|
|
138
215
|
toString() {
|
|
139
216
|
return this.base.toString() + '.<' + this.getFieldSignature() + '>';
|
|
140
217
|
}
|
|
141
|
-
|
|
218
|
+
getBaseType(arkClass) {
|
|
142
219
|
let baseType = this.base.getType();
|
|
143
220
|
if (this.base instanceof Local_1.Local && baseType instanceof Type_1.UnknownType) {
|
|
144
221
|
baseType = TypeInference_1.TypeInference.inferBaseType(this.base.getName(), arkClass);
|
|
@@ -152,61 +229,80 @@ class ArkInstanceFieldRef extends AbstractFieldRef {
|
|
|
152
229
|
}
|
|
153
230
|
if (!baseType) {
|
|
154
231
|
logger.warn('infer field ref base type fail: ' + this.toString());
|
|
155
|
-
return
|
|
232
|
+
return null;
|
|
156
233
|
}
|
|
157
234
|
if (this.base instanceof Local_1.Local) {
|
|
235
|
+
if (this.base.getName() === TSConst_1.THIS_NAME && arkClass.isAnonymousClass()) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
158
238
|
this.base.setType(baseType);
|
|
159
239
|
}
|
|
240
|
+
if (baseType instanceof Type_1.AliasType) {
|
|
241
|
+
baseType = baseType.getOriginalType();
|
|
242
|
+
}
|
|
243
|
+
return baseType;
|
|
244
|
+
}
|
|
245
|
+
inferType(arkMethod) {
|
|
246
|
+
const arkClass = arkMethod.getDeclaringArkClass();
|
|
247
|
+
const baseType = this.getBaseType(arkClass);
|
|
248
|
+
if (!baseType) {
|
|
249
|
+
return this;
|
|
250
|
+
}
|
|
160
251
|
if (baseType instanceof Type_1.ArrayType && this.getFieldName() !== 'length') {
|
|
161
252
|
return new ArkArrayRef(this.base, ValueUtil_1.ValueUtil.createConst(this.getFieldName()));
|
|
162
253
|
}
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
|
|
254
|
+
let newFieldSignature = this.getNewFieldSignature(arkClass, baseType);
|
|
255
|
+
if (baseType instanceof Type_1.UnionType) {
|
|
256
|
+
for (const type of baseType.getTypes()) {
|
|
257
|
+
if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
newFieldSignature = this.getNewFieldSignature(arkClass, baseType);
|
|
261
|
+
if (!TypeInference_1.TypeInference.isUnclearType(newFieldSignature)) {
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
166
265
|
}
|
|
167
266
|
else {
|
|
267
|
+
newFieldSignature = this.getNewFieldSignature(arkClass, baseType);
|
|
268
|
+
}
|
|
269
|
+
if (newFieldSignature) {
|
|
270
|
+
if (newFieldSignature.isStatic()) {
|
|
271
|
+
return new ArkStaticFieldRef(newFieldSignature);
|
|
272
|
+
}
|
|
168
273
|
this.setFieldSignature(newFieldSignature);
|
|
169
274
|
}
|
|
170
275
|
return this;
|
|
171
276
|
}
|
|
172
277
|
getNewFieldSignature(arkClass, baseType) {
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
let
|
|
176
|
-
|
|
177
|
-
if (propertyAndproperty) {
|
|
178
|
-
property = propertyAndproperty[0];
|
|
179
|
-
propertyType = propertyAndproperty[1];
|
|
180
|
-
}
|
|
181
|
-
if (TypeInference_1.TypeInference.isUnclearType(propertyType)) {
|
|
278
|
+
const fieldName = this.getFieldName().replace(/[\"|\']/, '');
|
|
279
|
+
const propertyAndType = TypeInference_1.TypeInference.inferFieldType(baseType, fieldName, arkClass);
|
|
280
|
+
let propertyType = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[1];
|
|
281
|
+
if (propertyType && TypeInference_1.TypeInference.isUnclearType(propertyType)) {
|
|
182
282
|
const newType = TypeInference_1.TypeInference.inferUnclearedType(propertyType, arkClass);
|
|
183
283
|
if (newType) {
|
|
184
284
|
propertyType = newType;
|
|
185
285
|
}
|
|
186
286
|
}
|
|
187
|
-
let
|
|
188
|
-
|
|
189
|
-
|
|
287
|
+
let staticFlag;
|
|
288
|
+
let signature;
|
|
289
|
+
if (baseType instanceof Type_1.ClassType) {
|
|
290
|
+
const property = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[0];
|
|
291
|
+
if (property instanceof ArkField_1.ArkField) {
|
|
292
|
+
return property.getSignature();
|
|
293
|
+
}
|
|
294
|
+
staticFlag = baseType.getClassSignature().getClassName() === Const_1.DEFAULT_ARK_CLASS_NAME ||
|
|
295
|
+
(property instanceof ArkMethod_1.ArkMethod && property.isStatic());
|
|
296
|
+
signature = property instanceof ArkMethod_1.ArkMethod ? property.getSignature().getDeclaringClassSignature() : baseType.getClassSignature();
|
|
297
|
+
}
|
|
298
|
+
else if (baseType instanceof Type_1.AnnotationNamespaceType) {
|
|
299
|
+
staticFlag = true;
|
|
300
|
+
signature = baseType.getNamespaceSignature();
|
|
190
301
|
}
|
|
191
302
|
else {
|
|
192
|
-
|
|
193
|
-
let signature;
|
|
194
|
-
if (baseType instanceof Type_1.ClassType) {
|
|
195
|
-
staticFlag = baseType.getClassSignature().getClassName() === Const_1.DEFAULT_ARK_CLASS_NAME ||
|
|
196
|
-
(property instanceof ArkMethod_1.ArkMethod && property.isStatic());
|
|
197
|
-
signature = baseType.getClassSignature();
|
|
198
|
-
}
|
|
199
|
-
else if (baseType instanceof Type_1.AnnotationNamespaceType) {
|
|
200
|
-
staticFlag = true;
|
|
201
|
-
signature = baseType.getNamespaceSignature();
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
staticFlag = oldFieldSignature.isStatic();
|
|
205
|
-
signature = oldFieldSignature.getDeclaringSignature();
|
|
206
|
-
}
|
|
207
|
-
newFieldSignature = new ArkSignature_1.FieldSignature(this.getFieldName(), signature, propertyType, staticFlag);
|
|
303
|
+
return null;
|
|
208
304
|
}
|
|
209
|
-
return
|
|
305
|
+
return new ArkSignature_1.FieldSignature(fieldName, signature, propertyType !== null && propertyType !== void 0 ? propertyType : this.getType(), staticFlag);
|
|
210
306
|
}
|
|
211
307
|
}
|
|
212
308
|
exports.ArkInstanceFieldRef = ArkInstanceFieldRef;
|
|
@@ -237,8 +333,16 @@ class ArkParameterRef extends AbstractRef {
|
|
|
237
333
|
setType(newType) {
|
|
238
334
|
this.paramType = newType;
|
|
239
335
|
}
|
|
240
|
-
inferType(
|
|
241
|
-
|
|
336
|
+
inferType(arkMethod) {
|
|
337
|
+
var _a;
|
|
338
|
+
if (arkMethod.isAnonymousMethod() && this.paramType instanceof Type_1.UnknownType) {
|
|
339
|
+
const type1 = (_a = arkMethod.getSignature().getMethodSubSignature().getParameters()[this.index]) === null || _a === void 0 ? void 0 : _a.getType();
|
|
340
|
+
if (!TypeInference_1.TypeInference.isUnclearType(type1)) {
|
|
341
|
+
this.paramType = type1;
|
|
342
|
+
return this;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
let type = TypeInference_1.TypeInference.inferUnclearedType(this.paramType, arkMethod.getDeclaringArkClass());
|
|
242
346
|
if (type) {
|
|
243
347
|
this.paramType = type;
|
|
244
348
|
}
|
|
@@ -257,7 +361,8 @@ class ArkThisRef extends AbstractRef {
|
|
|
257
361
|
super();
|
|
258
362
|
this.type = type;
|
|
259
363
|
}
|
|
260
|
-
inferType(
|
|
364
|
+
inferType(arkMethod) {
|
|
365
|
+
const arkClass = arkMethod.getDeclaringArkClass();
|
|
261
366
|
const className = this.type.getClassSignature().getClassName();
|
|
262
367
|
if (className.startsWith(Const_1.ANONYMOUS_CLASS_PREFIX)) {
|
|
263
368
|
let type = TypeInference_1.TypeInference.inferBaseType(className.split(Const_1.ANONYMOUS_CLASS_DELIMITER)[1], arkClass);
|
package/lib/core/base/Stmt.d.ts
CHANGED
|
@@ -3,21 +3,63 @@ import { AbstractExpr, AbstractInvokeExpr, ArkConditionExpr } from './Expr';
|
|
|
3
3
|
import { AbstractFieldRef, ArkArrayRef } from './Ref';
|
|
4
4
|
import { Value } from './Value';
|
|
5
5
|
import { FullPosition, LineColPosition } from './Position';
|
|
6
|
+
import { ArkMetadata, ArkMetadataKind, ArkMetadataType } from '../model/ArkMetadata';
|
|
6
7
|
/**
|
|
7
8
|
* @category core/base/stmt
|
|
8
9
|
*/
|
|
9
10
|
export declare abstract class Stmt {
|
|
10
|
-
protected text
|
|
11
|
-
protected
|
|
12
|
-
protected
|
|
13
|
-
protected
|
|
11
|
+
protected text?: string;
|
|
12
|
+
protected originalText?: string;
|
|
13
|
+
protected originalPosition: LineColPosition;
|
|
14
|
+
protected cfg: Cfg;
|
|
15
|
+
protected operandOriginalPositions?: FullPosition[];
|
|
16
|
+
metadata?: ArkMetadata;
|
|
17
|
+
getMetadata(kind: ArkMetadataKind): ArkMetadataType | undefined;
|
|
18
|
+
setMetadata(kind: ArkMetadataKind, value: ArkMetadataType): void;
|
|
14
19
|
/** Return a list of values which are uesd in this statement */
|
|
15
20
|
getUses(): Value[];
|
|
16
21
|
replaceUse(oldUse: Value, newUse: Value): void;
|
|
17
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Return the definition which is uesd in this statement. Generally, the definition is the left value of `=` in 3AC.
|
|
24
|
+
* For example, the definition in 3AC of `value = parameter0: @project-1/sample-1.ets: AnonymousClass-0` is `value`,
|
|
25
|
+
* and the definition in `$temp0 = staticinvoke <@_ProjectName/_FileName: xxx.create()>()` is `\$temp0`.
|
|
26
|
+
* @returns The definition in 3AC (may be a **null**).
|
|
27
|
+
* @example
|
|
28
|
+
* 1. get the def in stmt.
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
for (const block of this.blocks) {
|
|
32
|
+
for (const stmt of block.getStmts()) {
|
|
33
|
+
const defValue = stmt.getDef();
|
|
34
|
+
...
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
*/
|
|
18
39
|
getDef(): Value | null;
|
|
19
40
|
getDefAndUses(): Value[];
|
|
20
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Get the CFG (i.e., control flow graph) of an {@link ArkBody} in which the statement is.
|
|
43
|
+
* A CFG contains a set of basic blocks and statements corresponding to each basic block.
|
|
44
|
+
* Note that, "source code" and "three-address" are two types of {@link Stmt} in ArkAnalyzer.
|
|
45
|
+
* Source code {@link Stmt} represents the statement of ets/ts source code, while three-address code {@link Stmt} represents the statement after it has been converted into three-address code.
|
|
46
|
+
* Since the source code {@link Stmt} does not save its CFG reference, it returns **null**,
|
|
47
|
+
* while the `getCfg()` of the third address code {@link Stmt} will return its CFG reference.
|
|
48
|
+
* @returns The CFG (i.e., control flow graph) of an {@link ArkBody} in which the statement is.
|
|
49
|
+
* @example
|
|
50
|
+
* 1. get the ArkFile based on stmt.
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
const arkFile = stmt.getCfg()?.getDeclaringMethod().getDeclaringArkFile();
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
2. get the ArkMethod based on stmt.
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
let sourceMethod: ArkMethod = stmt.getCfg()?.getDeclaringMethod();
|
|
60
|
+
```
|
|
61
|
+
*/
|
|
62
|
+
getCfg(): Cfg;
|
|
21
63
|
setCfg(cfg: Cfg): void;
|
|
22
64
|
/**
|
|
23
65
|
* Return true if the following statement may not execute after this statement.
|
|
@@ -27,30 +69,86 @@ export declare abstract class Stmt {
|
|
|
27
69
|
/** Return the number of statements which this statement may go to */
|
|
28
70
|
getExpectedSuccessorCount(): number;
|
|
29
71
|
containsInvokeExpr(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Returns the method's invocation expression (including method signature and its arguments)
|
|
74
|
+
* in the current statement. An **undefined** will be returned if there is no method used in this statement.
|
|
75
|
+
* @returns the method's invocation expression from the statement. An **undefined** will be returned if there is no method can be found in this statement.
|
|
76
|
+
* @example
|
|
77
|
+
* 1. get invoke expr based on stmt.
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
let invoke = stmt.getInvokeExpr();
|
|
81
|
+
```
|
|
82
|
+
*/
|
|
30
83
|
getInvokeExpr(): AbstractInvokeExpr | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Returns an array of expressions in the statement.
|
|
86
|
+
* @returns An array of expressions in the statement.
|
|
87
|
+
* @example
|
|
88
|
+
* 1. Traverse expression of statement.
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
for (const expr of stmt.getExprs()) {
|
|
92
|
+
...
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
*/
|
|
31
96
|
getExprs(): AbstractExpr[];
|
|
32
97
|
containsArrayRef(): boolean;
|
|
33
98
|
getArrayRef(): ArkArrayRef | undefined;
|
|
34
99
|
containsFieldRef(): boolean;
|
|
35
100
|
getFieldRef(): AbstractFieldRef | undefined;
|
|
36
|
-
|
|
37
|
-
|
|
101
|
+
setOriginPositionInfo(originPositionInfo: LineColPosition): void;
|
|
102
|
+
/**
|
|
103
|
+
* Returns the original position of the statement.
|
|
104
|
+
* The position consists of two parts: line number and column number.
|
|
105
|
+
* In the source file, the former (i.e., line number) indicates which line the statement is in,
|
|
106
|
+
* and the latter (i.e., column number) indicates the position of the statement in the line.
|
|
107
|
+
* The position is described as `LineColPosition(lineNo,colNum)` in ArkAnalyzer,
|
|
108
|
+
* and its default value is LineColPosition(-1,-1).
|
|
109
|
+
* @returns The original location of the statement.
|
|
110
|
+
* @example
|
|
111
|
+
* 1. Get the stmt position info to make some condition judgements.
|
|
112
|
+
```typescript
|
|
113
|
+
for (const stmt of stmts) {
|
|
114
|
+
if (stmt.getOriginPositionInfo().getLineNo() === -1) {
|
|
115
|
+
stmt.setOriginPositionInfo(originalStmt.getOriginPositionInfo());
|
|
116
|
+
this.stmtToOriginalStmt.set(stmt, originalStmt);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
*/
|
|
38
121
|
getOriginPositionInfo(): LineColPosition;
|
|
39
122
|
abstract toString(): string;
|
|
40
123
|
setText(text: string): void;
|
|
124
|
+
setOriginalText(originalText: string): void;
|
|
125
|
+
getOriginalText(): string | undefined;
|
|
41
126
|
setOperandOriginalPositions(operandOriginalPositions: FullPosition[]): void;
|
|
42
127
|
getOperandOriginalPosition(indexOrOperand: number | Value): FullPosition | null;
|
|
43
128
|
}
|
|
44
|
-
export declare class OriginalStmt extends Stmt {
|
|
45
|
-
constructor(text: string, position: LineColPosition);
|
|
46
|
-
toString(): string;
|
|
47
|
-
}
|
|
48
129
|
export declare class ArkAssignStmt extends Stmt {
|
|
49
130
|
private leftOp;
|
|
50
131
|
private rightOp;
|
|
51
132
|
constructor(leftOp: Value, rightOp: Value);
|
|
133
|
+
/**
|
|
134
|
+
* Returns the left operand of the assigning statement.
|
|
135
|
+
* @returns The left operand of the assigning statement.
|
|
136
|
+
* @example
|
|
137
|
+
* 1. If the statement is `a=b;`, the right operand is `a`; if the statement is `dd = cc + 5;`, the right operand is `cc`.
|
|
138
|
+
*/
|
|
52
139
|
getLeftOp(): Value;
|
|
53
140
|
setLeftOp(newLeftOp: Value): void;
|
|
141
|
+
/**
|
|
142
|
+
* Returns the right operand of the assigning statement.
|
|
143
|
+
* @returns The right operand of the assigning statement.
|
|
144
|
+
* @example
|
|
145
|
+
* 1. If the statement is `a=b;`, the right operand is `b`; if the statement is `dd = cc + 5;`, the right operand is `cc + 5`.
|
|
146
|
+
* 2. Get the rightOp from stmt.
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
const rightOp = stmt.getRightOp();
|
|
150
|
+
```
|
|
151
|
+
*/
|
|
54
152
|
getRightOp(): Value;
|
|
55
153
|
setRightOp(rightOp: Value): void;
|
|
56
154
|
toString(): string;
|
|
@@ -68,6 +166,18 @@ export declare class ArkInvokeStmt extends Stmt {
|
|
|
68
166
|
export declare class ArkIfStmt extends Stmt {
|
|
69
167
|
private conditionExpr;
|
|
70
168
|
constructor(conditionExpr: ArkConditionExpr);
|
|
169
|
+
/**
|
|
170
|
+
* The condition expression consisit of two values as operands and one binary operator as operator.
|
|
171
|
+
* The operator can indicate the relation between the two values, e.g., `<`, `<=`,`>`, `>=`, `==`, `!=`, `===`, `!==`.
|
|
172
|
+
* @returns a condition expression.
|
|
173
|
+
* @example
|
|
174
|
+
* 1. When a statement is `if (a > b)`, the operands are `a` and `b`, the operator is `<`. Therefore, the condition expression is `a > b`.
|
|
175
|
+
* 2. get a conditon expr from a condition statement.
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
let expr = (this.original as ArkIfStmt).getConditionExprExpr();
|
|
179
|
+
```
|
|
180
|
+
*/
|
|
71
181
|
getConditionExprExpr(): ArkConditionExpr;
|
|
72
182
|
isBranch(): boolean;
|
|
73
183
|
getExpectedSuccessorCount(): number;
|
|
@@ -92,6 +202,10 @@ export declare class ArkSwitchStmt extends Stmt {
|
|
|
92
202
|
private key;
|
|
93
203
|
private cases;
|
|
94
204
|
constructor(key: Value, cases: Value[]);
|
|
205
|
+
/**
|
|
206
|
+
* Returns the key in a switch statement.
|
|
207
|
+
* @returns The key in a switch statement.
|
|
208
|
+
*/
|
|
95
209
|
getKey(): Value;
|
|
96
210
|
getCases(): Value[];
|
|
97
211
|
isBranch(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stmt.d.ts","sourceRoot":"","sources":["../../../src/core/base/Stmt.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"Stmt.d.ts","sourceRoot":"","sources":["../../../src/core/base/Stmt.ts"],"names":[],"mappings":"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"}
|