arkanalyzer 1.0.20 → 1.0.21
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/Config.d.ts +70 -70
- package/lib/Config.js +198 -198
- package/lib/Scene.d.ts +316 -316
- package/lib/Scene.js +1316 -1316
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +28 -28
- package/lib/callgraph/algorithm/AbstractAnalysis.js +144 -144
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts +10 -10
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +69 -69
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +15 -15
- package/lib/callgraph/algorithm/RapidTypeAnalysis.js +146 -146
- package/lib/callgraph/common/Statistics.d.ts +57 -57
- package/lib/callgraph/common/Statistics.js +228 -228
- package/lib/callgraph/model/CallGraph.d.ts +96 -96
- package/lib/callgraph/model/CallGraph.js +354 -354
- package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +15 -15
- package/lib/callgraph/model/builder/CallGraphBuilder.js +106 -106
- package/lib/callgraph/pointerAnalysis/Context.d.ts +37 -37
- package/lib/callgraph/pointerAnalysis/Context.js +155 -155
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.d.ts +22 -22
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.js +104 -104
- package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts +5 -5
- package/lib/callgraph/pointerAnalysis/PTAUtils.js +46 -46
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +261 -261
- package/lib/callgraph/pointerAnalysis/Pag.js +930 -930
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +157 -157
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +1399 -1399
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +72 -72
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +573 -573
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +15 -15
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +81 -81
- package/lib/callgraph/pointerAnalysis/PtsDS.d.ts +80 -80
- package/lib/callgraph/pointerAnalysis/PtsDS.js +308 -308
- package/lib/core/base/Constant.d.ts +48 -48
- package/lib/core/base/Constant.js +103 -103
- package/lib/core/base/Decorator.d.ts +15 -15
- package/lib/core/base/Decorator.js +46 -46
- package/lib/core/base/DefUseChain.d.ts +8 -8
- package/lib/core/base/DefUseChain.js +25 -25
- package/lib/core/base/Expr.d.ts +340 -340
- package/lib/core/base/Expr.js +917 -917
- package/lib/core/base/Local.d.ts +104 -104
- package/lib/core/base/Local.js +176 -176
- package/lib/core/base/Position.d.ts +30 -30
- package/lib/core/base/Position.js +147 -147
- package/lib/core/base/Ref.d.ts +173 -173
- package/lib/core/base/Ref.js +374 -374
- package/lib/core/base/Stmt.d.ts +237 -237
- package/lib/core/base/Stmt.js +525 -525
- package/lib/core/base/Trap.d.ts +8 -8
- package/lib/core/base/Trap.js +30 -30
- package/lib/core/base/Type.d.ts +308 -308
- package/lib/core/base/Type.js +639 -639
- package/lib/core/base/TypeExpr.d.ts +71 -71
- package/lib/core/base/TypeExpr.js +155 -155
- package/lib/core/base/Value.d.ts +32 -32
- package/lib/core/base/Value.js +16 -16
- package/lib/core/common/ArkError.d.ts +14 -14
- package/lib/core/common/ArkError.js +28 -28
- package/lib/core/common/ArkIRTransformer.d.ts +67 -67
- package/lib/core/common/ArkIRTransformer.js +690 -690
- package/lib/core/common/ArkValueTransformer.d.ts +89 -89
- package/lib/core/common/ArkValueTransformer.js +1478 -1478
- package/lib/core/common/Builtin.d.ts +36 -36
- package/lib/core/common/Builtin.js +81 -81
- package/lib/core/common/Const.d.ts +21 -21
- package/lib/core/common/Const.js +43 -43
- package/lib/core/common/DummyMainCreater.d.ts +46 -46
- package/lib/core/common/DummyMainCreater.js +319 -319
- package/lib/core/common/EtsConst.d.ts +73 -73
- package/lib/core/common/EtsConst.js +1021 -1021
- package/lib/core/common/ExprUseReplacer.d.ts +21 -21
- package/lib/core/common/ExprUseReplacer.js +124 -124
- package/lib/core/common/IRInference.d.ts +36 -36
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +651 -648
- package/lib/core/common/IRUtils.d.ts +18 -18
- package/lib/core/common/IRUtils.js +141 -141
- package/lib/core/common/ModelUtils.d.ts +70 -70
- package/lib/core/common/ModelUtils.js +712 -712
- package/lib/core/common/RefUseReplacer.d.ts +13 -13
- package/lib/core/common/RefUseReplacer.js +52 -52
- package/lib/core/common/SdkUtils.d.ts +8 -8
- package/lib/core/common/SdkUtils.js +105 -105
- package/lib/core/common/StmtDefReplacer.d.ts +12 -12
- package/lib/core/common/StmtDefReplacer.js +41 -41
- package/lib/core/common/StmtUseReplacer.d.ts +16 -16
- package/lib/core/common/StmtUseReplacer.js +108 -108
- package/lib/core/common/TSConst.d.ts +18 -18
- package/lib/core/common/TSConst.js +36 -36
- package/lib/core/common/TypeInference.d.ts +102 -102
- package/lib/core/common/TypeInference.js +748 -748
- package/lib/core/common/ValueUtil.d.ts +12 -12
- package/lib/core/common/ValueUtil.js +54 -54
- package/lib/core/common/VisibleValue.d.ts +36 -36
- package/lib/core/common/VisibleValue.js +212 -212
- package/lib/core/dataflow/DataflowProblem.d.ts +20 -20
- package/lib/core/dataflow/DataflowProblem.js +20 -20
- package/lib/core/dataflow/DataflowResult.d.ts +7 -7
- package/lib/core/dataflow/DataflowResult.js +26 -26
- package/lib/core/dataflow/DataflowSolver.d.ts +43 -43
- package/lib/core/dataflow/DataflowSolver.js +307 -307
- package/lib/core/dataflow/Edge.d.ts +11 -11
- package/lib/core/dataflow/Edge.js +31 -31
- package/lib/core/dataflow/Fact.d.ts +6 -6
- package/lib/core/dataflow/Fact.js +24 -24
- package/lib/core/dataflow/GenericDataFlow.d.ts +142 -142
- package/lib/core/dataflow/GenericDataFlow.js +109 -109
- package/lib/core/dataflow/ReachingDef.d.ts +62 -62
- package/lib/core/dataflow/ReachingDef.js +168 -168
- package/lib/core/dataflow/UndefinedVariable.d.ts +45 -45
- package/lib/core/dataflow/UndefinedVariable.js +288 -288
- package/lib/core/dataflow/Util.d.ts +9 -9
- package/lib/core/dataflow/Util.js +64 -64
- package/lib/core/graph/BaseExplicitGraph.d.ts +58 -58
- package/lib/core/graph/BaseExplicitGraph.js +157 -157
- package/lib/core/graph/BaseImplicitGraph.d.ts +77 -77
- package/lib/core/graph/BaseImplicitGraph.js +78 -78
- package/lib/core/graph/BasicBlock.d.ts +104 -104
- package/lib/core/graph/BasicBlock.js +280 -280
- package/lib/core/graph/Cfg.d.ts +59 -59
- package/lib/core/graph/Cfg.js +282 -282
- package/lib/core/graph/DependsGraph.d.ts +35 -35
- package/lib/core/graph/DependsGraph.js +87 -87
- package/lib/core/graph/DominanceFinder.d.ts +15 -15
- package/lib/core/graph/DominanceFinder.js +121 -121
- package/lib/core/graph/DominanceTree.d.ts +12 -12
- package/lib/core/graph/DominanceTree.js +70 -70
- package/lib/core/graph/GraphTraits.d.ts +7 -7
- package/lib/core/graph/GraphTraits.js +16 -16
- package/lib/core/graph/Scc.d.ts +61 -61
- package/lib/core/graph/Scc.js +222 -222
- package/lib/core/graph/ViewTree.d.ts +114 -114
- package/lib/core/graph/ViewTree.js +16 -16
- package/lib/core/graph/builder/CfgBuilder.d.ts +176 -176
- package/lib/core/graph/builder/CfgBuilder.js +1139 -1139
- package/lib/core/graph/builder/ConditionBuilder.d.ts +15 -15
- package/lib/core/graph/builder/ConditionBuilder.js +252 -252
- package/lib/core/graph/builder/LoopBuilder.d.ts +20 -20
- package/lib/core/graph/builder/LoopBuilder.js +251 -251
- package/lib/core/graph/builder/SwitchBuilder.d.ts +11 -11
- package/lib/core/graph/builder/SwitchBuilder.js +152 -152
- package/lib/core/graph/builder/TrapBuilder.d.ts +16 -16
- package/lib/core/graph/builder/TrapBuilder.js +272 -272
- package/lib/core/graph/builder/ViewTreeBuilder.d.ts +203 -203
- package/lib/core/graph/builder/ViewTreeBuilder.js +1055 -1055
- package/lib/core/model/ArkBaseModel.d.ts +59 -59
- package/lib/core/model/ArkBaseModel.js +274 -274
- package/lib/core/model/ArkBody.d.ts +24 -24
- package/lib/core/model/ArkBody.js +65 -65
- package/lib/core/model/ArkClass.d.ts +206 -206
- package/lib/core/model/ArkClass.js +439 -439
- package/lib/core/model/ArkExport.d.ts +72 -72
- package/lib/core/model/ArkExport.js +147 -147
- package/lib/core/model/ArkField.d.ts +62 -62
- package/lib/core/model/ArkField.js +113 -113
- package/lib/core/model/ArkFile.d.ts +131 -131
- package/lib/core/model/ArkFile.js +267 -267
- package/lib/core/model/ArkImport.d.ts +44 -44
- package/lib/core/model/ArkImport.js +108 -108
- package/lib/core/model/ArkMetadata.d.ts +31 -31
- package/lib/core/model/ArkMetadata.js +55 -55
- package/lib/core/model/ArkMethod.d.ts +261 -261
- package/lib/core/model/ArkMethod.js +592 -592
- package/lib/core/model/ArkNamespace.d.ts +66 -66
- package/lib/core/model/ArkNamespace.js +209 -209
- package/lib/core/model/ArkSignature.d.ts +162 -162
- package/lib/core/model/ArkSignature.js +379 -379
- package/lib/core/model/builder/ArkClassBuilder.d.ts +12 -12
- package/lib/core/model/builder/ArkClassBuilder.js +454 -454
- package/lib/core/model/builder/ArkExportBuilder.d.ts +24 -24
- package/lib/core/model/builder/ArkExportBuilder.js +210 -210
- package/lib/core/model/builder/ArkFieldBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkFieldBuilder.js +193 -193
- package/lib/core/model/builder/ArkFileBuilder.d.ts +9 -9
- package/lib/core/model/builder/ArkFileBuilder.js +165 -165
- package/lib/core/model/builder/ArkImportBuilder.d.ts +4 -4
- package/lib/core/model/builder/ArkImportBuilder.js +128 -128
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +63 -63
- package/lib/core/model/builder/ArkMethodBuilder.js +486 -486
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts +5 -5
- package/lib/core/model/builder/ArkNamespaceBuilder.js +205 -205
- package/lib/core/model/builder/ArkSignatureBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkSignatureBuilder.js +40 -40
- package/lib/core/model/builder/BodyBuilder.d.ts +55 -30
- package/lib/core/model/builder/BodyBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/BodyBuilder.js +542 -371
- package/lib/core/model/builder/builderUtils.d.ts +18 -18
- package/lib/core/model/builder/builderUtils.js +558 -558
- package/lib/index.d.ts +82 -80
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +201 -196
- package/lib/save/ArkStream.d.ts +23 -23
- package/lib/save/ArkStream.js +83 -83
- package/lib/save/DotPrinter.d.ts +43 -43
- package/lib/save/DotPrinter.js +170 -170
- package/lib/save/GraphPrinter.d.ts +16 -16
- package/lib/save/GraphPrinter.js +134 -134
- package/lib/save/JsonPrinter.d.ts +30 -30
- package/lib/save/JsonPrinter.js +580 -580
- package/lib/save/Printer.d.ts +12 -12
- package/lib/save/Printer.js +27 -27
- package/lib/save/PrinterBuilder.d.ts +53 -53
- package/lib/save/PrinterBuilder.js +145 -145
- package/lib/save/ViewTreePrinter.d.ts +14 -14
- package/lib/save/ViewTreePrinter.js +123 -123
- package/lib/save/arkir/ArkIRClassPrinter.d.ts +13 -13
- package/lib/save/arkir/ArkIRClassPrinter.js +92 -92
- package/lib/save/arkir/ArkIRFieldPrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRFieldPrinter.js +64 -64
- package/lib/save/arkir/ArkIRFilePrinter.d.ts +12 -12
- package/lib/save/arkir/ArkIRFilePrinter.js +54 -54
- package/lib/save/arkir/ArkIRMethodPrinter.d.ts +16 -16
- package/lib/save/arkir/ArkIRMethodPrinter.js +159 -159
- package/lib/save/arkir/ArkIRNamespacePrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRNamespacePrinter.js +66 -66
- package/lib/save/base/BasePrinter.d.ts +23 -23
- package/lib/save/base/BasePrinter.js +70 -70
- package/lib/save/base/ExportPrinter.d.ts +8 -8
- package/lib/save/base/ExportPrinter.js +67 -67
- package/lib/save/base/ImportPrinter.d.ts +9 -9
- package/lib/save/base/ImportPrinter.js +92 -92
- package/lib/save/base/PrinterUtils.d.ts +24 -24
- package/lib/save/base/PrinterUtils.js +208 -208
- package/lib/save/serializeArkIR.d.ts +8 -8
- package/lib/save/serializeArkIR.js +294 -294
- package/lib/save/source/SourceBase.d.ts +22 -22
- package/lib/save/source/SourceBase.js +64 -64
- package/lib/save/source/SourceBody.d.ts +58 -58
- package/lib/save/source/SourceBody.js +296 -296
- package/lib/save/source/SourceClass.d.ts +25 -25
- package/lib/save/source/SourceClass.js +187 -187
- package/lib/save/source/SourceField.d.ts +13 -13
- package/lib/save/source/SourceField.js +73 -73
- package/lib/save/source/SourceFilePrinter.d.ts +12 -12
- package/lib/save/source/SourceFilePrinter.js +69 -69
- package/lib/save/source/SourceMethod.d.ts +22 -22
- package/lib/save/source/SourceMethod.d.ts.map +1 -1
- package/lib/save/source/SourceMethod.js +196 -193
- package/lib/save/source/SourceNamespace.d.ts +11 -11
- package/lib/save/source/SourceNamespace.js +83 -83
- package/lib/save/source/SourceStmt.d.ts +178 -178
- package/lib/save/source/SourceStmt.js +838 -838
- package/lib/save/source/SourceTransformer.d.ts +46 -46
- package/lib/save/source/SourceTransformer.js +446 -446
- package/lib/transformer/FunctionTransformer.d.ts +2 -2
- package/lib/transformer/FunctionTransformer.js +17 -17
- package/lib/transformer/SceneTransformer.d.ts +2 -2
- package/lib/transformer/SceneTransformer.js +17 -17
- package/lib/transformer/StaticSingleAssignmentFormer.d.ts +12 -12
- package/lib/transformer/StaticSingleAssignmentFormer.js +259 -259
- package/lib/transformer/Transformer.d.ts +6 -6
- package/lib/transformer/Transformer.js +22 -22
- package/lib/utils/AstTreeUtils.d.ts +4 -4
- package/lib/utils/AstTreeUtils.js +26 -26
- package/lib/utils/CfgStructualAnalysis.d.ts +110 -110
- package/lib/utils/CfgStructualAnalysis.js +1277 -1277
- package/lib/utils/FileUtils.d.ts +18 -18
- package/lib/utils/FileUtils.js +135 -135
- package/lib/utils/SparseBitVector.d.ts +100 -100
- package/lib/utils/SparseBitVector.js +445 -445
- package/lib/utils/callGraphUtils.d.ts +30 -30
- package/lib/utils/callGraphUtils.js +205 -205
- package/lib/utils/crypto_utils.d.ts +5 -5
- package/lib/utils/crypto_utils.js +57 -57
- package/lib/utils/entryMethodUtils.d.ts +13 -13
- package/lib/utils/entryMethodUtils.js +110 -110
- package/lib/utils/getAllFiles.d.ts +9 -9
- package/lib/utils/getAllFiles.js +90 -90
- package/lib/utils/json5parser.d.ts +6 -6
- package/lib/utils/json5parser.js +146 -146
- package/lib/utils/logger.d.ts +18 -18
- package/lib/utils/logger.d.ts.map +1 -1
- package/lib/utils/logger.js +97 -90
- package/lib/utils/pathTransfer.d.ts +1 -1
- package/lib/utils/pathTransfer.js +25 -25
- package/node_modules/json5/lib/cli.js +0 -0
- package/node_modules/ohos-typescript/bin/tsc +0 -0
- package/node_modules/ohos-typescript/bin/tsserver +0 -0
- package/package.json +3 -3
|
@@ -1,354 +1,354 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2024 Huawei Device Co., Ltd.
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.CallGraph = exports.CallGraphNode = exports.CallGraphEdge = exports.CSCallSite = exports.DynCallSite = exports.CallSite = exports.CallGraphNodeKind = void 0;
|
|
18
|
-
const GraphPrinter_1 = require("../../save/GraphPrinter");
|
|
19
|
-
const PrinterBuilder_1 = require("../../save/PrinterBuilder");
|
|
20
|
-
const BaseExplicitGraph_1 = require("../../core/graph/BaseExplicitGraph");
|
|
21
|
-
const Statistics_1 = require("../common/Statistics");
|
|
22
|
-
const Const_1 = require("../../core/common/Const");
|
|
23
|
-
var CallGraphNodeKind;
|
|
24
|
-
(function (CallGraphNodeKind) {
|
|
25
|
-
CallGraphNodeKind[CallGraphNodeKind["real"] = 0] = "real";
|
|
26
|
-
CallGraphNodeKind[CallGraphNodeKind["vitual"] = 1] = "vitual";
|
|
27
|
-
CallGraphNodeKind[CallGraphNodeKind["intrinsic"] = 2] = "intrinsic";
|
|
28
|
-
CallGraphNodeKind[CallGraphNodeKind["constructor"] = 3] = "constructor";
|
|
29
|
-
})(CallGraphNodeKind = exports.CallGraphNodeKind || (exports.CallGraphNodeKind = {}));
|
|
30
|
-
class CallSite {
|
|
31
|
-
constructor(s, a, ce, cr) {
|
|
32
|
-
this.callStmt = s;
|
|
33
|
-
this.args = a;
|
|
34
|
-
this.calleeFuncID = ce;
|
|
35
|
-
this.callerFuncID = cr;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
exports.CallSite = CallSite;
|
|
39
|
-
class DynCallSite {
|
|
40
|
-
constructor(caller, s, a, ptcCallee) {
|
|
41
|
-
this.callerFuncID = caller;
|
|
42
|
-
this.callStmt = s;
|
|
43
|
-
this.args = a;
|
|
44
|
-
this.protentialCalleeFuncID = ptcCallee;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
exports.DynCallSite = DynCallSite;
|
|
48
|
-
class CSCallSite extends CallSite {
|
|
49
|
-
constructor(id, cs) {
|
|
50
|
-
super(cs.callStmt, cs.args, cs.calleeFuncID, cs.callerFuncID);
|
|
51
|
-
this.cid = id;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
exports.CSCallSite = CSCallSite;
|
|
55
|
-
class CallGraphEdge extends BaseExplicitGraph_1.BaseEdge {
|
|
56
|
-
// private callSiteID: CallSiteID;
|
|
57
|
-
constructor(src, dst) {
|
|
58
|
-
super(src, dst, 0);
|
|
59
|
-
this.directCalls = new Set();
|
|
60
|
-
this.specialCalls = new Set();
|
|
61
|
-
this.indirectCalls = new Set();
|
|
62
|
-
}
|
|
63
|
-
addDirectCallSite(stmt) {
|
|
64
|
-
this.directCalls.add(stmt);
|
|
65
|
-
}
|
|
66
|
-
addSpecialCallSite(stmt) {
|
|
67
|
-
this.specialCalls.add(stmt);
|
|
68
|
-
}
|
|
69
|
-
addInDirectCallSite(stmt) {
|
|
70
|
-
this.indirectCalls.add(stmt);
|
|
71
|
-
}
|
|
72
|
-
getDotAttr() {
|
|
73
|
-
const indirectCallNums = this.indirectCalls.size;
|
|
74
|
-
const directCallNums = this.directCalls.size;
|
|
75
|
-
const specialCallNums = this.specialCalls.size;
|
|
76
|
-
if ([CallGraphNodeKind.intrinsic, CallGraphNodeKind.constructor].includes(this.getDstNode().getKind())) {
|
|
77
|
-
return '';
|
|
78
|
-
}
|
|
79
|
-
if (indirectCallNums !== 0 && directCallNums === 0) {
|
|
80
|
-
return "color=red";
|
|
81
|
-
}
|
|
82
|
-
else if (specialCallNums !== 0) {
|
|
83
|
-
return "color=yellow";
|
|
84
|
-
}
|
|
85
|
-
else if (indirectCallNums === 0 && directCallNums !== 0) {
|
|
86
|
-
return "color=black";
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
return "color=black";
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
exports.CallGraphEdge = CallGraphEdge;
|
|
94
|
-
class CallGraphNode extends BaseExplicitGraph_1.BaseNode {
|
|
95
|
-
constructor(id, m, k = CallGraphNodeKind.real) {
|
|
96
|
-
super(id, k);
|
|
97
|
-
this.ifSdkMethod = false;
|
|
98
|
-
this.isBlank = false;
|
|
99
|
-
this.method = m;
|
|
100
|
-
}
|
|
101
|
-
getMethod() {
|
|
102
|
-
return this.method;
|
|
103
|
-
}
|
|
104
|
-
setSdkMethod(v) {
|
|
105
|
-
this.ifSdkMethod = v;
|
|
106
|
-
}
|
|
107
|
-
isSdkMethod() {
|
|
108
|
-
return this.ifSdkMethod;
|
|
109
|
-
}
|
|
110
|
-
get isBlankMethod() {
|
|
111
|
-
return this.isBlank;
|
|
112
|
-
}
|
|
113
|
-
set isBlankMethod(is) {
|
|
114
|
-
this.isBlank = is;
|
|
115
|
-
}
|
|
116
|
-
getDotAttr() {
|
|
117
|
-
if ([CallGraphNodeKind.intrinsic, CallGraphNodeKind.constructor].includes(this.getKind())) {
|
|
118
|
-
return '';
|
|
119
|
-
}
|
|
120
|
-
return 'shape=box';
|
|
121
|
-
}
|
|
122
|
-
getDotLabel() {
|
|
123
|
-
let label = 'ID: ' + this.getID() + '\n';
|
|
124
|
-
label = label + this.getMethod().toString();
|
|
125
|
-
return label;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
exports.CallGraphNode = CallGraphNode;
|
|
129
|
-
class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
130
|
-
constructor(s) {
|
|
131
|
-
super();
|
|
132
|
-
this.idToCallSiteMap = new Map();
|
|
133
|
-
this.callSiteToIdMap = new Map();
|
|
134
|
-
this.stmtToCallSitemap = new Map();
|
|
135
|
-
this.stmtToDynCallSitemap = new Map();
|
|
136
|
-
this.methodToCGNodeMap = new Map();
|
|
137
|
-
this.callPairToEdgeMap = new Map();
|
|
138
|
-
this.callSiteNum = 0;
|
|
139
|
-
this.scene = s;
|
|
140
|
-
this.cgStat = new Statistics_1.CGStat();
|
|
141
|
-
}
|
|
142
|
-
getCallPairString(srcID, dstID) {
|
|
143
|
-
return `${srcID}-${dstID}`;
|
|
144
|
-
}
|
|
145
|
-
getCallEdgeByPair(srcID, dstID) {
|
|
146
|
-
let key = this.getCallPairString(srcID, dstID);
|
|
147
|
-
return this.callPairToEdgeMap.get(key);
|
|
148
|
-
}
|
|
149
|
-
addCallGraphNode(method, kind = CallGraphNodeKind.real) {
|
|
150
|
-
let id = this.nodeNum;
|
|
151
|
-
let cgNode = new CallGraphNode(id, method, kind);
|
|
152
|
-
// check if sdk method
|
|
153
|
-
cgNode.setSdkMethod(this.scene.hasSdkFile(method.getDeclaringClassSignature().getDeclaringFileSignature()));
|
|
154
|
-
let arkMethod = this.scene.getMethod(method);
|
|
155
|
-
if (!arkMethod || !arkMethod.getCfg()) {
|
|
156
|
-
cgNode.isBlankMethod = true;
|
|
157
|
-
}
|
|
158
|
-
this.addNode(cgNode);
|
|
159
|
-
this.methodToCGNodeMap.set(method.toString(), cgNode.getID());
|
|
160
|
-
this.cgStat.addNodeStat(kind);
|
|
161
|
-
return cgNode;
|
|
162
|
-
}
|
|
163
|
-
removeCallGraphNode(nodeID) {
|
|
164
|
-
// remove edge relate to node first
|
|
165
|
-
this.removeCallGraphEdge(nodeID);
|
|
166
|
-
let node = this.getNode(nodeID);
|
|
167
|
-
// remove node itself
|
|
168
|
-
this.removeNode(nodeID);
|
|
169
|
-
this.methodToCGNodeMap.delete(node.getMethod().toString());
|
|
170
|
-
}
|
|
171
|
-
getCallGraphNodeByMethod(method) {
|
|
172
|
-
if (!method) {
|
|
173
|
-
throw new Error();
|
|
174
|
-
}
|
|
175
|
-
let n = this.methodToCGNodeMap.get(method.toString());
|
|
176
|
-
if (n === undefined) {
|
|
177
|
-
// The method can't be found
|
|
178
|
-
// means the method has no implementation, or base type is unclear to find it
|
|
179
|
-
// Create a virtual CG Node
|
|
180
|
-
// TODO: this virtual CG Node need be remove once the base type is clear
|
|
181
|
-
return this.addCallGraphNode(method, CallGraphNodeKind.vitual);
|
|
182
|
-
}
|
|
183
|
-
return this.getNode(n);
|
|
184
|
-
}
|
|
185
|
-
addDirectOrSpecialCallEdge(caller, callee, callStmt, isDirectCall = true) {
|
|
186
|
-
var _a;
|
|
187
|
-
let callerNode = this.getCallGraphNodeByMethod(caller);
|
|
188
|
-
let calleeNode = this.getCallGraphNodeByMethod(callee);
|
|
189
|
-
let args = (_a = callStmt.getInvokeExpr()) === null || _a === void 0 ? void 0 : _a.getArgs();
|
|
190
|
-
let cs = new CallSite(callStmt, args, calleeNode.getID(), callerNode.getID());
|
|
191
|
-
let csID;
|
|
192
|
-
if (!this.callSiteToIdMap.has(cs)) {
|
|
193
|
-
csID = this.callSiteNum++;
|
|
194
|
-
this.idToCallSiteMap.set(csID, cs);
|
|
195
|
-
this.callSiteToIdMap.set(cs, csID);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
csID = this.callSiteToIdMap.get(cs);
|
|
199
|
-
}
|
|
200
|
-
if (this.addStmtToCallSiteMap(callStmt, cs)) {
|
|
201
|
-
// TODO: check stmt exists
|
|
202
|
-
}
|
|
203
|
-
// TODO: check if edge exists
|
|
204
|
-
let callEdge = this.getCallEdgeByPair(callerNode.getID(), calleeNode.getID());
|
|
205
|
-
if (callEdge === undefined) {
|
|
206
|
-
callEdge = new CallGraphEdge(callerNode, calleeNode);
|
|
207
|
-
callEdge.getSrcNode().addOutgoingEdge(callEdge);
|
|
208
|
-
callEdge.getDstNode().addIncomingEdge(callEdge);
|
|
209
|
-
this.callPairToEdgeMap.set(this.getCallPairString(callerNode.getID(), calleeNode.getID()), callEdge);
|
|
210
|
-
}
|
|
211
|
-
if (isDirectCall) {
|
|
212
|
-
callEdge.addDirectCallSite(callStmt);
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
callEdge.addSpecialCallSite(callStmt);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
removeCallGraphEdge(nodeID) {
|
|
219
|
-
let node = this.getNode(nodeID);
|
|
220
|
-
for (const inEdge of node.getIncomingEdge()) {
|
|
221
|
-
node.removeIncomingEdge(inEdge);
|
|
222
|
-
}
|
|
223
|
-
for (const outEdge of node.getOutgoingEdges()) {
|
|
224
|
-
node.removeIncomingEdge(outEdge);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
addDynamicCallInfo(callStmt, caller, protentialCallee) {
|
|
228
|
-
var _a;
|
|
229
|
-
let callerNode = this.getCallGraphNodeByMethod(caller);
|
|
230
|
-
let calleeNode;
|
|
231
|
-
if (protentialCallee) {
|
|
232
|
-
calleeNode = this.getCallGraphNodeByMethod(protentialCallee);
|
|
233
|
-
}
|
|
234
|
-
let args = (_a = callStmt.getInvokeExpr()) === null || _a === void 0 ? void 0 : _a.getArgs();
|
|
235
|
-
let cs = new DynCallSite(callerNode.getID(), callStmt, args, calleeNode === null || calleeNode === void 0 ? void 0 : calleeNode.getID());
|
|
236
|
-
this.stmtToDynCallSitemap.set(callStmt, cs);
|
|
237
|
-
}
|
|
238
|
-
addDynamicCallEdge(callerID, calleeID, callStmt) {
|
|
239
|
-
let callerNode = this.getNode(callerID);
|
|
240
|
-
let calleeNode = this.getNode(calleeID);
|
|
241
|
-
let callEdge = this.getCallEdgeByPair(callerNode.getID(), calleeNode.getID());
|
|
242
|
-
if (callEdge === undefined) {
|
|
243
|
-
callEdge = new CallGraphEdge(callerNode, calleeNode);
|
|
244
|
-
callEdge.getSrcNode().addOutgoingEdge(callEdge);
|
|
245
|
-
callEdge.getDstNode().addIncomingEdge(callEdge);
|
|
246
|
-
this.callPairToEdgeMap.set(this.getCallPairString(callerNode.getID(), calleeNode.getID()), callEdge);
|
|
247
|
-
}
|
|
248
|
-
callEdge.addInDirectCallSite(callStmt);
|
|
249
|
-
}
|
|
250
|
-
getDynCallsiteByStmt(stmt) {
|
|
251
|
-
return this.stmtToDynCallSitemap.get(stmt);
|
|
252
|
-
}
|
|
253
|
-
addStmtToCallSiteMap(stmt, cs) {
|
|
254
|
-
if (this.stmtToCallSitemap.has(stmt)) {
|
|
255
|
-
return false;
|
|
256
|
-
}
|
|
257
|
-
this.stmtToCallSitemap.set(stmt, cs);
|
|
258
|
-
return true;
|
|
259
|
-
}
|
|
260
|
-
getCallSiteByStmt(stmt) {
|
|
261
|
-
return this.stmtToCallSitemap.get(stmt);
|
|
262
|
-
}
|
|
263
|
-
getDynEdges() {
|
|
264
|
-
let callMap = new Map();
|
|
265
|
-
this.callPairToEdgeMap.forEach((edge) => {
|
|
266
|
-
let srcMethod = edge.getSrcNode().getMethod();
|
|
267
|
-
let dstMethod = edge.getDstNode().getMethod();
|
|
268
|
-
let dstSet;
|
|
269
|
-
if (callMap.has(srcMethod)) {
|
|
270
|
-
dstSet = callMap.get(srcMethod);
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
dstSet = new Set();
|
|
274
|
-
}
|
|
275
|
-
callMap.set(srcMethod, dstSet.add(dstMethod));
|
|
276
|
-
});
|
|
277
|
-
return callMap;
|
|
278
|
-
}
|
|
279
|
-
getMethodByFuncID(id) {
|
|
280
|
-
let node = this.getNode(id);
|
|
281
|
-
if (node !== undefined) {
|
|
282
|
-
return node.getMethod();
|
|
283
|
-
}
|
|
284
|
-
//return undefined;
|
|
285
|
-
return null;
|
|
286
|
-
}
|
|
287
|
-
getArkMethodByFuncID(id) {
|
|
288
|
-
let method = this.getMethodByFuncID(id);
|
|
289
|
-
if (method != null) {
|
|
290
|
-
// TODO: SDK Method search
|
|
291
|
-
return this.scene.getMethod(method);
|
|
292
|
-
}
|
|
293
|
-
return null;
|
|
294
|
-
}
|
|
295
|
-
getEntries() {
|
|
296
|
-
return this.entries;
|
|
297
|
-
}
|
|
298
|
-
setEntries(n) {
|
|
299
|
-
this.entries = n;
|
|
300
|
-
}
|
|
301
|
-
dump(name, entry) {
|
|
302
|
-
let printer = new GraphPrinter_1.GraphPrinter(this);
|
|
303
|
-
if (entry) {
|
|
304
|
-
printer.setStartID(entry);
|
|
305
|
-
}
|
|
306
|
-
PrinterBuilder_1.PrinterBuilder.dump(printer, name);
|
|
307
|
-
}
|
|
308
|
-
detectReachable(fromID, dstID) {
|
|
309
|
-
let dWorklist = [];
|
|
310
|
-
let travserdFuncs = new Set();
|
|
311
|
-
dWorklist.push(fromID);
|
|
312
|
-
while (dWorklist.length > 0) {
|
|
313
|
-
let nodeID = dWorklist.shift();
|
|
314
|
-
if (travserdFuncs.has(nodeID)) {
|
|
315
|
-
continue;
|
|
316
|
-
}
|
|
317
|
-
travserdFuncs.add(nodeID);
|
|
318
|
-
let node = this.getNode(nodeID);
|
|
319
|
-
for (let e of node.getOutgoingEdges()) {
|
|
320
|
-
let dst = e.getDstID();
|
|
321
|
-
if (dst === dstID) {
|
|
322
|
-
return true;
|
|
323
|
-
}
|
|
324
|
-
dWorklist.push(dst);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
return false;
|
|
328
|
-
}
|
|
329
|
-
printStat() {
|
|
330
|
-
this.cgStat.printStat();
|
|
331
|
-
}
|
|
332
|
-
getStat() {
|
|
333
|
-
return this.cgStat.getStat();
|
|
334
|
-
}
|
|
335
|
-
setDummyMainFuncID(dummyMainMethodID) {
|
|
336
|
-
this.dummyMainMethodID = dummyMainMethodID;
|
|
337
|
-
}
|
|
338
|
-
getDummyMainFuncID() {
|
|
339
|
-
return this.dummyMainMethodID;
|
|
340
|
-
}
|
|
341
|
-
isUnknownMethod(funcID) {
|
|
342
|
-
let method = this.getMethodByFuncID(funcID);
|
|
343
|
-
if (method) {
|
|
344
|
-
if (!(method.getDeclaringClassSignature().getDeclaringFileSignature().getFileName() === Const_1.UNKNOWN_FILE_NAME)) {
|
|
345
|
-
return false;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
return true;
|
|
349
|
-
}
|
|
350
|
-
getGraphName() {
|
|
351
|
-
return 'CG';
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
exports.CallGraph = CallGraph;
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2024 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.CallGraph = exports.CallGraphNode = exports.CallGraphEdge = exports.CSCallSite = exports.DynCallSite = exports.CallSite = exports.CallGraphNodeKind = void 0;
|
|
18
|
+
const GraphPrinter_1 = require("../../save/GraphPrinter");
|
|
19
|
+
const PrinterBuilder_1 = require("../../save/PrinterBuilder");
|
|
20
|
+
const BaseExplicitGraph_1 = require("../../core/graph/BaseExplicitGraph");
|
|
21
|
+
const Statistics_1 = require("../common/Statistics");
|
|
22
|
+
const Const_1 = require("../../core/common/Const");
|
|
23
|
+
var CallGraphNodeKind;
|
|
24
|
+
(function (CallGraphNodeKind) {
|
|
25
|
+
CallGraphNodeKind[CallGraphNodeKind["real"] = 0] = "real";
|
|
26
|
+
CallGraphNodeKind[CallGraphNodeKind["vitual"] = 1] = "vitual";
|
|
27
|
+
CallGraphNodeKind[CallGraphNodeKind["intrinsic"] = 2] = "intrinsic";
|
|
28
|
+
CallGraphNodeKind[CallGraphNodeKind["constructor"] = 3] = "constructor";
|
|
29
|
+
})(CallGraphNodeKind = exports.CallGraphNodeKind || (exports.CallGraphNodeKind = {}));
|
|
30
|
+
class CallSite {
|
|
31
|
+
constructor(s, a, ce, cr) {
|
|
32
|
+
this.callStmt = s;
|
|
33
|
+
this.args = a;
|
|
34
|
+
this.calleeFuncID = ce;
|
|
35
|
+
this.callerFuncID = cr;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.CallSite = CallSite;
|
|
39
|
+
class DynCallSite {
|
|
40
|
+
constructor(caller, s, a, ptcCallee) {
|
|
41
|
+
this.callerFuncID = caller;
|
|
42
|
+
this.callStmt = s;
|
|
43
|
+
this.args = a;
|
|
44
|
+
this.protentialCalleeFuncID = ptcCallee;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.DynCallSite = DynCallSite;
|
|
48
|
+
class CSCallSite extends CallSite {
|
|
49
|
+
constructor(id, cs) {
|
|
50
|
+
super(cs.callStmt, cs.args, cs.calleeFuncID, cs.callerFuncID);
|
|
51
|
+
this.cid = id;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.CSCallSite = CSCallSite;
|
|
55
|
+
class CallGraphEdge extends BaseExplicitGraph_1.BaseEdge {
|
|
56
|
+
// private callSiteID: CallSiteID;
|
|
57
|
+
constructor(src, dst) {
|
|
58
|
+
super(src, dst, 0);
|
|
59
|
+
this.directCalls = new Set();
|
|
60
|
+
this.specialCalls = new Set();
|
|
61
|
+
this.indirectCalls = new Set();
|
|
62
|
+
}
|
|
63
|
+
addDirectCallSite(stmt) {
|
|
64
|
+
this.directCalls.add(stmt);
|
|
65
|
+
}
|
|
66
|
+
addSpecialCallSite(stmt) {
|
|
67
|
+
this.specialCalls.add(stmt);
|
|
68
|
+
}
|
|
69
|
+
addInDirectCallSite(stmt) {
|
|
70
|
+
this.indirectCalls.add(stmt);
|
|
71
|
+
}
|
|
72
|
+
getDotAttr() {
|
|
73
|
+
const indirectCallNums = this.indirectCalls.size;
|
|
74
|
+
const directCallNums = this.directCalls.size;
|
|
75
|
+
const specialCallNums = this.specialCalls.size;
|
|
76
|
+
if ([CallGraphNodeKind.intrinsic, CallGraphNodeKind.constructor].includes(this.getDstNode().getKind())) {
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
if (indirectCallNums !== 0 && directCallNums === 0) {
|
|
80
|
+
return "color=red";
|
|
81
|
+
}
|
|
82
|
+
else if (specialCallNums !== 0) {
|
|
83
|
+
return "color=yellow";
|
|
84
|
+
}
|
|
85
|
+
else if (indirectCallNums === 0 && directCallNums !== 0) {
|
|
86
|
+
return "color=black";
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return "color=black";
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.CallGraphEdge = CallGraphEdge;
|
|
94
|
+
class CallGraphNode extends BaseExplicitGraph_1.BaseNode {
|
|
95
|
+
constructor(id, m, k = CallGraphNodeKind.real) {
|
|
96
|
+
super(id, k);
|
|
97
|
+
this.ifSdkMethod = false;
|
|
98
|
+
this.isBlank = false;
|
|
99
|
+
this.method = m;
|
|
100
|
+
}
|
|
101
|
+
getMethod() {
|
|
102
|
+
return this.method;
|
|
103
|
+
}
|
|
104
|
+
setSdkMethod(v) {
|
|
105
|
+
this.ifSdkMethod = v;
|
|
106
|
+
}
|
|
107
|
+
isSdkMethod() {
|
|
108
|
+
return this.ifSdkMethod;
|
|
109
|
+
}
|
|
110
|
+
get isBlankMethod() {
|
|
111
|
+
return this.isBlank;
|
|
112
|
+
}
|
|
113
|
+
set isBlankMethod(is) {
|
|
114
|
+
this.isBlank = is;
|
|
115
|
+
}
|
|
116
|
+
getDotAttr() {
|
|
117
|
+
if ([CallGraphNodeKind.intrinsic, CallGraphNodeKind.constructor].includes(this.getKind())) {
|
|
118
|
+
return '';
|
|
119
|
+
}
|
|
120
|
+
return 'shape=box';
|
|
121
|
+
}
|
|
122
|
+
getDotLabel() {
|
|
123
|
+
let label = 'ID: ' + this.getID() + '\n';
|
|
124
|
+
label = label + this.getMethod().toString();
|
|
125
|
+
return label;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.CallGraphNode = CallGraphNode;
|
|
129
|
+
class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
130
|
+
constructor(s) {
|
|
131
|
+
super();
|
|
132
|
+
this.idToCallSiteMap = new Map();
|
|
133
|
+
this.callSiteToIdMap = new Map();
|
|
134
|
+
this.stmtToCallSitemap = new Map();
|
|
135
|
+
this.stmtToDynCallSitemap = new Map();
|
|
136
|
+
this.methodToCGNodeMap = new Map();
|
|
137
|
+
this.callPairToEdgeMap = new Map();
|
|
138
|
+
this.callSiteNum = 0;
|
|
139
|
+
this.scene = s;
|
|
140
|
+
this.cgStat = new Statistics_1.CGStat();
|
|
141
|
+
}
|
|
142
|
+
getCallPairString(srcID, dstID) {
|
|
143
|
+
return `${srcID}-${dstID}`;
|
|
144
|
+
}
|
|
145
|
+
getCallEdgeByPair(srcID, dstID) {
|
|
146
|
+
let key = this.getCallPairString(srcID, dstID);
|
|
147
|
+
return this.callPairToEdgeMap.get(key);
|
|
148
|
+
}
|
|
149
|
+
addCallGraphNode(method, kind = CallGraphNodeKind.real) {
|
|
150
|
+
let id = this.nodeNum;
|
|
151
|
+
let cgNode = new CallGraphNode(id, method, kind);
|
|
152
|
+
// check if sdk method
|
|
153
|
+
cgNode.setSdkMethod(this.scene.hasSdkFile(method.getDeclaringClassSignature().getDeclaringFileSignature()));
|
|
154
|
+
let arkMethod = this.scene.getMethod(method);
|
|
155
|
+
if (!arkMethod || !arkMethod.getCfg()) {
|
|
156
|
+
cgNode.isBlankMethod = true;
|
|
157
|
+
}
|
|
158
|
+
this.addNode(cgNode);
|
|
159
|
+
this.methodToCGNodeMap.set(method.toString(), cgNode.getID());
|
|
160
|
+
this.cgStat.addNodeStat(kind);
|
|
161
|
+
return cgNode;
|
|
162
|
+
}
|
|
163
|
+
removeCallGraphNode(nodeID) {
|
|
164
|
+
// remove edge relate to node first
|
|
165
|
+
this.removeCallGraphEdge(nodeID);
|
|
166
|
+
let node = this.getNode(nodeID);
|
|
167
|
+
// remove node itself
|
|
168
|
+
this.removeNode(nodeID);
|
|
169
|
+
this.methodToCGNodeMap.delete(node.getMethod().toString());
|
|
170
|
+
}
|
|
171
|
+
getCallGraphNodeByMethod(method) {
|
|
172
|
+
if (!method) {
|
|
173
|
+
throw new Error();
|
|
174
|
+
}
|
|
175
|
+
let n = this.methodToCGNodeMap.get(method.toString());
|
|
176
|
+
if (n === undefined) {
|
|
177
|
+
// The method can't be found
|
|
178
|
+
// means the method has no implementation, or base type is unclear to find it
|
|
179
|
+
// Create a virtual CG Node
|
|
180
|
+
// TODO: this virtual CG Node need be remove once the base type is clear
|
|
181
|
+
return this.addCallGraphNode(method, CallGraphNodeKind.vitual);
|
|
182
|
+
}
|
|
183
|
+
return this.getNode(n);
|
|
184
|
+
}
|
|
185
|
+
addDirectOrSpecialCallEdge(caller, callee, callStmt, isDirectCall = true) {
|
|
186
|
+
var _a;
|
|
187
|
+
let callerNode = this.getCallGraphNodeByMethod(caller);
|
|
188
|
+
let calleeNode = this.getCallGraphNodeByMethod(callee);
|
|
189
|
+
let args = (_a = callStmt.getInvokeExpr()) === null || _a === void 0 ? void 0 : _a.getArgs();
|
|
190
|
+
let cs = new CallSite(callStmt, args, calleeNode.getID(), callerNode.getID());
|
|
191
|
+
let csID;
|
|
192
|
+
if (!this.callSiteToIdMap.has(cs)) {
|
|
193
|
+
csID = this.callSiteNum++;
|
|
194
|
+
this.idToCallSiteMap.set(csID, cs);
|
|
195
|
+
this.callSiteToIdMap.set(cs, csID);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
csID = this.callSiteToIdMap.get(cs);
|
|
199
|
+
}
|
|
200
|
+
if (this.addStmtToCallSiteMap(callStmt, cs)) {
|
|
201
|
+
// TODO: check stmt exists
|
|
202
|
+
}
|
|
203
|
+
// TODO: check if edge exists
|
|
204
|
+
let callEdge = this.getCallEdgeByPair(callerNode.getID(), calleeNode.getID());
|
|
205
|
+
if (callEdge === undefined) {
|
|
206
|
+
callEdge = new CallGraphEdge(callerNode, calleeNode);
|
|
207
|
+
callEdge.getSrcNode().addOutgoingEdge(callEdge);
|
|
208
|
+
callEdge.getDstNode().addIncomingEdge(callEdge);
|
|
209
|
+
this.callPairToEdgeMap.set(this.getCallPairString(callerNode.getID(), calleeNode.getID()), callEdge);
|
|
210
|
+
}
|
|
211
|
+
if (isDirectCall) {
|
|
212
|
+
callEdge.addDirectCallSite(callStmt);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
callEdge.addSpecialCallSite(callStmt);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
removeCallGraphEdge(nodeID) {
|
|
219
|
+
let node = this.getNode(nodeID);
|
|
220
|
+
for (const inEdge of node.getIncomingEdge()) {
|
|
221
|
+
node.removeIncomingEdge(inEdge);
|
|
222
|
+
}
|
|
223
|
+
for (const outEdge of node.getOutgoingEdges()) {
|
|
224
|
+
node.removeIncomingEdge(outEdge);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
addDynamicCallInfo(callStmt, caller, protentialCallee) {
|
|
228
|
+
var _a;
|
|
229
|
+
let callerNode = this.getCallGraphNodeByMethod(caller);
|
|
230
|
+
let calleeNode;
|
|
231
|
+
if (protentialCallee) {
|
|
232
|
+
calleeNode = this.getCallGraphNodeByMethod(protentialCallee);
|
|
233
|
+
}
|
|
234
|
+
let args = (_a = callStmt.getInvokeExpr()) === null || _a === void 0 ? void 0 : _a.getArgs();
|
|
235
|
+
let cs = new DynCallSite(callerNode.getID(), callStmt, args, calleeNode === null || calleeNode === void 0 ? void 0 : calleeNode.getID());
|
|
236
|
+
this.stmtToDynCallSitemap.set(callStmt, cs);
|
|
237
|
+
}
|
|
238
|
+
addDynamicCallEdge(callerID, calleeID, callStmt) {
|
|
239
|
+
let callerNode = this.getNode(callerID);
|
|
240
|
+
let calleeNode = this.getNode(calleeID);
|
|
241
|
+
let callEdge = this.getCallEdgeByPair(callerNode.getID(), calleeNode.getID());
|
|
242
|
+
if (callEdge === undefined) {
|
|
243
|
+
callEdge = new CallGraphEdge(callerNode, calleeNode);
|
|
244
|
+
callEdge.getSrcNode().addOutgoingEdge(callEdge);
|
|
245
|
+
callEdge.getDstNode().addIncomingEdge(callEdge);
|
|
246
|
+
this.callPairToEdgeMap.set(this.getCallPairString(callerNode.getID(), calleeNode.getID()), callEdge);
|
|
247
|
+
}
|
|
248
|
+
callEdge.addInDirectCallSite(callStmt);
|
|
249
|
+
}
|
|
250
|
+
getDynCallsiteByStmt(stmt) {
|
|
251
|
+
return this.stmtToDynCallSitemap.get(stmt);
|
|
252
|
+
}
|
|
253
|
+
addStmtToCallSiteMap(stmt, cs) {
|
|
254
|
+
if (this.stmtToCallSitemap.has(stmt)) {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
this.stmtToCallSitemap.set(stmt, cs);
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
getCallSiteByStmt(stmt) {
|
|
261
|
+
return this.stmtToCallSitemap.get(stmt);
|
|
262
|
+
}
|
|
263
|
+
getDynEdges() {
|
|
264
|
+
let callMap = new Map();
|
|
265
|
+
this.callPairToEdgeMap.forEach((edge) => {
|
|
266
|
+
let srcMethod = edge.getSrcNode().getMethod();
|
|
267
|
+
let dstMethod = edge.getDstNode().getMethod();
|
|
268
|
+
let dstSet;
|
|
269
|
+
if (callMap.has(srcMethod)) {
|
|
270
|
+
dstSet = callMap.get(srcMethod);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
dstSet = new Set();
|
|
274
|
+
}
|
|
275
|
+
callMap.set(srcMethod, dstSet.add(dstMethod));
|
|
276
|
+
});
|
|
277
|
+
return callMap;
|
|
278
|
+
}
|
|
279
|
+
getMethodByFuncID(id) {
|
|
280
|
+
let node = this.getNode(id);
|
|
281
|
+
if (node !== undefined) {
|
|
282
|
+
return node.getMethod();
|
|
283
|
+
}
|
|
284
|
+
//return undefined;
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
getArkMethodByFuncID(id) {
|
|
288
|
+
let method = this.getMethodByFuncID(id);
|
|
289
|
+
if (method != null) {
|
|
290
|
+
// TODO: SDK Method search
|
|
291
|
+
return this.scene.getMethod(method);
|
|
292
|
+
}
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
getEntries() {
|
|
296
|
+
return this.entries;
|
|
297
|
+
}
|
|
298
|
+
setEntries(n) {
|
|
299
|
+
this.entries = n;
|
|
300
|
+
}
|
|
301
|
+
dump(name, entry) {
|
|
302
|
+
let printer = new GraphPrinter_1.GraphPrinter(this);
|
|
303
|
+
if (entry) {
|
|
304
|
+
printer.setStartID(entry);
|
|
305
|
+
}
|
|
306
|
+
PrinterBuilder_1.PrinterBuilder.dump(printer, name);
|
|
307
|
+
}
|
|
308
|
+
detectReachable(fromID, dstID) {
|
|
309
|
+
let dWorklist = [];
|
|
310
|
+
let travserdFuncs = new Set();
|
|
311
|
+
dWorklist.push(fromID);
|
|
312
|
+
while (dWorklist.length > 0) {
|
|
313
|
+
let nodeID = dWorklist.shift();
|
|
314
|
+
if (travserdFuncs.has(nodeID)) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
travserdFuncs.add(nodeID);
|
|
318
|
+
let node = this.getNode(nodeID);
|
|
319
|
+
for (let e of node.getOutgoingEdges()) {
|
|
320
|
+
let dst = e.getDstID();
|
|
321
|
+
if (dst === dstID) {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
dWorklist.push(dst);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
printStat() {
|
|
330
|
+
this.cgStat.printStat();
|
|
331
|
+
}
|
|
332
|
+
getStat() {
|
|
333
|
+
return this.cgStat.getStat();
|
|
334
|
+
}
|
|
335
|
+
setDummyMainFuncID(dummyMainMethodID) {
|
|
336
|
+
this.dummyMainMethodID = dummyMainMethodID;
|
|
337
|
+
}
|
|
338
|
+
getDummyMainFuncID() {
|
|
339
|
+
return this.dummyMainMethodID;
|
|
340
|
+
}
|
|
341
|
+
isUnknownMethod(funcID) {
|
|
342
|
+
let method = this.getMethodByFuncID(funcID);
|
|
343
|
+
if (method) {
|
|
344
|
+
if (!(method.getDeclaringClassSignature().getDeclaringFileSignature().getFileName() === Const_1.UNKNOWN_FILE_NAME)) {
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
getGraphName() {
|
|
351
|
+
return 'CG';
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
exports.CallGraph = CallGraph;
|