arkanalyzer 1.0.7 → 1.0.9
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/lib/Config.d.ts +9 -1
- package/lib/Config.d.ts.map +1 -1
- package/lib/Config.js +24 -11
- package/lib/Scene.d.ts +49 -42
- package/lib/Scene.d.ts.map +1 -1
- package/lib/Scene.js +124 -93
- package/lib/callgraph/algorithm/AbstractAnalysis.js +1 -1
- package/lib/callgraph/common/Statistics.js +1 -1
- 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 +15 -5
- package/lib/callgraph/model/builder/CallGraphBuilder.js +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +35 -8
- package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.js +89 -8
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +32 -5
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +378 -83
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +3 -0
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +71 -18
- package/lib/core/base/Constant.d.ts +25 -5
- package/lib/core/base/Constant.d.ts.map +1 -1
- package/lib/core/base/Constant.js +46 -8
- package/lib/core/base/Expr.d.ts +45 -40
- package/lib/core/base/Expr.d.ts.map +1 -1
- package/lib/core/base/Expr.js +236 -150
- package/lib/core/base/Local.d.ts +2 -2
- package/lib/core/base/Local.d.ts.map +1 -1
- package/lib/core/base/Local.js +2 -2
- package/lib/core/base/Ref.d.ts +38 -37
- package/lib/core/base/Ref.d.ts.map +1 -1
- package/lib/core/base/Ref.js +102 -70
- package/lib/core/base/Stmt.d.ts +4 -0
- package/lib/core/base/Stmt.d.ts.map +1 -1
- package/lib/core/base/Stmt.js +12 -1
- package/lib/core/base/Type.d.ts +4 -0
- package/lib/core/base/Type.d.ts.map +1 -1
- package/lib/core/base/Type.js +41 -17
- 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 +1 -1
- package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
- package/lib/core/common/ArkIRTransformer.js +24 -8
- package/lib/core/common/CfgBuilder.d.ts.map +1 -1
- package/lib/core/common/CfgBuilder.js +5 -0
- 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 +2 -1
- package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
- package/lib/core/common/DummyMainCreater.js +28 -15
- 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/IRUtils.d.ts +6 -0
- package/lib/core/common/IRUtils.d.ts.map +1 -1
- package/lib/core/common/IRUtils.js +29 -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 +32 -32
- 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 +218 -87
- 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 +8 -25
- package/lib/core/dataflow/DataflowSolver.d.ts.map +1 -1
- package/lib/core/dataflow/DataflowSolver.js +2 -4
- package/lib/core/dataflow/TiantAnalysis.js +2 -1
- package/lib/core/dataflow/Util.d.ts +1 -1
- package/lib/core/dataflow/Util.d.ts.map +1 -1
- package/lib/core/dataflow/Util.js +8 -7
- package/lib/core/graph/BasicBlock.d.ts +41 -0
- package/lib/core/graph/BasicBlock.d.ts.map +1 -1
- package/lib/core/graph/BasicBlock.js +132 -1
- 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 +129 -6
- package/lib/core/graph/builder/ViewTreeBuilder.d.ts.map +1 -1
- package/lib/core/graph/builder/ViewTreeBuilder.js +3 -2
- package/lib/core/model/ArkBaseModel.d.ts +8 -0
- package/lib/core/model/ArkBaseModel.d.ts.map +1 -1
- package/lib/core/model/ArkBaseModel.js +55 -3
- package/lib/core/model/ArkClass.d.ts +36 -30
- package/lib/core/model/ArkClass.d.ts.map +1 -1
- package/lib/core/model/ArkClass.js +78 -39
- package/lib/core/model/ArkExport.d.ts +3 -0
- package/lib/core/model/ArkExport.d.ts.map +1 -1
- package/lib/core/model/ArkExport.js +10 -0
- package/lib/core/model/ArkField.d.ts +2 -0
- package/lib/core/model/ArkField.d.ts.map +1 -1
- package/lib/core/model/ArkField.js +3 -0
- package/lib/core/model/ArkFile.d.ts +4 -0
- package/lib/core/model/ArkFile.d.ts.map +1 -1
- package/lib/core/model/ArkFile.js +20 -0
- package/lib/core/model/ArkImport.d.ts +2 -0
- package/lib/core/model/ArkImport.d.ts.map +1 -1
- package/lib/core/model/ArkImport.js +3 -0
- 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 +156 -53
- package/lib/core/model/ArkMethod.d.ts.map +1 -1
- package/lib/core/model/ArkMethod.js +309 -54
- package/lib/core/model/ArkNamespace.d.ts +4 -0
- package/lib/core/model/ArkNamespace.d.ts.map +1 -1
- package/lib/core/model/ArkNamespace.js +13 -0
- package/lib/core/model/ArkSignature.d.ts +11 -5
- package/lib/core/model/ArkSignature.d.ts.map +1 -1
- package/lib/core/model/ArkSignature.js +38 -18
- package/lib/core/model/builder/ArkClassBuilder.d.ts +0 -1
- package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkClassBuilder.js +9 -34
- package/lib/core/model/builder/ArkExportBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkExportBuilder.js +6 -1
- package/lib/core/model/builder/ArkFieldBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkFieldBuilder.js +3 -0
- package/lib/core/model/builder/ArkFileBuilder.js +1 -1
- 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 +12 -5
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +2 -1
- package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkMethodBuilder.js +87 -47
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkNamespaceBuilder.js +2 -0
- package/lib/core/model/builder/builderUtils.d.ts.map +1 -1
- package/lib/core/model/builder/builderUtils.js +25 -2
- package/lib/save/source/SourceClass.d.ts.map +1 -1
- package/lib/save/source/SourceClass.js +4 -0
- package/lib/save/source/SourceField.d.ts.map +1 -1
- package/lib/save/source/SourceField.js +4 -0
- package/lib/save/source/SourceMethod.d.ts.map +1 -1
- package/lib/save/source/SourceMethod.js +7 -0
- package/lib/save/source/SourceModule.d.ts.map +1 -1
- package/lib/save/source/SourceModule.js +14 -9
- 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.map +1 -1
- package/lib/save/source/SourceStmt.js +15 -3
- 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 +72 -41
- package/lib/save/source/SourceUtils.d.ts.map +1 -1
- package/lib/save/source/SourceUtils.js +3 -2
- package/lib/transformer/StaticSingleAssignmentFormer.js +1 -1
- package/lib/utils/CfgStructualAnalysis.d.ts +1 -0
- package/lib/utils/CfgStructualAnalysis.d.ts.map +1 -1
- package/lib/utils/CfgStructualAnalysis.js +41 -7
- 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/getAllFiles.d.ts +1 -1
- package/lib/utils/getAllFiles.d.ts.map +1 -1
- package/lib/utils/getAllFiles.js +4 -5
- package/package.json +3 -2
package/lib/Scene.js
CHANGED
|
@@ -77,7 +77,6 @@ class Scene {
|
|
|
77
77
|
this.realProjectDir = '';
|
|
78
78
|
this.moduleScenesMap = new Map();
|
|
79
79
|
this.modulePath2NameMap = new Map();
|
|
80
|
-
this.globalImportInfos = [];
|
|
81
80
|
this.moduleSdkMap = new Map();
|
|
82
81
|
this.projectSdkMap = new Map();
|
|
83
82
|
// values that are visible in curr scope
|
|
@@ -95,6 +94,24 @@ class Scene {
|
|
|
95
94
|
this.ohPkgContent = {};
|
|
96
95
|
this.buildStage = SceneBuildStage.BUILD_INIT;
|
|
97
96
|
}
|
|
97
|
+
getOptions() {
|
|
98
|
+
return this.options;
|
|
99
|
+
}
|
|
100
|
+
clear() {
|
|
101
|
+
this.projectFiles = [];
|
|
102
|
+
this.moduleScenesMap.clear();
|
|
103
|
+
this.modulePath2NameMap.clear();
|
|
104
|
+
this.moduleSdkMap.clear();
|
|
105
|
+
this.projectSdkMap.clear();
|
|
106
|
+
this.filesMap.clear();
|
|
107
|
+
this.namespacesMap.clear();
|
|
108
|
+
this.classesMap.clear();
|
|
109
|
+
this.methodsMap.clear();
|
|
110
|
+
this.sdkArkFilesMap.clear();
|
|
111
|
+
this.sdkGlobalMap.clear();
|
|
112
|
+
this.ohPkgContentMap.clear();
|
|
113
|
+
this.ohPkgContent = {};
|
|
114
|
+
}
|
|
98
115
|
getStage() {
|
|
99
116
|
return this.buildStage;
|
|
100
117
|
}
|
|
@@ -106,21 +123,20 @@ class Scene {
|
|
|
106
123
|
* @example
|
|
107
124
|
* 1. Build Scene object from scene config
|
|
108
125
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
```typescript
|
|
127
|
+
// build config
|
|
128
|
+
const projectDir = ... ...;
|
|
129
|
+
const sceneConfig = new SceneConfig();
|
|
130
|
+
sceneConfig.buildFromProjectDir(projectDir);
|
|
114
131
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
132
|
+
// build scene
|
|
133
|
+
const scene = new Scene();
|
|
134
|
+
scene.buildSceneFromProjectDir(sceneConfig);
|
|
135
|
+
```
|
|
136
|
+
*/
|
|
120
137
|
buildSceneFromProjectDir(sceneConfig) {
|
|
121
138
|
this.buildBasicInfo(sceneConfig);
|
|
122
139
|
this.genArkFiles();
|
|
123
|
-
this.collectProjectImportInfos();
|
|
124
140
|
}
|
|
125
141
|
/**
|
|
126
142
|
* Set the basic information of the scene using a config,
|
|
@@ -129,6 +145,7 @@ class Scene {
|
|
|
129
145
|
*/
|
|
130
146
|
buildBasicInfo(sceneConfig) {
|
|
131
147
|
var _a;
|
|
148
|
+
this.options = sceneConfig.getOptions();
|
|
132
149
|
this.projectName = sceneConfig.getTargetProjectName();
|
|
133
150
|
this.realProjectDir = fs_1.default.realpathSync(sceneConfig.getTargetProjectDirectory());
|
|
134
151
|
this.projectFiles = sceneConfig.getProjectFiles();
|
|
@@ -178,6 +195,9 @@ class Scene {
|
|
|
178
195
|
}
|
|
179
196
|
}
|
|
180
197
|
});
|
|
198
|
+
this.sdkArkFilesMap.forEach(file => {
|
|
199
|
+
this.inferFile(file);
|
|
200
|
+
});
|
|
181
201
|
}
|
|
182
202
|
addDefaultConstructors() {
|
|
183
203
|
for (const file of this.getFiles()) {
|
|
@@ -211,21 +231,22 @@ class Scene {
|
|
|
211
231
|
let arkFile = new ArkFile_1.ArkFile();
|
|
212
232
|
arkFile.setScene(this);
|
|
213
233
|
(0, ArkFileBuilder_1.buildArkFileFromFile)(file, this.realProjectDir, arkFile, this.projectName);
|
|
214
|
-
this.filesMap.set(arkFile.getFileSignature().
|
|
234
|
+
this.filesMap.set(arkFile.getFileSignature().toMapKey(), arkFile);
|
|
215
235
|
});
|
|
216
236
|
this.buildAllMethodBody();
|
|
217
237
|
this.addDefaultConstructors();
|
|
218
238
|
}
|
|
219
239
|
buildSdk(sdkName, sdkPath) {
|
|
220
|
-
const allFiles = (0, getAllFiles_1.getAllFiles)(sdkPath, ['.ets', '.ts']);
|
|
240
|
+
const allFiles = (0, getAllFiles_1.getAllFiles)(sdkPath, ['.ets', '.ts'], this.options.ignoreFileNames);
|
|
221
241
|
allFiles.forEach((file) => {
|
|
222
242
|
logger.info('=== parse sdk file:', file);
|
|
223
243
|
let arkFile = new ArkFile_1.ArkFile();
|
|
224
244
|
arkFile.setScene(this);
|
|
225
245
|
(0, ArkFileBuilder_1.buildArkFileFromFile)(file, path_1.default.normalize(sdkPath), arkFile, sdkName);
|
|
226
246
|
ModelUtils_1.ModelUtils.getAllClassesInFile(arkFile).forEach(cls => { var _a; return (_a = cls.getDefaultArkMethod()) === null || _a === void 0 ? void 0 : _a.buildBody(); });
|
|
227
|
-
const fileSig = arkFile.getFileSignature().
|
|
247
|
+
const fileSig = arkFile.getFileSignature().toMapKey();
|
|
228
248
|
this.sdkArkFilesMap.set(fileSig, arkFile);
|
|
249
|
+
ModelUtils_1.ModelUtils.buildGlobalMap(arkFile, this.sdkGlobalMap);
|
|
229
250
|
});
|
|
230
251
|
}
|
|
231
252
|
/**
|
|
@@ -241,8 +262,8 @@ class Scene {
|
|
|
241
262
|
}
|
|
242
263
|
});
|
|
243
264
|
this.modulePath2NameMap.forEach((value, key) => {
|
|
244
|
-
let moduleScene = new ModuleScene();
|
|
245
|
-
moduleScene.
|
|
265
|
+
let moduleScene = new ModuleScene(this);
|
|
266
|
+
moduleScene.ModuleSceneBuilder(value, key);
|
|
246
267
|
this.moduleScenesMap.set(value, moduleScene);
|
|
247
268
|
});
|
|
248
269
|
this.buildAllMethodBody();
|
|
@@ -286,8 +307,8 @@ class Scene {
|
|
|
286
307
|
});
|
|
287
308
|
}
|
|
288
309
|
}
|
|
289
|
-
let moduleScene = new ModuleScene();
|
|
290
|
-
moduleScene.
|
|
310
|
+
let moduleScene = new ModuleScene(this);
|
|
311
|
+
moduleScene.ModuleSceneBuilder(moduleName, modulePath);
|
|
291
312
|
this.moduleScenesMap.set(moduleName, moduleScene);
|
|
292
313
|
this.buildAllMethodBody();
|
|
293
314
|
}
|
|
@@ -326,23 +347,29 @@ class Scene {
|
|
|
326
347
|
* @example
|
|
327
348
|
* 1. get ArkFile based on file signature.
|
|
328
349
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
350
|
+
```typescript
|
|
351
|
+
if (...) {
|
|
352
|
+
const fromSignature = new FileSignature();
|
|
353
|
+
fromSignature.setProjectName(im.getDeclaringArkFile().getProjectName());
|
|
354
|
+
fromSignature.setFileName(fileName);
|
|
355
|
+
return scene.getFile(fromSignature);
|
|
356
|
+
}
|
|
357
|
+
```
|
|
337
358
|
*/
|
|
338
359
|
getFile(fileSignature) {
|
|
339
360
|
if (this.projectName === fileSignature.getProjectName()) {
|
|
340
|
-
return this.filesMap.get(fileSignature.
|
|
361
|
+
return this.filesMap.get(fileSignature.toMapKey()) || null;
|
|
341
362
|
}
|
|
342
363
|
else {
|
|
343
|
-
return this.sdkArkFilesMap.get(fileSignature.
|
|
364
|
+
return this.sdkArkFilesMap.get(fileSignature.toMapKey()) || null;
|
|
344
365
|
}
|
|
345
366
|
}
|
|
367
|
+
setFile(file) {
|
|
368
|
+
this.filesMap.set(file.getFileSignature().toMapKey(), file);
|
|
369
|
+
}
|
|
370
|
+
hasSdkFile(fileSignature) {
|
|
371
|
+
return this.sdkArkFilesMap.has(fileSignature.toMapKey());
|
|
372
|
+
}
|
|
346
373
|
/**
|
|
347
374
|
* Get files of a {@link Scene}. Generally, a project includes several ets/ts files that define the different class. We need to generate {@link ArkFile} objects from these ets/ts files.
|
|
348
375
|
* @returns The array of {@link ArkFile} from `scene.filesMap.values()`.
|
|
@@ -373,8 +400,8 @@ class Scene {
|
|
|
373
400
|
getFiles() {
|
|
374
401
|
return Array.from(this.filesMap.values());
|
|
375
402
|
}
|
|
376
|
-
|
|
377
|
-
return this.sdkArkFilesMap;
|
|
403
|
+
getSdkArkFiles() {
|
|
404
|
+
return Array.from(this.sdkArkFilesMap.values());
|
|
378
405
|
}
|
|
379
406
|
getModuleSdkMap() {
|
|
380
407
|
return this.moduleSdkMap;
|
|
@@ -382,15 +409,17 @@ class Scene {
|
|
|
382
409
|
getProjectSdkMap() {
|
|
383
410
|
return this.projectSdkMap;
|
|
384
411
|
}
|
|
385
|
-
getFilesMap() {
|
|
386
|
-
return this.filesMap;
|
|
387
|
-
}
|
|
388
412
|
getNamespace(namespaceSignature) {
|
|
413
|
+
var _a;
|
|
389
414
|
if (this.projectName === namespaceSignature.getDeclaringFileSignature().getProjectName()) {
|
|
390
|
-
return this.getNamespacesMap().get(namespaceSignature.
|
|
415
|
+
return this.getNamespacesMap().get(namespaceSignature.toMapKey()) || null;
|
|
391
416
|
}
|
|
392
417
|
else {
|
|
393
|
-
const arkFile = this.
|
|
418
|
+
const arkFile = this.getFile(namespaceSignature.getDeclaringFileSignature());
|
|
419
|
+
const parentNs = namespaceSignature.getDeclaringNamespaceSignature();
|
|
420
|
+
if (parentNs) {
|
|
421
|
+
return ((_a = arkFile === null || arkFile === void 0 ? void 0 : arkFile.getNamespace(parentNs)) === null || _a === void 0 ? void 0 : _a.getNamespace(namespaceSignature)) || null;
|
|
422
|
+
}
|
|
394
423
|
return (arkFile === null || arkFile === void 0 ? void 0 : arkFile.getNamespace(namespaceSignature)) || null;
|
|
395
424
|
}
|
|
396
425
|
}
|
|
@@ -398,7 +427,7 @@ class Scene {
|
|
|
398
427
|
if (this.namespacesMap.size === 0) {
|
|
399
428
|
for (const file of this.getFiles()) {
|
|
400
429
|
ModelUtils_1.ModelUtils.getAllNamespacesInFile(file).forEach((namespace) => {
|
|
401
|
-
this.namespacesMap.set(namespace.getNamespaceSignature().
|
|
430
|
+
this.namespacesMap.set(namespace.getNamespaceSignature().toMapKey(), namespace);
|
|
402
431
|
});
|
|
403
432
|
}
|
|
404
433
|
}
|
|
@@ -415,10 +444,10 @@ class Scene {
|
|
|
415
444
|
getClass(classSignature, refresh) {
|
|
416
445
|
var _a;
|
|
417
446
|
if (this.projectName === classSignature.getDeclaringFileSignature().getProjectName()) {
|
|
418
|
-
return this.getClassesMap(refresh).get(classSignature.
|
|
447
|
+
return this.getClassesMap(refresh).get(classSignature.toMapKey()) || null;
|
|
419
448
|
}
|
|
420
449
|
else {
|
|
421
|
-
const arkFile = this.
|
|
450
|
+
const arkFile = this.getFile(classSignature.getDeclaringFileSignature());
|
|
422
451
|
const namespaceSignature = classSignature.getDeclaringNamespaceSignature();
|
|
423
452
|
if (namespaceSignature) {
|
|
424
453
|
return ((_a = arkFile === null || arkFile === void 0 ? void 0 : arkFile.getNamespace(namespaceSignature)) === null || _a === void 0 ? void 0 : _a.getClass(classSignature)) || null;
|
|
@@ -431,12 +460,12 @@ class Scene {
|
|
|
431
460
|
this.classesMap.clear();
|
|
432
461
|
for (const file of this.getFiles()) {
|
|
433
462
|
for (const cls of file.getClasses()) {
|
|
434
|
-
this.classesMap.set(cls.getSignature().
|
|
463
|
+
this.classesMap.set(cls.getSignature().toMapKey(), cls);
|
|
435
464
|
}
|
|
436
465
|
}
|
|
437
466
|
for (const namespace of this.getNamespacesMap().values()) {
|
|
438
467
|
for (const cls of namespace.getClasses()) {
|
|
439
|
-
this.classesMap.set(cls.getSignature().
|
|
468
|
+
this.classesMap.set(cls.getSignature().toMapKey(), cls);
|
|
440
469
|
}
|
|
441
470
|
}
|
|
442
471
|
}
|
|
@@ -448,7 +477,7 @@ class Scene {
|
|
|
448
477
|
getMethod(methodSignature, refresh) {
|
|
449
478
|
var _a;
|
|
450
479
|
if (this.projectName === methodSignature.getDeclaringClassSignature().getDeclaringFileSignature().getProjectName()) {
|
|
451
|
-
return this.getMethodsMap(refresh).get(methodSignature.
|
|
480
|
+
return this.getMethodsMap(refresh).get(methodSignature.toMapKey()) || null;
|
|
452
481
|
}
|
|
453
482
|
else {
|
|
454
483
|
return ((_a = this.getClass(methodSignature.getDeclaringClassSignature())) === null || _a === void 0 ? void 0 : _a.getMethod(methodSignature)) || null;
|
|
@@ -459,7 +488,7 @@ class Scene {
|
|
|
459
488
|
this.methodsMap.clear();
|
|
460
489
|
for (const cls of this.getClassesMap().values()) {
|
|
461
490
|
for (const method of cls.getMethods(true)) {
|
|
462
|
-
this.methodsMap.set(method.getSignature().
|
|
491
|
+
this.methodsMap.set(method.getSignature().toMapKey(), method);
|
|
463
492
|
}
|
|
464
493
|
}
|
|
465
494
|
}
|
|
@@ -482,19 +511,31 @@ class Scene {
|
|
|
482
511
|
* @example
|
|
483
512
|
* 1. get method from getMethod.
|
|
484
513
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
514
|
+
```typescript
|
|
515
|
+
const methodSignatures = this.CHA.resolveCall(xxx, yyy);
|
|
516
|
+
for (const methodSignature of methodSignatures) {
|
|
517
|
+
const method = this.scene.getMethod(methodSignature);
|
|
518
|
+
... ...
|
|
519
|
+
}
|
|
520
|
+
```
|
|
492
521
|
*/
|
|
493
522
|
getMethods(refresh) {
|
|
494
523
|
return Array.from(this.getMethodsMap(refresh).values());
|
|
495
524
|
}
|
|
496
525
|
addToMethodsMap(method) {
|
|
497
|
-
this.methodsMap.set(method.getSignature().
|
|
526
|
+
this.methodsMap.set(method.getSignature().toMapKey(), method);
|
|
527
|
+
}
|
|
528
|
+
removeMethod(method) {
|
|
529
|
+
return this.methodsMap.delete(method.getSignature().toMapKey());
|
|
530
|
+
}
|
|
531
|
+
removeClass(arkClass) {
|
|
532
|
+
return this.classesMap.delete(arkClass.getSignature().toMapKey());
|
|
533
|
+
}
|
|
534
|
+
removeNamespace(namespace) {
|
|
535
|
+
return this.namespacesMap.delete(namespace.getSignature().toMapKey());
|
|
536
|
+
}
|
|
537
|
+
removeFile(file) {
|
|
538
|
+
return this.filesMap.delete(file.getFileSignature().toMapKey());
|
|
498
539
|
}
|
|
499
540
|
hasMainMethod() {
|
|
500
541
|
return false;
|
|
@@ -534,29 +575,28 @@ class Scene {
|
|
|
534
575
|
* @example
|
|
535
576
|
* 1. Infer the type of each class field and method field.
|
|
536
577
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
578
|
+
```typescript
|
|
579
|
+
const scene = new Scene();
|
|
580
|
+
scene.buildSceneFromProjectDir(sceneConfig);
|
|
581
|
+
scene.inferTypes();
|
|
582
|
+
```
|
|
542
583
|
*/
|
|
543
584
|
inferTypes() {
|
|
544
|
-
this.
|
|
545
|
-
|
|
546
|
-
});
|
|
547
|
-
this.filesMap.forEach(file => {
|
|
548
|
-
ModelUtils_1.ModelUtils.getAllClassesInFile(file).forEach(arkClass => {
|
|
549
|
-
TypeInference_1.TypeInference.inferGenericType(arkClass.getGenericsTypes(), arkClass);
|
|
550
|
-
arkClass.getFields().forEach(arkField => TypeInference_1.TypeInference.inferTypeInArkField(arkField));
|
|
551
|
-
const defaultArkMethod = arkClass.getDefaultArkMethod();
|
|
552
|
-
if (defaultArkMethod) {
|
|
553
|
-
TypeInference_1.TypeInference.inferTypeInMethod(defaultArkMethod);
|
|
554
|
-
}
|
|
555
|
-
arkClass.getMethods().forEach(arkMethod => TypeInference_1.TypeInference.inferTypeInMethod(arkMethod));
|
|
556
|
-
});
|
|
557
|
-
});
|
|
585
|
+
this.filesMap.forEach(file => this.inferFile(file));
|
|
586
|
+
this.getClasses(true);
|
|
558
587
|
this.getMethodsMap(true);
|
|
559
588
|
}
|
|
589
|
+
inferFile(file) {
|
|
590
|
+
ModelUtils_1.ModelUtils.getAllClassesInFile(file).forEach(arkClass => {
|
|
591
|
+
TypeInference_1.TypeInference.inferGenericType(arkClass.getGenericsTypes(), arkClass);
|
|
592
|
+
const defaultArkMethod = arkClass.getDefaultArkMethod();
|
|
593
|
+
if (defaultArkMethod) {
|
|
594
|
+
TypeInference_1.TypeInference.inferTypeInMethod(defaultArkMethod);
|
|
595
|
+
}
|
|
596
|
+
arkClass.getFields().forEach(arkField => TypeInference_1.TypeInference.inferTypeInArkField(arkField));
|
|
597
|
+
arkClass.getMethods().forEach(arkMethod => TypeInference_1.TypeInference.inferTypeInMethod(arkMethod));
|
|
598
|
+
});
|
|
599
|
+
}
|
|
560
600
|
/**
|
|
561
601
|
* Iterate all assignment statements in methods,
|
|
562
602
|
* and set the type of left operand based on the type of right operand
|
|
@@ -565,11 +605,11 @@ class Scene {
|
|
|
565
605
|
* @example
|
|
566
606
|
* 1. Infer simple type when scene building.
|
|
567
607
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
608
|
+
```typescript
|
|
609
|
+
let scene = new Scene();
|
|
610
|
+
scene.buildSceneFromProjectDir(config);
|
|
611
|
+
scene.inferSimpleTypes();
|
|
612
|
+
```
|
|
573
613
|
*/
|
|
574
614
|
inferSimpleTypes() {
|
|
575
615
|
for (let arkFile of this.getFiles()) {
|
|
@@ -580,13 +620,6 @@ class Scene {
|
|
|
580
620
|
}
|
|
581
621
|
}
|
|
582
622
|
}
|
|
583
|
-
collectProjectImportInfos() {
|
|
584
|
-
this.getFiles().forEach((arkFile) => {
|
|
585
|
-
arkFile.getImportInfos().forEach((importInfo) => {
|
|
586
|
-
this.globalImportInfos.push(importInfo);
|
|
587
|
-
});
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
623
|
getClassMap() {
|
|
591
624
|
var _a, _b, _c, _d;
|
|
592
625
|
const classMap = new Map();
|
|
@@ -669,7 +702,7 @@ class Scene {
|
|
|
669
702
|
try {
|
|
670
703
|
// 遗留问题:只统计了项目文件的namespace,没统计sdk文件内部的引入
|
|
671
704
|
const importNameSpaceClasses = classMap.get(importNameSpace.getNamespaceSignature());
|
|
672
|
-
importClasses.push(...importNameSpaceClasses.filter(c => !importClasses.includes(c) && c.getName() !==
|
|
705
|
+
importClasses.push(...importNameSpaceClasses.filter(c => !importClasses.includes(c) && c.getName() !== Const_1.DEFAULT_ARK_CLASS_NAME));
|
|
673
706
|
}
|
|
674
707
|
catch (_e) {
|
|
675
708
|
}
|
|
@@ -681,14 +714,14 @@ class Scene {
|
|
|
681
714
|
const namespaceStack = [...file.getNamespaces()];
|
|
682
715
|
for (const ns of namespaceStack) {
|
|
683
716
|
const nsClasses = classMap.get(ns.getNamespaceSignature());
|
|
684
|
-
nsClasses.push(...fileClasses.filter(c => !nsClasses.includes(c) && c.getName() !==
|
|
717
|
+
nsClasses.push(...fileClasses.filter(c => !nsClasses.includes(c) && c.getName() !== Const_1.DEFAULT_ARK_CLASS_NAME));
|
|
685
718
|
}
|
|
686
719
|
while (namespaceStack.length > 0) {
|
|
687
720
|
const ns = namespaceStack.shift();
|
|
688
721
|
const nsClasses = classMap.get(ns.getNamespaceSignature());
|
|
689
722
|
for (const nsns of ns.getNamespaces()) {
|
|
690
723
|
const nsnsClasses = classMap.get(nsns.getNamespaceSignature());
|
|
691
|
-
nsnsClasses.push(...nsClasses.filter(c => !nsnsClasses.includes(c) && c.getName() !==
|
|
724
|
+
nsnsClasses.push(...nsClasses.filter(c => !nsnsClasses.includes(c) && c.getName() !== Const_1.DEFAULT_ARK_CLASS_NAME));
|
|
692
725
|
namespaceStack.push(nsns);
|
|
693
726
|
}
|
|
694
727
|
}
|
|
@@ -780,7 +813,7 @@ class Scene {
|
|
|
780
813
|
try {
|
|
781
814
|
// 遗留问题:只统计了项目文件,没统计sdk文件内部的引入
|
|
782
815
|
const importNameSpaceClasses = globalVariableMap.get(importNameSpace.getNamespaceSignature());
|
|
783
|
-
importLocals.push(...importNameSpaceClasses.filter(c => !importLocals.includes(c) && c.getName() !==
|
|
816
|
+
importLocals.push(...importNameSpaceClasses.filter(c => !importLocals.includes(c) && c.getName() !== Const_1.DEFAULT_ARK_CLASS_NAME));
|
|
784
817
|
}
|
|
785
818
|
catch (_h) {
|
|
786
819
|
}
|
|
@@ -837,17 +870,16 @@ class Scene {
|
|
|
837
870
|
}
|
|
838
871
|
exports.Scene = Scene;
|
|
839
872
|
class ModuleScene {
|
|
840
|
-
constructor() {
|
|
841
|
-
this.projectScene = new Scene();
|
|
873
|
+
constructor(projectScene) {
|
|
842
874
|
this.moduleName = '';
|
|
843
875
|
this.modulePath = '';
|
|
844
876
|
this.moduleOhPkgFilePath = '';
|
|
845
877
|
this.ohPkgContent = {};
|
|
878
|
+
this.projectScene = projectScene;
|
|
846
879
|
}
|
|
847
|
-
|
|
880
|
+
ModuleSceneBuilder(moduleName, modulePath, recursively = false) {
|
|
848
881
|
this.moduleName = moduleName;
|
|
849
882
|
this.modulePath = modulePath;
|
|
850
|
-
this.projectScene = projectScene;
|
|
851
883
|
this.getModuleOhPkgFilePath();
|
|
852
884
|
if (this.moduleOhPkgFilePath) {
|
|
853
885
|
this.ohPkgContent = (0, json5parser_1.fetchDependenciesFromFile)(this.moduleOhPkgFilePath);
|
|
@@ -883,14 +915,13 @@ class ModuleScene {
|
|
|
883
915
|
return this.ohPkgContent;
|
|
884
916
|
}
|
|
885
917
|
genArkFiles() {
|
|
886
|
-
(0, getAllFiles_1.getAllFiles)(this.modulePath, ['.ets', '.ts']).forEach((file) => {
|
|
918
|
+
(0, getAllFiles_1.getAllFiles)(this.modulePath, ['.ets', '.ts'], this.projectScene.getOptions().ignoreFileNames).forEach((file) => {
|
|
887
919
|
logger.info('=== parse file:', file);
|
|
888
920
|
let arkFile = new ArkFile_1.ArkFile();
|
|
889
921
|
arkFile.setScene(this.projectScene);
|
|
890
922
|
arkFile.setModuleScene(this);
|
|
891
923
|
(0, ArkFileBuilder_1.buildArkFileFromFile)(file, this.projectScene.getRealProjectDir(), arkFile, this.projectScene.getProjectName());
|
|
892
|
-
|
|
893
|
-
this.projectScene.getFilesMap().set(fileSig, arkFile);
|
|
924
|
+
this.projectScene.setFile(arkFile);
|
|
894
925
|
});
|
|
895
926
|
}
|
|
896
927
|
}
|
|
@@ -76,7 +76,7 @@ class AbstractAnalysis {
|
|
|
76
76
|
while (this.workList.length !== 0) {
|
|
77
77
|
const method = this.workList.shift();
|
|
78
78
|
const cgNode = this.cg.getNode(method);
|
|
79
|
-
if (this.processedMethod.has(method) || cgNode.
|
|
79
|
+
if (this.processedMethod.has(method) || cgNode.isSdkMethod()) {
|
|
80
80
|
continue;
|
|
81
81
|
}
|
|
82
82
|
// pre process for RTA only
|
|
@@ -108,7 +108,7 @@ class PTAStat {
|
|
|
108
108
|
let cg = this.pta.getCallGraph();
|
|
109
109
|
this.pta.getUnhandledFuncs().forEach(funcID => {
|
|
110
110
|
let cgNode = cg.getNode(funcID);
|
|
111
|
-
if (cgNode.
|
|
111
|
+
if (cgNode.isSdkMethod()) {
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
114
|
let f = cg.getArkMethodByFuncID(funcID);
|
|
@@ -44,12 +44,12 @@ export declare class CallGraphEdge extends BaseEdge {
|
|
|
44
44
|
}
|
|
45
45
|
export declare class CallGraphNode extends BaseNode {
|
|
46
46
|
private method;
|
|
47
|
-
private
|
|
47
|
+
private ifSdkMethod;
|
|
48
48
|
private isBlank;
|
|
49
49
|
constructor(id: number, m: Method, k?: CallGraphNodeKind);
|
|
50
50
|
getMethod(): Method;
|
|
51
51
|
setSdkMethod(v: boolean): void;
|
|
52
|
-
|
|
52
|
+
isSdkMethod(): boolean;
|
|
53
53
|
get isBlankMethod(): boolean;
|
|
54
54
|
set isBlankMethod(is: boolean);
|
|
55
55
|
getDotAttr(): string;
|
|
@@ -90,5 +90,6 @@ export declare class CallGraph extends BaseGraph {
|
|
|
90
90
|
printStat(): void;
|
|
91
91
|
setDummyMainFuncID(dummyMainMethodID: number): void;
|
|
92
92
|
getDummyMainFuncID(): FuncID | undefined;
|
|
93
|
+
isUnknownMethod(funcID: FuncID): boolean;
|
|
93
94
|
}
|
|
94
95
|
//# sourceMappingURL=CallGraph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CallGraph.d.ts","sourceRoot":"","sources":["../../../src/callgraph/model/CallGraph.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"CallGraph.d.ts","sourceRoot":"","sources":["../../../src/callgraph/model/CallGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ const GraphPrinter_1 = require("../../save/GraphPrinter");
|
|
|
19
19
|
const PrinterBuilder_1 = require("../../save/PrinterBuilder");
|
|
20
20
|
const BaseGraph_1 = require("./BaseGraph");
|
|
21
21
|
const Statistics_1 = require("../common/Statistics");
|
|
22
|
+
const Const_1 = require("../../core/common/Const");
|
|
22
23
|
var CallGraphNodeKind;
|
|
23
24
|
(function (CallGraphNodeKind) {
|
|
24
25
|
CallGraphNodeKind[CallGraphNodeKind["real"] = 0] = "real";
|
|
@@ -93,7 +94,7 @@ exports.CallGraphEdge = CallGraphEdge;
|
|
|
93
94
|
class CallGraphNode extends BaseGraph_1.BaseNode {
|
|
94
95
|
constructor(id, m, k = CallGraphNodeKind.real) {
|
|
95
96
|
super(id, k);
|
|
96
|
-
this.
|
|
97
|
+
this.ifSdkMethod = false;
|
|
97
98
|
this.isBlank = false;
|
|
98
99
|
this.method = m;
|
|
99
100
|
}
|
|
@@ -101,10 +102,10 @@ class CallGraphNode extends BaseGraph_1.BaseNode {
|
|
|
101
102
|
return this.method;
|
|
102
103
|
}
|
|
103
104
|
setSdkMethod(v) {
|
|
104
|
-
this.
|
|
105
|
+
this.ifSdkMethod = v;
|
|
105
106
|
}
|
|
106
|
-
|
|
107
|
-
return this.
|
|
107
|
+
isSdkMethod() {
|
|
108
|
+
return this.ifSdkMethod;
|
|
108
109
|
}
|
|
109
110
|
get isBlankMethod() {
|
|
110
111
|
return this.isBlank;
|
|
@@ -149,7 +150,7 @@ class CallGraph extends BaseGraph_1.BaseGraph {
|
|
|
149
150
|
let id = this.nodeNum;
|
|
150
151
|
let cgNode = new CallGraphNode(id, method, kind);
|
|
151
152
|
// check if sdk method
|
|
152
|
-
cgNode.setSdkMethod(this.scene.
|
|
153
|
+
cgNode.setSdkMethod(this.scene.hasSdkFile(method.getDeclaringClassSignature().getDeclaringFileSignature()));
|
|
153
154
|
let arkMethod = this.scene.getMethod(method);
|
|
154
155
|
if (!arkMethod || !arkMethod.getCfg()) {
|
|
155
156
|
cgNode.isBlankMethod = true;
|
|
@@ -334,5 +335,14 @@ class CallGraph extends BaseGraph_1.BaseGraph {
|
|
|
334
335
|
getDummyMainFuncID() {
|
|
335
336
|
return this.dummyMainMethodID;
|
|
336
337
|
}
|
|
338
|
+
isUnknownMethod(funcID) {
|
|
339
|
+
let method = this.getMethodByFuncID(funcID);
|
|
340
|
+
if (method) {
|
|
341
|
+
if (!(method.getDeclaringClassSignature().getDeclaringFileSignature().getFileName() === Const_1.UNKNOWN_FILE_NAME)) {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
337
347
|
}
|
|
338
348
|
exports.CallGraph = CallGraph;
|
|
@@ -35,7 +35,7 @@ class CallGraphBuilder {
|
|
|
35
35
|
for (const method of methods) {
|
|
36
36
|
let m = method.getSignature();
|
|
37
37
|
let kind = CallGraph_1.CallGraphNodeKind.real;
|
|
38
|
-
if (method.isGenerated()) {
|
|
38
|
+
if (method.isGenerated()) {
|
|
39
39
|
kind = CallGraph_1.CallGraphNodeKind.intrinsic;
|
|
40
40
|
}
|
|
41
41
|
if (method.getName() === 'constructor') {
|