arkanalyzer 1.0.86 → 1.0.87
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/README.en.md +69 -65
- package/README.md +56 -70
- package/config/arkanalyzer.json +7 -2
- package/docs/cppFrontend/ArkAnalyzer-cpp_usage_guide.md +245 -0
- package/docs/cppFrontend/cpp_frontend_build_guide.md +126 -0
- package/docs/cppFrontend/cpp_frontend_user_guide.md +175 -0
- package/docs/cppFrontend/img.png +0 -0
- package/docs/cppFrontend/img_1.png +0 -0
- package/docs/cppFrontend/img_10.png +0 -0
- package/docs/cppFrontend/img_11.png +0 -0
- package/docs/cppFrontend/img_12.png +0 -0
- package/docs/cppFrontend/img_13.png +0 -0
- package/docs/cppFrontend/img_14.png +0 -0
- package/docs/cppFrontend/img_15.png +0 -0
- package/docs/cppFrontend/img_16.png +0 -0
- package/docs/cppFrontend/img_17.png +0 -0
- package/docs/cppFrontend/img_18.png +0 -0
- package/docs/cppFrontend/img_19.png +0 -0
- package/docs/cppFrontend/img_2.png +0 -0
- package/docs/cppFrontend/img_20.png +0 -0
- package/docs/cppFrontend/img_21.png +0 -0
- package/docs/cppFrontend/img_22.png +0 -0
- package/docs/cppFrontend/img_23.png +0 -0
- package/docs/cppFrontend/img_3.png +0 -0
- package/docs/cppFrontend/img_4.png +0 -0
- package/docs/cppFrontend/img_5.png +0 -0
- package/docs/cppFrontend/img_6.png +0 -0
- package/docs/cppFrontend/img_7.png +0 -0
- package/docs/cppFrontend/img_8.png +0 -0
- package/docs/cppFrontend/img_9.png +0 -0
- package/docs/sig_programanalysis.en.md +66 -0
- package/docs/sig_programanalysis.md +73 -0
- package/lib/Config.d.ts +32 -1
- package/lib/Config.d.ts.map +1 -1
- package/lib/Config.js +76 -2
- package/lib/Scene.d.ts +25 -2
- package/lib/Scene.d.ts.map +1 -1
- package/lib/Scene.js +148 -40
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +4 -3
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/AbstractAnalysis.js +17 -17
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +6 -1
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts.map +1 -1
- package/lib/callgraph/algorithm/RapidTypeAnalysis.js +117 -14
- package/lib/callgraph/common/Statistics.d.ts +4 -2
- package/lib/callgraph/common/Statistics.d.ts.map +1 -1
- package/lib/callgraph/common/Statistics.js +14 -2
- package/lib/callgraph/model/CallGraph.d.ts +12 -8
- package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
- package/lib/callgraph/model/CallGraph.js +53 -29
- package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +1 -0
- package/lib/callgraph/model/builder/CallGraphBuilder.d.ts.map +1 -1
- package/lib/callgraph/model/builder/CallGraphBuilder.js +5 -1
- package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.js +3 -0
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +4 -2
- package/lib/cli/cli.d.ts +3 -0
- package/lib/cli/cli.d.ts.map +1 -0
- package/lib/cli/cli.js +82 -0
- package/lib/cli/commands/cg.d.ts +32 -0
- package/lib/cli/commands/cg.d.ts.map +1 -0
- package/lib/cli/commands/cg.js +401 -0
- package/lib/cli/commands/index.d.ts +6 -0
- package/lib/cli/commands/index.d.ts.map +1 -0
- package/lib/cli/commands/index.js +64 -0
- package/lib/cli/commands/ir.d.ts +26 -0
- package/lib/cli/commands/ir.d.ts.map +1 -0
- package/lib/cli/commands/ir.js +94 -0
- package/lib/core/base/Constant.d.ts +1 -1
- package/lib/core/base/Constant.d.ts.map +1 -1
- package/lib/core/base/Constant.js +1 -1
- package/lib/core/base/Expr.d.ts +29 -5
- package/lib/core/base/Expr.d.ts.map +1 -1
- package/lib/core/base/Expr.js +144 -22
- package/lib/core/base/Position.d.ts +14 -0
- package/lib/core/base/Position.d.ts.map +1 -1
- package/lib/core/base/Position.js +27 -0
- package/lib/core/base/Ref.d.ts +1 -0
- package/lib/core/base/Ref.d.ts.map +1 -1
- package/lib/core/base/Ref.js +4 -1
- package/lib/core/base/Type.d.ts +64 -24
- package/lib/core/base/Type.d.ts.map +1 -1
- package/lib/core/base/Type.js +144 -49
- package/lib/core/common/ArkError.d.ts +26 -2
- package/lib/core/common/ArkError.d.ts.map +1 -1
- package/lib/core/common/ArkError.js +56 -2
- package/lib/core/common/ArkIRTransformer.d.ts +11 -10
- package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
- package/lib/core/common/ArkIRTransformer.js +1 -1
- package/lib/core/common/ArkValueTransformer.d.ts +14 -12
- package/lib/core/common/ArkValueTransformer.d.ts.map +1 -1
- package/lib/core/common/ArkValueTransformer.js +1 -5
- package/lib/core/common/Const.d.ts +3 -0
- package/lib/core/common/Const.d.ts.map +1 -1
- package/lib/core/common/Const.js +4 -1
- package/lib/core/common/DummyMainCreater.d.ts +23 -13
- package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
- package/lib/core/common/DummyMainCreater.js +66 -43
- package/lib/core/common/EtsConst.d.ts +11 -0
- package/lib/core/common/EtsConst.d.ts.map +1 -1
- package/lib/core/common/EtsConst.js +12 -1
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +5 -1
- package/lib/core/common/ModelUtils.d.ts +4 -7
- package/lib/core/common/ModelUtils.d.ts.map +1 -1
- package/lib/core/common/ModelUtils.js +77 -110
- package/lib/core/common/SdkUtils.d.ts +1 -1
- package/lib/core/common/SdkUtils.d.ts.map +1 -1
- package/lib/core/common/SdkUtils.js +14 -5
- package/lib/core/common/TypeInference.d.ts.map +1 -1
- package/lib/core/common/TypeInference.js +9 -3
- package/lib/core/graph/BaseExplicitGraph.d.ts +4 -4
- package/lib/core/graph/BaseExplicitGraph.d.ts.map +1 -1
- package/lib/core/graph/BaseExplicitGraph.js +15 -8
- package/lib/core/graph/BasicBlock.d.ts.map +1 -1
- package/lib/core/graph/Scc.d.ts.map +1 -1
- package/lib/core/graph/Scc.js +7 -2
- package/lib/core/graph/builder/CfgBuilder.d.ts +10 -7
- package/lib/core/graph/builder/CfgBuilder.d.ts.map +1 -1
- package/lib/core/graph/builder/CfgBuilder.js +12 -5
- package/lib/core/inference/Inference.d.ts.map +1 -1
- package/lib/core/inference/Inference.js +7 -0
- package/lib/core/inference/ModelInference.d.ts +1 -1
- package/lib/core/inference/ModelInference.d.ts.map +1 -1
- package/lib/core/inference/ValueInference.d.ts +3 -2
- package/lib/core/inference/ValueInference.d.ts.map +1 -1
- package/lib/core/inference/ValueInference.js +64 -12
- package/lib/core/inference/abc/AbcInference.d.ts +28 -2
- package/lib/core/inference/abc/AbcInference.d.ts.map +1 -1
- package/lib/core/inference/abc/AbcInference.js +105 -4
- package/lib/core/model/ArkBaseModel.d.ts +14 -1
- package/lib/core/model/ArkBaseModel.d.ts.map +1 -1
- package/lib/core/model/ArkBaseModel.js +61 -2
- package/lib/core/model/ArkBody.d.ts.map +1 -1
- package/lib/core/model/ArkBody.js +1 -3
- package/lib/core/model/ArkClass.d.ts +22 -2
- package/lib/core/model/ArkClass.d.ts.map +1 -1
- package/lib/core/model/ArkClass.js +59 -28
- package/lib/core/model/ArkField.d.ts.map +1 -1
- package/lib/core/model/ArkField.js +3 -1
- package/lib/core/model/ArkFile.d.ts +4 -1
- package/lib/core/model/ArkFile.d.ts.map +1 -1
- package/lib/core/model/ArkFile.js +44 -3
- package/lib/core/model/ArkImport.d.ts.map +1 -1
- package/lib/core/model/ArkImport.js +9 -1
- package/lib/core/model/ArkMethod.d.ts +5 -0
- package/lib/core/model/ArkMethod.d.ts.map +1 -1
- package/lib/core/model/ArkMethod.js +33 -1
- package/lib/core/model/ArkNamespace.d.ts +2 -0
- package/lib/core/model/ArkNamespace.d.ts.map +1 -1
- package/lib/core/model/ArkNamespace.js +11 -0
- package/lib/core/model/ArkSignature.d.ts +3 -3
- package/lib/core/model/ArkSignature.d.ts.map +1 -1
- package/lib/core/model/ArkSignature.js +14 -9
- package/lib/core/model/builder/ArkClassBuilder.d.ts +2 -0
- package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkClassBuilder.js +3 -3
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +4 -1
- package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkMethodBuilder.js +19 -6
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts +1 -0
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkNamespaceBuilder.js +2 -1
- package/lib/core/model/builder/BodyBuilder.d.ts +4 -0
- package/lib/core/model/builder/BodyBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/builderUtils.d.ts +1 -0
- package/lib/core/model/builder/builderUtils.d.ts.map +1 -1
- package/lib/core/model/builder/builderUtils.js +7 -3
- package/lib/frontend/cppFrontend/ast/ArkCxxAstNode.d.ts +296 -0
- package/lib/frontend/cppFrontend/ast/ArkCxxAstNode.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/ArkCxxAstNode.js +145 -0
- package/lib/frontend/cppFrontend/ast/astUtils.d.ts +51 -0
- package/lib/frontend/cppFrontend/ast/astUtils.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/astUtils.js +470 -0
- package/lib/frontend/cppFrontend/ast/const.d.ts +30 -0
- package/lib/frontend/cppFrontend/ast/const.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/const.js +134 -0
- package/lib/frontend/cppFrontend/base/Constant.d.ts +9 -0
- package/lib/frontend/cppFrontend/base/Constant.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/base/Constant.js +33 -0
- package/lib/frontend/cppFrontend/base/Expr.d.ts +174 -0
- package/lib/frontend/cppFrontend/base/Expr.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/base/Expr.js +530 -0
- package/lib/frontend/cppFrontend/base/Ref.d.ts +25 -0
- package/lib/frontend/cppFrontend/base/Ref.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/base/Ref.js +53 -0
- package/lib/frontend/cppFrontend/base/Trap.d.ts +8 -0
- package/lib/frontend/cppFrontend/base/Trap.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/base/Trap.js +28 -0
- package/lib/frontend/cppFrontend/base/Type.d.ts +264 -0
- package/lib/frontend/cppFrontend/base/Type.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/base/Type.js +600 -0
- package/lib/frontend/cppFrontend/common/ArkIRTransformer.d.ts +109 -0
- package/lib/frontend/cppFrontend/common/ArkIRTransformer.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/ArkIRTransformer.js +925 -0
- package/lib/frontend/cppFrontend/common/ArkValueTransformer.d.ts +477 -0
- package/lib/frontend/cppFrontend/common/ArkValueTransformer.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/ArkValueTransformer.js +2746 -0
- package/lib/frontend/cppFrontend/common/Builtin.d.ts +57 -0
- package/lib/frontend/cppFrontend/common/Builtin.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/Builtin.js +106 -0
- package/lib/frontend/cppFrontend/common/IRInference.d.ts +94 -0
- package/lib/frontend/cppFrontend/common/IRInference.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/IRInference.js +1087 -0
- package/lib/frontend/cppFrontend/common/IRUtils.d.ts +23 -0
- package/lib/frontend/cppFrontend/common/IRUtils.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/IRUtils.js +168 -0
- package/lib/frontend/cppFrontend/common/ModelUtils.d.ts +44 -0
- package/lib/frontend/cppFrontend/common/ModelUtils.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/ModelUtils.js +567 -0
- package/lib/frontend/cppFrontend/common/TypeInference.d.ts +278 -0
- package/lib/frontend/cppFrontend/common/TypeInference.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/TypeInference.js +1354 -0
- package/lib/frontend/cppFrontend/common/ValueUtil.d.ts +16 -0
- package/lib/frontend/cppFrontend/common/ValueUtil.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/common/ValueUtil.js +61 -0
- package/lib/frontend/cppFrontend/graph/builder/CfgBuilder.d.ts +182 -0
- package/lib/frontend/cppFrontend/graph/builder/CfgBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/graph/builder/CfgBuilder.js +1435 -0
- package/lib/frontend/cppFrontend/graph/builder/ConditionBuilder.d.ts +21 -0
- package/lib/frontend/cppFrontend/graph/builder/ConditionBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/graph/builder/ConditionBuilder.js +303 -0
- package/lib/frontend/cppFrontend/graph/builder/IfBuilder.d.ts +15 -0
- package/lib/frontend/cppFrontend/graph/builder/IfBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/graph/builder/IfBuilder.js +161 -0
- package/lib/frontend/cppFrontend/graph/builder/LoopBuilder.d.ts +21 -0
- package/lib/frontend/cppFrontend/graph/builder/LoopBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/graph/builder/LoopBuilder.js +261 -0
- package/lib/frontend/cppFrontend/graph/builder/SwitchBuilder.d.ts +12 -0
- package/lib/frontend/cppFrontend/graph/builder/SwitchBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/graph/builder/SwitchBuilder.js +155 -0
- package/lib/frontend/cppFrontend/graph/builder/TrapBuilder.d.ts +29 -0
- package/lib/frontend/cppFrontend/graph/builder/TrapBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/graph/builder/TrapBuilder.js +302 -0
- package/lib/frontend/cppFrontend/inference/CxxInference.d.ts +10 -0
- package/lib/frontend/cppFrontend/inference/CxxInference.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/inference/CxxInference.js +41 -0
- package/lib/frontend/cppFrontend/inference/CxxModelInference.d.ts +28 -0
- package/lib/frontend/cppFrontend/inference/CxxModelInference.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/inference/CxxModelInference.js +98 -0
- package/lib/frontend/cppFrontend/inference/CxxValueInference.d.ts +20 -0
- package/lib/frontend/cppFrontend/inference/CxxValueInference.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/inference/CxxValueInference.js +128 -0
- package/lib/frontend/cppFrontend/model/builder/ArkClassBuilder.d.ts +11 -0
- package/lib/frontend/cppFrontend/model/builder/ArkClassBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/ArkClassBuilder.js +413 -0
- package/lib/frontend/cppFrontend/model/builder/ArkFieldBuilder.d.ts +5 -0
- package/lib/frontend/cppFrontend/model/builder/ArkFieldBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/ArkFieldBuilder.js +61 -0
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.d.ts +17 -0
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.js +285 -0
- package/lib/frontend/cppFrontend/model/builder/ArkImportBuilder.d.ts +6 -0
- package/lib/frontend/cppFrontend/model/builder/ArkImportBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/ArkImportBuilder.js +57 -0
- package/lib/frontend/cppFrontend/model/builder/ArkMethodBuilder.d.ts +14 -0
- package/lib/frontend/cppFrontend/model/builder/ArkMethodBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/ArkMethodBuilder.js +422 -0
- package/lib/frontend/cppFrontend/model/builder/ArkNamespaceBuilder.d.ts +8 -0
- package/lib/frontend/cppFrontend/model/builder/ArkNamespaceBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/ArkNamespaceBuilder.js +194 -0
- package/lib/frontend/cppFrontend/model/builder/BodyBuilder.d.ts +59 -0
- package/lib/frontend/cppFrontend/model/builder/BodyBuilder.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/BodyBuilder.js +605 -0
- package/lib/frontend/cppFrontend/model/builder/builderUtils.d.ts +46 -0
- package/lib/frontend/cppFrontend/model/builder/builderUtils.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/model/builder/builderUtils.js +499 -0
- package/lib/frontend/cppFrontend/utils/cmakeUtils.d.ts +44 -0
- package/lib/frontend/cppFrontend/utils/cmakeUtils.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/utils/cmakeUtils.js +240 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -1
- package/lib/node_modules/ohos-typescript/.ohos-typescript-version +1 -0
- package/{node_modules → lib/node_modules}/ohos-typescript/package.json +2 -1
- package/lib/save/CGJsonPrinter.d.ts +8 -0
- package/lib/save/CGJsonPrinter.d.ts.map +1 -0
- package/lib/save/CGJsonPrinter.js +41 -0
- package/lib/save/GraphPrinter.js +2 -2
- package/lib/save/json/JsonDto.d.ts +86 -2
- package/lib/save/json/JsonDto.d.ts.map +1 -1
- package/lib/save/json/JsonSerialization.d.ts +1 -1
- package/lib/save/json/JsonSerialization.d.ts.map +1 -1
- package/lib/save/json/JsonSerialization.js +235 -145
- package/lib/save/source/SourceTransformer.d.ts.map +1 -1
- package/lib/save/source/SourceTransformer.js +0 -3
- package/lib/utils/CxxSceneUtils.d.ts +11 -0
- package/lib/utils/CxxSceneUtils.d.ts.map +1 -0
- package/lib/utils/CxxSceneUtils.js +178 -0
- package/lib/utils/FileUtils.d.ts +7 -8
- package/lib/utils/FileUtils.d.ts.map +1 -1
- package/lib/utils/FileUtils.js +27 -45
- package/lib/utils/LRUCacheDecorator.d.ts +20 -0
- package/lib/utils/LRUCacheDecorator.d.ts.map +1 -0
- package/lib/utils/LRUCacheDecorator.js +89 -0
- package/lib/utils/ModuleUtils.d.ts +39 -0
- package/lib/utils/ModuleUtils.d.ts.map +1 -0
- package/lib/utils/ModuleUtils.js +261 -0
- package/package.json +10 -7
- /package/{node_modules → lib/node_modules}/ohos-typescript/LICENSE +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/README.OpenSource +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/README.md +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/SECURITY.md +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/ThirdPartyNoticeText.txt +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/bin/tsc +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/bin/tsserver +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/README.md +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/cancellationToken.js +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/cs/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/de/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/es/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/fr/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/it/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/ja/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/ko/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.dom.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.dom.iterable.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.collection.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.core.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.generator.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.iterable.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.promise.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.proxy.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.reflect.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.symbol.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2016.array.include.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2016.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2016.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2017.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2017.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2017.intl.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2017.object.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2017.sharedmemory.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2017.string.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2017.typedarrays.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2018.asynciterable.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2018.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2018.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2018.intl.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2018.promise.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2018.regexp.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2019.array.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2019.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2019.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2019.intl.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2019.object.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2019.string.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2019.symbol.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.bigint.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.date.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.intl.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.number.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.promise.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.sharedmemory.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.string.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2021.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2021.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2021.intl.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2021.promise.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2021.string.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2021.weakref.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.array.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.error.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.intl.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.object.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.sharedmemory.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es2022.string.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es5.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.es6.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.esnext.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.esnext.full.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.esnext.intl.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.scripthost.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.webworker.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.webworker.importscripts.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/lib.webworker.iterable.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/pl/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/pt-br/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/ru/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/tr/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/tsc.js +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/tsserver.js +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/tsserverlibrary.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/tsserverlibrary.js +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/typesMap.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/typescript.d.ts +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/typescript.js +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/typingsInstaller.js +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/watchGuard.js +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -0
- /package/{node_modules → lib/node_modules}/ohos-typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -0
|
@@ -38,13 +38,16 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
38
38
|
};
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
40
|
exports.AbstractAnalysis = void 0;
|
|
41
|
+
const Expr_1 = require("../../core/base/Expr");
|
|
42
|
+
const Stmt_1 = require("../../core/base/Stmt");
|
|
41
43
|
const Type_1 = require("../../core/base/Type");
|
|
42
44
|
const logger_1 = __importStar(require("../../utils/logger"));
|
|
45
|
+
const IntWorkList_1 = require("../../utils/IntWorkList");
|
|
43
46
|
const PtsDS_1 = require("../pointerAnalysis/PtsDS");
|
|
44
47
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'CG');
|
|
45
48
|
class AbstractAnalysis {
|
|
46
49
|
constructor(s, cg) {
|
|
47
|
-
this.workList =
|
|
50
|
+
this.workList = new IntWorkList_1.IntWorkList();
|
|
48
51
|
this.classHierarchyCache = new Map();
|
|
49
52
|
this.scene = s;
|
|
50
53
|
this.cg = cg;
|
|
@@ -84,8 +87,8 @@ class AbstractAnalysis {
|
|
|
84
87
|
}
|
|
85
88
|
start(displayGeneratedMethod) {
|
|
86
89
|
this.init();
|
|
87
|
-
while (this.workList.
|
|
88
|
-
const method = this.workList.
|
|
90
|
+
while (!this.workList.isEmpty()) {
|
|
91
|
+
const method = this.workList.pop();
|
|
89
92
|
const cgNode = this.cg.getNode(method);
|
|
90
93
|
if (this.processedMethod.contains(method) || cgNode.isSdkMethod()) {
|
|
91
94
|
continue;
|
|
@@ -94,9 +97,7 @@ class AbstractAnalysis {
|
|
|
94
97
|
this.preProcessMethod(method).forEach((cs) => {
|
|
95
98
|
this.workList.push(cs.calleeFuncID);
|
|
96
99
|
});
|
|
97
|
-
this.processMethod(method
|
|
98
|
-
this.processCallSite(method, cs, displayGeneratedMethod);
|
|
99
|
-
});
|
|
100
|
+
this.processMethod(method, displayGeneratedMethod, false);
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
103
|
projectStart(displayGeneratedMethod) {
|
|
@@ -107,9 +108,7 @@ class AbstractAnalysis {
|
|
|
107
108
|
continue;
|
|
108
109
|
}
|
|
109
110
|
this.preProcessMethod(cgNode.getID());
|
|
110
|
-
this.processMethod(cgNode.getID()
|
|
111
|
-
this.processCallSite(cgNode.getID(), cs, displayGeneratedMethod, true);
|
|
112
|
-
});
|
|
111
|
+
this.processMethod(cgNode.getID(), displayGeneratedMethod, true);
|
|
113
112
|
}
|
|
114
113
|
this.cgBuilder.setEntries();
|
|
115
114
|
}
|
|
@@ -136,27 +135,28 @@ class AbstractAnalysis {
|
|
|
136
135
|
this.workList.push(entryFunc);
|
|
137
136
|
});
|
|
138
137
|
}
|
|
139
|
-
processMethod(methodID) {
|
|
138
|
+
processMethod(methodID, displayGeneratedMethod, isProject = false) {
|
|
140
139
|
let cgNode = this.cg.getNode(methodID);
|
|
141
140
|
let arkMethod = this.scene.getMethod(cgNode.getMethod(), true);
|
|
142
|
-
let calleeMethods = [];
|
|
143
141
|
if (!arkMethod) {
|
|
144
142
|
throw new Error('can not find method');
|
|
145
143
|
}
|
|
146
144
|
const cfg = arkMethod.getCfg();
|
|
147
145
|
if (!cfg) {
|
|
148
|
-
return
|
|
146
|
+
return;
|
|
149
147
|
}
|
|
150
|
-
cfg.
|
|
151
|
-
|
|
148
|
+
cfg.getBlocks().forEach(block => {
|
|
149
|
+
block.getStmts().forEach(stmt => {
|
|
150
|
+
if (!(stmt instanceof Stmt_1.ArkInvokeStmt || (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getRightOp() instanceof Expr_1.AbstractInvokeExpr))) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
152
153
|
this.resolveCall(cgNode.getID(), stmt).forEach(callSite => {
|
|
153
|
-
calleeMethods.push(callSite);
|
|
154
154
|
this.cg.addStmtToCallSiteMap(stmt, callSite);
|
|
155
155
|
this.cg.addMethodToCallSiteMap(callSite.calleeFuncID, callSite);
|
|
156
|
+
this.processCallSite(methodID, callSite, displayGeneratedMethod, isProject);
|
|
156
157
|
});
|
|
157
|
-
}
|
|
158
|
+
});
|
|
158
159
|
});
|
|
159
|
-
return calleeMethods;
|
|
160
160
|
}
|
|
161
161
|
getParamAnonymousMethod(invokeExpr) {
|
|
162
162
|
let paramMethod = [];
|
|
@@ -4,11 +4,16 @@ import { ClassSignature } from '../../core/model/ArkSignature';
|
|
|
4
4
|
import { NodeID } from '../../core/graph/BaseExplicitGraph';
|
|
5
5
|
import { CallGraph, CallSite, FuncID } from '../model/CallGraph';
|
|
6
6
|
import { AbstractAnalysis } from './AbstractAnalysis';
|
|
7
|
+
import { CallGraphBuilder } from '../model/builder/CallGraphBuilder';
|
|
7
8
|
export declare class RapidTypeAnalysis extends AbstractAnalysis {
|
|
8
9
|
private instancedClasses;
|
|
9
10
|
private ignoredCalls;
|
|
10
|
-
|
|
11
|
+
private enableThisPrune;
|
|
12
|
+
constructor(scene: Scene, cg: CallGraph, cb: CallGraphBuilder, enableThisPrune?: boolean);
|
|
13
|
+
protected init(): void;
|
|
11
14
|
resolveCall(callerMethod: NodeID, invokeStmt: Stmt): CallSite[];
|
|
15
|
+
private tryResolveAggressiveThisPruneCall;
|
|
16
|
+
private resolveConstructorClassFromNew;
|
|
12
17
|
protected preProcessMethod(funcID: FuncID): CallSite[];
|
|
13
18
|
private collectInstancedClassesInMethod;
|
|
14
19
|
addIgnoredCalls(arkClass: ClassSignature, callerID: FuncID, calleeID: FuncID, invokeStmt: Stmt): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RapidTypeAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/RapidTypeAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"RapidTypeAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/algorithm/RapidTypeAnalysis.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAiB,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAOrE,qBAAa,iBAAkB,SAAQ,gBAAgB;IAEnD,OAAO,CAAC,gBAAgB,CAAkC;IAE1D,OAAO,CAAC,YAAY,CAA2F;IAC/G,OAAO,CAAC,eAAe,CAAU;gBAErB,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,eAAe,GAAE,OAAe;IAM/F,SAAS,CAAC,IAAI,IAAI,IAAI;IAYf,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IA4FtE,OAAO,CAAC,iCAAiC;IAkCzC,OAAO,CAAC,8BAA8B;IAqCtC,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IA2BtD,OAAO,CAAC,+BAA+B;IA+BhC,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI;CAK/G"}
|
|
@@ -39,16 +39,33 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
40
|
exports.RapidTypeAnalysis = void 0;
|
|
41
41
|
const Expr_1 = require("../../core/base/Expr");
|
|
42
|
+
const Stmt_1 = require("../../core/base/Stmt");
|
|
42
43
|
const AbstractAnalysis_1 = require("./AbstractAnalysis");
|
|
43
44
|
const logger_1 = __importStar(require("../../utils/logger"));
|
|
45
|
+
const TSConst_1 = require("../../core/common/TSConst");
|
|
46
|
+
const Local_1 = require("../../core/base/Local");
|
|
47
|
+
const Const_1 = require("../../core/common/Const");
|
|
44
48
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'RTA');
|
|
45
49
|
class RapidTypeAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
46
|
-
constructor(scene, cg) {
|
|
50
|
+
constructor(scene, cg, cb, enableThisPrune = false) {
|
|
47
51
|
super(scene, cg);
|
|
48
52
|
// TODO: signature duplicated check
|
|
49
53
|
this.instancedClasses = new Set();
|
|
50
54
|
// TODO: Set duplicated check
|
|
51
55
|
this.ignoredCalls = new Map();
|
|
56
|
+
this.cgBuilder = cb;
|
|
57
|
+
this.enableThisPrune = enableThisPrune;
|
|
58
|
+
}
|
|
59
|
+
init() {
|
|
60
|
+
this.scene.getClasses().filter(c => c.getName() === Const_1.DEFAULT_ARK_CLASS_NAME).forEach(c => {
|
|
61
|
+
var _a;
|
|
62
|
+
const dfltMethod = (_a = c.getMethodWithName(Const_1.DEFAULT_ARK_METHOD_NAME)) === null || _a === void 0 ? void 0 : _a.getSignature();
|
|
63
|
+
if (dfltMethod) {
|
|
64
|
+
const funcID = this.cg.getCallGraphNodeByMethod(dfltMethod).getID();
|
|
65
|
+
this.workList.push(funcID);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
super.init();
|
|
52
69
|
}
|
|
53
70
|
resolveCall(callerMethod, invokeStmt) {
|
|
54
71
|
let invokeExpr = invokeStmt.getInvokeExpr();
|
|
@@ -70,6 +87,31 @@ class RapidTypeAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
70
87
|
}
|
|
71
88
|
else {
|
|
72
89
|
let declareClass = calleeMethod.getDeclaringArkClass();
|
|
90
|
+
const methodName = calleeMethod.getName();
|
|
91
|
+
// Aggressive heuristic: when enabled and the call is `this.foo()`,
|
|
92
|
+
// only keep the implementation of `foo` in the current declaring class,
|
|
93
|
+
// or the first superclass that defines it (e.g. B.m() calling this.foo() → A.foo() when B extends A).
|
|
94
|
+
const prunedCallSite = this.tryResolveAggressiveThisPruneCall(invokeStmt, methodName, callerMethod);
|
|
95
|
+
if (prunedCallSite) {
|
|
96
|
+
resolveResult.push(prunedCallSite);
|
|
97
|
+
return resolveResult;
|
|
98
|
+
}
|
|
99
|
+
const directCallSite = this.resolveConstructorClassFromNew(methodName, invokeStmt, callerMethod);
|
|
100
|
+
if (directCallSite) {
|
|
101
|
+
resolveResult.push(directCallSite);
|
|
102
|
+
return resolveResult;
|
|
103
|
+
}
|
|
104
|
+
// Private methods cannot be overridden; only the declaring class has an implementation.
|
|
105
|
+
if (calleeMethod.isPrivate()) {
|
|
106
|
+
const calleeNode = this.cg.getCallGraphNodeByMethod(calleeMethod.getSignature());
|
|
107
|
+
if (this.instancedClasses.has(declareClass.getSignature())) {
|
|
108
|
+
resolveResult.push(this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, calleeNode.getID(), callerMethod));
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.addIgnoredCalls(declareClass.getSignature(), callerMethod, calleeNode.getID(), invokeStmt);
|
|
112
|
+
}
|
|
113
|
+
return resolveResult;
|
|
114
|
+
}
|
|
73
115
|
// TODO: super class method should be placed at the end
|
|
74
116
|
this.getClassHierarchy(declareClass).forEach((arkClass) => {
|
|
75
117
|
let possibleCalleeMethod = arkClass.getMethodWithName(calleeMethod.getName());
|
|
@@ -82,26 +124,84 @@ class RapidTypeAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
82
124
|
return;
|
|
83
125
|
}
|
|
84
126
|
let calleeNode = this.cg.getCallGraphNodeByMethod(possibleCalleeMethod.getSignature());
|
|
85
|
-
|
|
86
|
-
|
|
127
|
+
const isSdkClass = this.scene.hasSdkFile(arkClass.getSignature().getDeclaringFileSignature());
|
|
128
|
+
const isInstanced = this.instancedClasses.has(arkClass.getSignature());
|
|
129
|
+
if (isSdkClass || isInstanced) {
|
|
130
|
+
resolveResult.push(this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, calleeNode.getID(), callerMethod));
|
|
87
131
|
}
|
|
88
132
|
else {
|
|
89
|
-
|
|
133
|
+
this.addIgnoredCalls(arkClass.getSignature(), callerMethod, calleeNode.getID(), invokeStmt);
|
|
90
134
|
}
|
|
91
135
|
});
|
|
92
136
|
}
|
|
93
137
|
return resolveResult;
|
|
94
138
|
}
|
|
139
|
+
tryResolveAggressiveThisPruneCall(invokeStmt, methodName, callerMethod) {
|
|
140
|
+
const invokeExpr = invokeStmt.getInvokeExpr();
|
|
141
|
+
if (!this.enableThisPrune || !(invokeExpr instanceof Expr_1.ArkInstanceInvokeExpr)) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const base = invokeExpr.getBase();
|
|
145
|
+
if (!base.getName || base.getName() !== TSConst_1.THIS_NAME) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
// Start from the declaring class of this call site, then walk up the super chain.
|
|
149
|
+
// Pick the first non-abstract implementation of `methodName`.
|
|
150
|
+
let curClass = invokeStmt.getCfg().getDeclaringMethod().getDeclaringArkClass();
|
|
151
|
+
while (curClass) {
|
|
152
|
+
const methodInClass = curClass.getMethodWithName(methodName);
|
|
153
|
+
if (methodInClass && !methodInClass.isAbstract()) {
|
|
154
|
+
return this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, this.cg.getCallGraphNodeByMethod(methodInClass.getSignature()).getID(), callerMethod);
|
|
155
|
+
}
|
|
156
|
+
curClass = curClass.getSuperClass();
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
resolveConstructorClassFromNew(methodName, invokeStmt, callerMethod) {
|
|
161
|
+
var _a;
|
|
162
|
+
if (methodName !== TSConst_1.CONSTRUCTOR_NAME) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
if (!(invokeStmt instanceof Stmt_1.ArkAssignStmt)) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const leftOp = invokeStmt.getLeftOp();
|
|
169
|
+
if (!(leftOp instanceof Local_1.Local)) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const declaringStmt = leftOp.getDeclaringStmt();
|
|
173
|
+
if (!(declaringStmt && declaringStmt instanceof Stmt_1.ArkAssignStmt)) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
const rightOp = declaringStmt.getRightOp();
|
|
177
|
+
if (!(rightOp instanceof Expr_1.ArkNewExpr)) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
const classSig = rightOp.getClassType().getClassSignature();
|
|
181
|
+
const constructorMethod = (_a = this.scene.getClass(classSig)) === null || _a === void 0 ? void 0 : _a.getMethodWithName(TSConst_1.CONSTRUCTOR_NAME);
|
|
182
|
+
if (!constructorMethod) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
return this.cg.getCallSiteManager().newCallSite(invokeStmt, undefined, this.cg.getCallGraphNodeByMethod(constructorMethod.getSignature()).getID(), callerMethod);
|
|
186
|
+
}
|
|
95
187
|
preProcessMethod(funcID) {
|
|
96
188
|
let newCallSites = [];
|
|
97
189
|
let instancedClasses = this.collectInstancedClassesInMethod(funcID);
|
|
98
|
-
let newlyInstancedClasses = new Set(
|
|
190
|
+
let newlyInstancedClasses = new Set();
|
|
191
|
+
for (const sig of instancedClasses) {
|
|
192
|
+
if (!this.instancedClasses.has(sig)) {
|
|
193
|
+
newlyInstancedClasses.add(sig);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
99
196
|
newlyInstancedClasses.forEach(sig => {
|
|
100
197
|
let ignoredCalls = this.ignoredCalls.get(sig);
|
|
101
198
|
if (ignoredCalls) {
|
|
102
199
|
ignoredCalls.forEach(call => {
|
|
103
200
|
this.cg.addDynamicCallEdge(call.caller, call.callee, call.callStmt);
|
|
104
|
-
|
|
201
|
+
const newCallSite = this.cg.getCallSiteManager().newCallSite(call.callStmt, undefined, call.callee, call.caller);
|
|
202
|
+
this.cg.addStmtToCallSiteMap(call.callStmt, newCallSite);
|
|
203
|
+
this.cg.addMethodToCallSiteMap(call.callee, newCallSite);
|
|
204
|
+
newCallSites.push(newCallSite);
|
|
105
205
|
});
|
|
106
206
|
}
|
|
107
207
|
this.instancedClasses.add(sig);
|
|
@@ -118,17 +218,20 @@ class RapidTypeAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
|
|
|
118
218
|
}
|
|
119
219
|
let cfg = arkMethod.getCfg();
|
|
120
220
|
if (!cfg) {
|
|
121
|
-
logger.error(`arkMethod ${arkMethod.getSignature().toString()} has no cfg`);
|
|
122
221
|
return instancedClasses;
|
|
123
222
|
}
|
|
124
223
|
for (let stmt of cfg.getStmts()) {
|
|
125
|
-
let stmtExpr
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
224
|
+
let stmtExpr;
|
|
225
|
+
if (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getRightOp() instanceof Expr_1.ArkNewExpr) {
|
|
226
|
+
stmtExpr = stmt.getRightOp();
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
let classSig = stmtExpr.getType().getClassSignature();
|
|
232
|
+
if (classSig != null) {
|
|
233
|
+
// TODO: need to check if different stmt has single sig
|
|
234
|
+
instancedClasses.add(classSig);
|
|
132
235
|
}
|
|
133
236
|
}
|
|
134
237
|
return instancedClasses;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CallGraphNodeKind } from '../model/CallGraph';
|
|
1
|
+
import { CallGraph, CallGraphNodeKind } from '../model/CallGraph';
|
|
2
2
|
import { PointerAnalysis } from '../pointerAnalysis/PointerAnalysis';
|
|
3
3
|
declare abstract class StatTraits {
|
|
4
4
|
TotalTime: number;
|
|
@@ -53,8 +53,10 @@ export declare class CGStat extends StatTraits {
|
|
|
53
53
|
numIntrinsic: number;
|
|
54
54
|
numConstructor: number;
|
|
55
55
|
numBlank: number;
|
|
56
|
+
numTotalEdge: number;
|
|
56
57
|
startStat(): void;
|
|
57
|
-
endStat(): void;
|
|
58
|
+
endStat(cg?: CallGraph): void;
|
|
59
|
+
private computeEdgeStat;
|
|
58
60
|
addNodeStat(kind: CallGraphNodeKind): void;
|
|
59
61
|
getStat(): string;
|
|
60
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Statistics.d.ts","sourceRoot":"","sources":["../../../src/callgraph/common/Statistics.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Statistics.d.ts","sourceRoot":"","sources":["../../../src/callgraph/common/Statistics.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,SAAS,EAAiB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAQrE,uBAAe,UAAU;IACrB,SAAS,EAAE,MAAM,CAAK;IACtB,SAAS,EAAE,MAAM,CAAK;IACtB,OAAO,EAAE,MAAM,CAAK;IAEb,OAAO,IAAI,MAAM;IAIjB,SAAS,IAAI,IAAI;CAG3B;AAED,qBAAa,OAAQ,SAAQ,UAAU;IACnC,GAAG,EAAE,eAAe,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAK;IAC7B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,iBAAiB,EAAE,MAAM,CAAK;IAC9B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,YAAY,EAAE,MAAM,CAAK;IACzB,WAAW,EAAE,MAAM,CAAK;IAExB,eAAe,EAAE,MAAM,CAAK;IAC5B,yBAAyB,EAAE,MAAM,CAAK;IACtC,oBAAoB,EAAE,MAAM,CAAK;IAGjC,sBAAsB,EAAE,MAAM,CAAK;IAEnC,uBAAuB,EAAE,MAAM,CAAK;IAEpC,wBAAwB,EAAE,MAAM,CAAK;IAErC,yBAAyB,EAAE,MAAM,CAAK;IACtC,gBAAgB,EAAE,MAAM,CAAK;IAE7B,SAAS,EAAE,MAAM,CAAK;IAEtB,aAAa,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,MAAM,CAAK;IACpB,QAAQ,EAAE,MAAM,CAAK;gBAET,GAAG,EAAE,eAAe;IAKzB,SAAS,IAAI,IAAI;IAKjB,OAAO,IAAI,IAAI;IAUf,MAAM,IAAI,MAAM;IAIvB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,yBAAyB;IA4BjC,OAAO,CAAC,oBAAoB;IAerB,OAAO,IAAI,MAAM;IAqBjB,SAAS,IAAI,IAAI;CAG3B;AAED,qBAAa,OAAQ,SAAQ,UAAU;IACnC,cAAc,EAAE,MAAM,CAAK;IAC3B,gBAAgB,EAAE,MAAM,CAAK;IAC7B,YAAY,EAAE,MAAM,CAAK;IAElB,OAAO,IAAI,MAAM;IAUjB,SAAS,IAAI,IAAI;CAG3B;AAED,qBAAa,MAAO,SAAQ,UAAU;IAElC,YAAY,EAAE,MAAM,CAAK;IACzB,OAAO,EAAE,MAAM,CAAK;IACpB,UAAU,EAAE,MAAM,CAAK;IACvB,YAAY,EAAE,MAAM,CAAK;IACzB,cAAc,EAAE,MAAM,CAAK;IAC3B,QAAQ,EAAE,MAAM,CAAK;IAGrB,YAAY,EAAE,MAAM,CAAK;IAElB,SAAS,IAAI,IAAI;IAIjB,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI;IAQpC,OAAO,CAAC,eAAe;IAOhB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAoB1C,OAAO,IAAI,MAAM;CAc3B"}
|
|
@@ -225,13 +225,24 @@ class CGStat extends StatTraits {
|
|
|
225
225
|
this.numIntrinsic = 0;
|
|
226
226
|
this.numConstructor = 0;
|
|
227
227
|
this.numBlank = 0;
|
|
228
|
+
// edge statistics
|
|
229
|
+
this.numTotalEdge = 0;
|
|
228
230
|
}
|
|
229
231
|
startStat() {
|
|
230
232
|
this.startTime = new Date().getTime();
|
|
231
233
|
}
|
|
232
|
-
endStat() {
|
|
234
|
+
endStat(cg) {
|
|
233
235
|
this.endTime = new Date().getTime();
|
|
234
236
|
this.TotalTime = (this.endTime - this.startTime) / 1000;
|
|
237
|
+
if (cg) {
|
|
238
|
+
this.computeEdgeStat(cg);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
computeEdgeStat(cg) {
|
|
242
|
+
this.numTotalEdge = 0;
|
|
243
|
+
for (const _edge of cg.getCallEdges()) {
|
|
244
|
+
this.numTotalEdge++;
|
|
245
|
+
}
|
|
235
246
|
}
|
|
236
247
|
addNodeStat(kind) {
|
|
237
248
|
switch (kind) {
|
|
@@ -262,7 +273,8 @@ ${'Intrinsic function'.padEnd(LABEL_WIDTH)}${this.numIntrinsic}
|
|
|
262
273
|
${'Constructor function'.padEnd(LABEL_WIDTH)}${this.numConstructor}
|
|
263
274
|
${'Virtual function'.padEnd(LABEL_WIDTH)}${this.numVirtual}
|
|
264
275
|
${'Blank function'.padEnd(LABEL_WIDTH)}${this.numBlank}
|
|
265
|
-
${'Total'.padEnd(LABEL_WIDTH)}${this.numTotalNode}
|
|
276
|
+
${'Total node'.padEnd(LABEL_WIDTH)}${this.numTotalNode}
|
|
277
|
+
${'Total edge'.padEnd(LABEL_WIDTH)}${this.numTotalEdge}`;
|
|
266
278
|
}
|
|
267
279
|
}
|
|
268
280
|
exports.CGStat = CGStat;
|
|
@@ -15,13 +15,14 @@ export declare enum CallGraphNodeKind {
|
|
|
15
15
|
blank = 4
|
|
16
16
|
}
|
|
17
17
|
export declare class CallGraphEdge extends BaseEdge {
|
|
18
|
-
private
|
|
19
|
-
private specialCalls;
|
|
20
|
-
private indirectCalls;
|
|
18
|
+
private flags;
|
|
21
19
|
constructor(src: CallGraphNode, dst: CallGraphNode);
|
|
22
|
-
addDirectCallSite(
|
|
23
|
-
addSpecialCallSite(
|
|
24
|
-
addInDirectCallSite(
|
|
20
|
+
addDirectCallSite(_stmt: Stmt): void;
|
|
21
|
+
addSpecialCallSite(_stmt: Stmt): void;
|
|
22
|
+
addInDirectCallSite(_stmt: Stmt): void;
|
|
23
|
+
hasDirectCall(): boolean;
|
|
24
|
+
hasIndirectCall(): boolean;
|
|
25
|
+
hasSpecialCall(): boolean;
|
|
25
26
|
getDotAttr(): string;
|
|
26
27
|
}
|
|
27
28
|
export declare class CallGraphNode extends BaseNode {
|
|
@@ -44,11 +45,12 @@ export declare class CallGraph extends BaseExplicitGraph {
|
|
|
44
45
|
private callPairToEdgeMap;
|
|
45
46
|
private methodToCallSiteMap;
|
|
46
47
|
private entries;
|
|
47
|
-
private cgStat
|
|
48
|
+
private cgStat?;
|
|
48
49
|
private dummyMainMethodID;
|
|
49
|
-
constructor(s: Scene);
|
|
50
|
+
constructor(s: Scene, enableStatistics?: boolean);
|
|
50
51
|
private getCallPairString;
|
|
51
52
|
getCallEdgeByPair(srcID: NodeID, dstID: NodeID): CallGraphEdge | undefined;
|
|
53
|
+
getCallEdges(): Iterable<CallGraphEdge>;
|
|
52
54
|
addCallGraphNode(method: Method, kind?: CallGraphNodeKind): CallGraphNode;
|
|
53
55
|
removeCallGraphNode(nodeID: NodeID): void;
|
|
54
56
|
getCallGraphNodeByMethod(method: Method): CallGraphNode;
|
|
@@ -67,7 +69,9 @@ export declare class CallGraph extends BaseExplicitGraph {
|
|
|
67
69
|
getArkMethodByFuncID(id: FuncID): ArkMethod | null;
|
|
68
70
|
getEntries(): FuncID[];
|
|
69
71
|
setEntries(n: NodeID[]): void;
|
|
72
|
+
getCallPairEdges(): Map<string, CallGraphEdge>;
|
|
70
73
|
dump(name: string, entry?: FuncID): void;
|
|
74
|
+
dump2Json(name: string): void;
|
|
71
75
|
detectReachable(fromID: FuncID, dstID: FuncID): boolean;
|
|
72
76
|
startStat(): void;
|
|
73
77
|
endStat(): void;
|
|
@@ -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,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAGnG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"CallGraph.d.ts","sourceRoot":"","sources":["../../../src/callgraph/model/CallGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ const Const_1 = require("../../core/common/Const");
|
|
|
24
24
|
const CallSite_1 = require("./CallSite");
|
|
25
25
|
Object.defineProperty(exports, "CallSite", { enumerable: true, get: function () { return CallSite_1.CallSite; } });
|
|
26
26
|
Object.defineProperty(exports, "DynCallSite", { enumerable: true, get: function () { return CallSite_1.DynCallSite; } });
|
|
27
|
+
const CGJsonPrinter_1 = require("../../save/CGJsonPrinter");
|
|
27
28
|
var CallGraphNodeKind;
|
|
28
29
|
(function (CallGraphNodeKind) {
|
|
29
30
|
CallGraphNodeKind[CallGraphNodeKind["real"] = 0] = "real";
|
|
@@ -32,34 +33,40 @@ var CallGraphNodeKind;
|
|
|
32
33
|
CallGraphNodeKind[CallGraphNodeKind["constructor"] = 3] = "constructor";
|
|
33
34
|
CallGraphNodeKind[CallGraphNodeKind["blank"] = 4] = "blank";
|
|
34
35
|
})(CallGraphNodeKind = exports.CallGraphNodeKind || (exports.CallGraphNodeKind = {}));
|
|
36
|
+
const EDGE_FLAG_DIRECT = 1;
|
|
37
|
+
const EDGE_FLAG_SPECIAL = 2;
|
|
38
|
+
const EDGE_FLAG_INDIRECT = 4;
|
|
35
39
|
class CallGraphEdge extends BaseExplicitGraph_1.BaseEdge {
|
|
36
|
-
// private callSiteID: CallSiteID;
|
|
37
40
|
constructor(src, dst) {
|
|
38
41
|
super(src, dst, 0);
|
|
39
|
-
this.
|
|
40
|
-
this.specialCalls = new Set();
|
|
41
|
-
this.indirectCalls = new Set();
|
|
42
|
+
this.flags = 0;
|
|
42
43
|
}
|
|
43
|
-
addDirectCallSite(
|
|
44
|
-
this.
|
|
44
|
+
addDirectCallSite(_stmt) {
|
|
45
|
+
this.flags |= EDGE_FLAG_DIRECT;
|
|
45
46
|
}
|
|
46
|
-
addSpecialCallSite(
|
|
47
|
-
this.
|
|
47
|
+
addSpecialCallSite(_stmt) {
|
|
48
|
+
this.flags |= EDGE_FLAG_SPECIAL;
|
|
48
49
|
}
|
|
49
|
-
addInDirectCallSite(
|
|
50
|
-
this.
|
|
50
|
+
addInDirectCallSite(_stmt) {
|
|
51
|
+
this.flags |= EDGE_FLAG_INDIRECT;
|
|
52
|
+
}
|
|
53
|
+
hasDirectCall() {
|
|
54
|
+
return (this.flags & EDGE_FLAG_DIRECT) !== 0;
|
|
55
|
+
}
|
|
56
|
+
hasIndirectCall() {
|
|
57
|
+
return (this.flags & EDGE_FLAG_INDIRECT) !== 0;
|
|
58
|
+
}
|
|
59
|
+
hasSpecialCall() {
|
|
60
|
+
return (this.flags & EDGE_FLAG_SPECIAL) !== 0;
|
|
51
61
|
}
|
|
52
62
|
getDotAttr() {
|
|
53
|
-
|
|
54
|
-
const directCallNums = this.directCalls.size;
|
|
55
|
-
const specialCallNums = this.specialCalls.size;
|
|
56
|
-
if (indirectCallNums !== 0 && directCallNums === 0) {
|
|
63
|
+
if (this.hasIndirectCall() && !this.hasDirectCall()) {
|
|
57
64
|
return 'color=red';
|
|
58
65
|
}
|
|
59
|
-
else if (
|
|
66
|
+
else if (this.hasSpecialCall()) {
|
|
60
67
|
return 'color=yellow';
|
|
61
68
|
}
|
|
62
|
-
else if (
|
|
69
|
+
else if (this.hasDirectCall()) {
|
|
63
70
|
return 'color=black';
|
|
64
71
|
}
|
|
65
72
|
else {
|
|
@@ -97,7 +104,7 @@ class CallGraphNode extends BaseExplicitGraph_1.BaseNode {
|
|
|
97
104
|
}
|
|
98
105
|
exports.CallGraphNode = CallGraphNode;
|
|
99
106
|
class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
100
|
-
constructor(s) {
|
|
107
|
+
constructor(s, enableStatistics = false) {
|
|
101
108
|
super();
|
|
102
109
|
this.csManager = new CallSite_1.CallSiteManager();
|
|
103
110
|
this.stmtToCallSitemap = new Map();
|
|
@@ -106,7 +113,9 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
106
113
|
this.callPairToEdgeMap = new Map();
|
|
107
114
|
this.methodToCallSiteMap = new Map();
|
|
108
115
|
this.scene = s;
|
|
109
|
-
|
|
116
|
+
if (enableStatistics) {
|
|
117
|
+
this.cgStat = new Statistics_1.CGStat();
|
|
118
|
+
}
|
|
110
119
|
}
|
|
111
120
|
getCallPairString(srcID, dstID) {
|
|
112
121
|
return `${srcID}-${dstID}`;
|
|
@@ -115,14 +124,18 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
115
124
|
let key = this.getCallPairString(srcID, dstID);
|
|
116
125
|
return this.callPairToEdgeMap.get(key);
|
|
117
126
|
}
|
|
127
|
+
getCallEdges() {
|
|
128
|
+
return this.callPairToEdgeMap.values();
|
|
129
|
+
}
|
|
118
130
|
addCallGraphNode(method, kind = CallGraphNodeKind.real) {
|
|
131
|
+
var _a;
|
|
119
132
|
let id = this.nodeNum;
|
|
120
133
|
let cgNode = new CallGraphNode(id, method, kind);
|
|
121
134
|
// check if sdk method
|
|
122
135
|
cgNode.setSdkMethod(this.scene.hasSdkFile(method.getDeclaringClassSignature().getDeclaringFileSignature()));
|
|
123
136
|
this.addNode(cgNode);
|
|
124
137
|
this.methodToCGNodeMap.set(method.toString(), cgNode.getID());
|
|
125
|
-
this.cgStat.addNodeStat(kind);
|
|
138
|
+
(_a = this.cgStat) === null || _a === void 0 ? void 0 : _a.addNodeStat(kind);
|
|
126
139
|
return cgNode;
|
|
127
140
|
}
|
|
128
141
|
removeCallGraphNode(nodeID) {
|
|
@@ -173,11 +186,12 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
173
186
|
}
|
|
174
187
|
}
|
|
175
188
|
removeCallGraphEdge(nodeID) {
|
|
189
|
+
var _a, _b;
|
|
176
190
|
let node = this.getNode(nodeID);
|
|
177
|
-
for (const inEdge of node.getIncomingEdge()) {
|
|
191
|
+
for (const inEdge of (_a = node.getIncomingEdge()) !== null && _a !== void 0 ? _a : []) {
|
|
178
192
|
node.removeIncomingEdge(inEdge);
|
|
179
193
|
}
|
|
180
|
-
for (const outEdge of node.getOutgoingEdges()) {
|
|
194
|
+
for (const outEdge of (_b = node.getOutgoingEdges()) !== null && _b !== void 0 ? _b : []) {
|
|
181
195
|
node.removeIncomingEdge(outEdge);
|
|
182
196
|
}
|
|
183
197
|
}
|
|
@@ -212,10 +226,8 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
212
226
|
return this.stmtToDynCallSitemap.get(stmt);
|
|
213
227
|
}
|
|
214
228
|
addStmtToCallSiteMap(stmt, cs) {
|
|
215
|
-
var _a;
|
|
216
229
|
if (this.stmtToCallSitemap.has(stmt)) {
|
|
217
|
-
|
|
218
|
-
this.stmtToCallSitemap.set(stmt, [...callSites, cs]);
|
|
230
|
+
this.stmtToCallSitemap.get(stmt).push(cs);
|
|
219
231
|
return false;
|
|
220
232
|
}
|
|
221
233
|
this.stmtToCallSitemap.set(stmt, [cs]);
|
|
@@ -289,6 +301,9 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
289
301
|
setEntries(n) {
|
|
290
302
|
this.entries = n;
|
|
291
303
|
}
|
|
304
|
+
getCallPairEdges() {
|
|
305
|
+
return this.callPairToEdgeMap;
|
|
306
|
+
}
|
|
292
307
|
dump(name, entry) {
|
|
293
308
|
let printer = new GraphPrinter_1.GraphPrinter(this);
|
|
294
309
|
if (entry) {
|
|
@@ -296,7 +311,12 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
296
311
|
}
|
|
297
312
|
PrinterBuilder_1.PrinterBuilder.dump(printer, name);
|
|
298
313
|
}
|
|
314
|
+
dump2Json(name) {
|
|
315
|
+
let printer = new CGJsonPrinter_1.CallGraphJsonPrinter(this);
|
|
316
|
+
PrinterBuilder_1.PrinterBuilder.dump(printer, name);
|
|
317
|
+
}
|
|
299
318
|
detectReachable(fromID, dstID) {
|
|
319
|
+
var _a;
|
|
300
320
|
let dWorklist = [];
|
|
301
321
|
let travserdFuncs = new Set();
|
|
302
322
|
dWorklist.push(fromID);
|
|
@@ -307,7 +327,7 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
307
327
|
}
|
|
308
328
|
travserdFuncs.add(nodeID);
|
|
309
329
|
let node = this.getNode(nodeID);
|
|
310
|
-
for (let e of node.getOutgoingEdges()) {
|
|
330
|
+
for (let e of (_a = node.getOutgoingEdges()) !== null && _a !== void 0 ? _a : []) {
|
|
311
331
|
let dst = e.getDstID();
|
|
312
332
|
if (dst === dstID) {
|
|
313
333
|
return true;
|
|
@@ -318,16 +338,20 @@ class CallGraph extends BaseExplicitGraph_1.BaseExplicitGraph {
|
|
|
318
338
|
return false;
|
|
319
339
|
}
|
|
320
340
|
startStat() {
|
|
321
|
-
|
|
341
|
+
var _a;
|
|
342
|
+
(_a = this.cgStat) === null || _a === void 0 ? void 0 : _a.startStat();
|
|
322
343
|
}
|
|
323
344
|
endStat() {
|
|
324
|
-
|
|
345
|
+
var _a;
|
|
346
|
+
(_a = this.cgStat) === null || _a === void 0 ? void 0 : _a.endStat(this);
|
|
325
347
|
}
|
|
326
348
|
printStat() {
|
|
327
|
-
|
|
349
|
+
var _a;
|
|
350
|
+
(_a = this.cgStat) === null || _a === void 0 ? void 0 : _a.printStat();
|
|
328
351
|
}
|
|
329
352
|
getStat() {
|
|
330
|
-
|
|
353
|
+
var _a, _b;
|
|
354
|
+
return (_b = (_a = this.cgStat) === null || _a === void 0 ? void 0 : _a.getStat()) !== null && _b !== void 0 ? _b : '';
|
|
331
355
|
}
|
|
332
356
|
setDummyMainFuncID(dummyMainMethodID) {
|
|
333
357
|
this.dummyMainMethodID = dummyMainMethodID;
|
|
@@ -10,6 +10,7 @@ export declare class CallGraphBuilder {
|
|
|
10
10
|
buildDirectCallGraph(methods: ArkMethod[]): void;
|
|
11
11
|
buildClassHierarchyCallGraph(entries: Method[], displayGeneratedMethod?: boolean): void;
|
|
12
12
|
buildCHA4WholeProject(displayGeneratedMethod?: boolean): void;
|
|
13
|
+
buildRTA4WholeProject(displayGeneratedMethod?: boolean): void;
|
|
13
14
|
buildRapidTypeCallGraph(entries: Method[], displayGeneratedMethod?: boolean): void;
|
|
14
15
|
private getDCCallee;
|
|
15
16
|
setEntries(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CallGraphBuilder.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/model/builder/CallGraphBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAoC,MAAM,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAKvC,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,qBAAa,gBAAgB;IACzB,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,KAAK,CAAQ;gBAET,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK;IAK3B,4BAA4B,IAAI,IAAI;IAWpC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI;IAgBxC,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI;IA2BhD,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,sBAAsB,GAAE,OAAe,GAAG,IAAI;IAW9F,qBAAqB,CAAC,sBAAsB,GAAE,OAAe,GAAG,IAAI;IAKpE,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,sBAAsB,GAAE,OAAe,GAAG,IAAI;IAYhG,OAAO,CAAC,WAAW;IAIZ,UAAU,IAAI,IAAI;CAO5B"}
|
|
1
|
+
{"version":3,"file":"CallGraphBuilder.d.ts","sourceRoot":"","sources":["../../../../src/callgraph/model/builder/CallGraphBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAoC,MAAM,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAKvC,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,qBAAa,gBAAgB;IACzB,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,KAAK,CAAQ;gBAET,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK;IAK3B,4BAA4B,IAAI,IAAI;IAWpC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI;IAgBxC,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI;IA2BhD,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,sBAAsB,GAAE,OAAe,GAAG,IAAI;IAW9F,qBAAqB,CAAC,sBAAsB,GAAE,OAAe,GAAG,IAAI;IAKpE,qBAAqB,CAAC,sBAAsB,GAAE,OAAe,GAAG,IAAI;IAKpE,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,sBAAsB,GAAE,OAAe,GAAG,IAAI;IAYhG,OAAO,CAAC,WAAW;IAIZ,UAAU,IAAI,IAAI;CAO5B"}
|
|
@@ -87,13 +87,17 @@ class CallGraphBuilder {
|
|
|
87
87
|
let classHierarchyAnalysis = new ClassHierarchyAnalysis_1.ClassHierarchyAnalysis(this.scene, this.cg, this);
|
|
88
88
|
classHierarchyAnalysis.projectStart(displayGeneratedMethod);
|
|
89
89
|
}
|
|
90
|
+
buildRTA4WholeProject(displayGeneratedMethod = false) {
|
|
91
|
+
let rapidTypeAnalysis = new RapidTypeAnalysis_1.RapidTypeAnalysis(this.scene, this.cg, this);
|
|
92
|
+
rapidTypeAnalysis.projectStart(displayGeneratedMethod);
|
|
93
|
+
}
|
|
90
94
|
buildRapidTypeCallGraph(entries, displayGeneratedMethod = false) {
|
|
91
95
|
let cgEntries = [];
|
|
92
96
|
entries.forEach((entry) => {
|
|
93
97
|
cgEntries.push(this.cg.getCallGraphNodeByMethod(entry).getID());
|
|
94
98
|
});
|
|
95
99
|
this.cg.setEntries(cgEntries);
|
|
96
|
-
let rapidTypeAnalysis = new RapidTypeAnalysis_1.RapidTypeAnalysis(this.scene, this.cg);
|
|
100
|
+
let rapidTypeAnalysis = new RapidTypeAnalysis_1.RapidTypeAnalysis(this.scene, this.cg, this);
|
|
97
101
|
rapidTypeAnalysis.start(displayGeneratedMethod);
|
|
98
102
|
}
|
|
99
103
|
/// Get direct call callee
|