arkanalyzer 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/config/arkanalyzer.json +8 -0
  2. package/docs/IR2ts-stmt.md +81 -0
  3. package/docs/IR2ts.md +82 -0
  4. package/lib/Config.d.ts +29 -1
  5. package/lib/Config.d.ts.map +1 -1
  6. package/lib/Config.js +44 -11
  7. package/lib/Scene.d.ts +152 -9
  8. package/lib/Scene.d.ts.map +1 -1
  9. package/lib/Scene.js +233 -66
  10. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +2 -1
  11. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts.map +1 -1
  12. package/lib/callgraph/algorithm/AbstractAnalysis.js +14 -7
  13. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts.map +1 -1
  14. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +2 -4
  15. package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts.map +1 -1
  16. package/lib/callgraph/algorithm/RapidTypeAnalysis.js +2 -3
  17. package/lib/callgraph/common/Statistics.js +1 -1
  18. package/lib/callgraph/model/BaseGraph.js +2 -2
  19. package/lib/callgraph/model/CallGraph.d.ts +3 -2
  20. package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
  21. package/lib/callgraph/model/CallGraph.js +23 -14
  22. package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +2 -2
  23. package/lib/callgraph/model/builder/CallGraphBuilder.js +3 -3
  24. package/lib/callgraph/pointerAnalysis/Context.d.ts.map +1 -1
  25. package/lib/callgraph/pointerAnalysis/Context.js +0 -1
  26. package/lib/callgraph/pointerAnalysis/Pag.d.ts +36 -9
  27. package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
  28. package/lib/callgraph/pointerAnalysis/Pag.js +130 -37
  29. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +34 -5
  30. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
  31. package/lib/callgraph/pointerAnalysis/PagBuilder.js +479 -126
  32. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +6 -0
  33. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
  34. package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +107 -45
  35. package/lib/callgraph/pointerAnalysis/PtsDS.d.ts.map +1 -1
  36. package/lib/callgraph/pointerAnalysis/PtsDS.js +0 -2
  37. package/lib/core/base/Constant.d.ts +37 -5
  38. package/lib/core/base/Constant.d.ts.map +1 -1
  39. package/lib/core/base/Constant.js +58 -8
  40. package/lib/core/base/Expr.d.ts +98 -13
  41. package/lib/core/base/Expr.d.ts.map +1 -1
  42. package/lib/core/base/Expr.js +295 -127
  43. package/lib/core/base/Local.d.ts +70 -5
  44. package/lib/core/base/Local.d.ts.map +1 -1
  45. package/lib/core/base/Local.js +77 -4
  46. package/lib/core/base/Ref.d.ts +79 -5
  47. package/lib/core/base/Ref.d.ts.map +1 -1
  48. package/lib/core/base/Ref.js +143 -38
  49. package/lib/core/base/Stmt.d.ts +126 -12
  50. package/lib/core/base/Stmt.d.ts.map +1 -1
  51. package/lib/core/base/Stmt.js +135 -28
  52. package/lib/core/base/Type.d.ts +11 -2
  53. package/lib/core/base/Type.d.ts.map +1 -1
  54. package/lib/core/base/Type.js +47 -42
  55. package/lib/core/base/Value.d.ts +24 -2
  56. package/lib/core/base/Value.d.ts.map +1 -1
  57. package/lib/core/common/ArkError.d.ts +15 -0
  58. package/lib/core/common/ArkError.d.ts.map +1 -0
  59. package/lib/core/common/ArkError.js +28 -0
  60. package/lib/core/common/ArkIRTransformer.d.ts +12 -5
  61. package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
  62. package/lib/core/common/ArkIRTransformer.js +90 -45
  63. package/lib/core/common/BodyBuilder.d.ts +2 -0
  64. package/lib/core/common/BodyBuilder.d.ts.map +1 -1
  65. package/lib/core/common/BodyBuilder.js +5 -2
  66. package/lib/core/common/Builtin.js +1 -1
  67. package/lib/core/common/CfgBuilder.d.ts +12 -7
  68. package/lib/core/common/CfgBuilder.d.ts.map +1 -1
  69. package/lib/core/common/CfgBuilder.js +336 -140
  70. package/lib/core/common/Const.d.ts +15 -10
  71. package/lib/core/common/Const.d.ts.map +1 -1
  72. package/lib/core/common/Const.js +18 -11
  73. package/lib/core/common/DummyMainCreater.d.ts +5 -4
  74. package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
  75. package/lib/core/common/DummyMainCreater.js +43 -28
  76. package/lib/core/common/EtsConst.d.ts +1 -0
  77. package/lib/core/common/EtsConst.d.ts.map +1 -1
  78. package/lib/core/common/EtsConst.js +2 -1
  79. package/lib/core/common/ExprUseReplacer.js +8 -8
  80. package/lib/core/common/IRUtils.d.ts +7 -0
  81. package/lib/core/common/IRUtils.d.ts.map +1 -1
  82. package/lib/core/common/IRUtils.js +34 -2
  83. package/lib/core/common/ModelUtils.d.ts +1 -0
  84. package/lib/core/common/ModelUtils.d.ts.map +1 -1
  85. package/lib/core/common/ModelUtils.js +39 -36
  86. package/lib/core/common/RefUseReplacer.js +3 -3
  87. package/lib/core/common/StmtUseReplacer.js +4 -4
  88. package/lib/core/common/TSConst.d.ts +10 -3
  89. package/lib/core/common/TSConst.d.ts.map +1 -1
  90. package/lib/core/common/TSConst.js +11 -4
  91. package/lib/core/common/TypeInference.d.ts +8 -2
  92. package/lib/core/common/TypeInference.d.ts.map +1 -1
  93. package/lib/core/common/TypeInference.js +222 -90
  94. package/lib/core/common/ValueUtil.d.ts +0 -4
  95. package/lib/core/common/ValueUtil.d.ts.map +1 -1
  96. package/lib/core/common/ValueUtil.js +10 -27
  97. package/lib/core/common/VisibleValue.js +1 -1
  98. package/lib/core/dataflow/DataflowProblem.d.ts +1 -0
  99. package/lib/core/dataflow/DataflowProblem.d.ts.map +1 -1
  100. package/lib/core/dataflow/DataflowProblem.js +4 -4
  101. package/lib/core/dataflow/DataflowSolver.d.ts +20 -16
  102. package/lib/core/dataflow/DataflowSolver.d.ts.map +1 -1
  103. package/lib/core/dataflow/DataflowSolver.js +67 -78
  104. package/lib/core/dataflow/TiantAnalysis.d.ts +1 -0
  105. package/lib/core/dataflow/TiantAnalysis.d.ts.map +1 -1
  106. package/lib/core/dataflow/TiantAnalysis.js +42 -28
  107. package/lib/core/dataflow/UndefinedVariable.d.ts +15 -1
  108. package/lib/core/dataflow/UndefinedVariable.d.ts.map +1 -1
  109. package/lib/core/dataflow/UndefinedVariable.js +122 -76
  110. package/lib/core/dataflow/Util.d.ts +5 -1
  111. package/lib/core/dataflow/Util.d.ts.map +1 -1
  112. package/lib/core/dataflow/Util.js +43 -22
  113. package/lib/core/graph/BasicBlock.d.ts +72 -0
  114. package/lib/core/graph/BasicBlock.d.ts.map +1 -1
  115. package/lib/core/graph/BasicBlock.js +165 -3
  116. package/lib/core/graph/Cfg.d.ts +30 -1
  117. package/lib/core/graph/Cfg.d.ts.map +1 -1
  118. package/lib/core/graph/Cfg.js +131 -11
  119. package/lib/core/graph/DominanceFinder.js +7 -7
  120. package/lib/core/graph/DominanceTree.js +4 -4
  121. package/lib/core/graph/builder/ViewTreeBuilder.d.ts.map +1 -1
  122. package/lib/core/graph/builder/ViewTreeBuilder.js +6 -5
  123. package/lib/core/model/ArkBaseModel.d.ts +59 -0
  124. package/lib/core/model/ArkBaseModel.d.ts.map +1 -0
  125. package/lib/core/model/ArkBaseModel.js +271 -0
  126. package/lib/core/model/ArkBody.d.ts +3 -9
  127. package/lib/core/model/ArkBody.d.ts.map +1 -1
  128. package/lib/core/model/ArkBody.js +3 -14
  129. package/lib/core/model/ArkClass.d.ts +107 -13
  130. package/lib/core/model/ArkClass.d.ts.map +1 -1
  131. package/lib/core/model/ArkClass.js +152 -54
  132. package/lib/core/model/ArkExport.d.ts +8 -7
  133. package/lib/core/model/ArkExport.d.ts.map +1 -1
  134. package/lib/core/model/ArkExport.js +16 -18
  135. package/lib/core/model/ArkField.d.ts +16 -13
  136. package/lib/core/model/ArkField.d.ts.map +1 -1
  137. package/lib/core/model/ArkField.js +18 -62
  138. package/lib/core/model/ArkFile.d.ts +42 -0
  139. package/lib/core/model/ArkFile.d.ts.map +1 -1
  140. package/lib/core/model/ArkFile.js +58 -0
  141. package/lib/core/model/ArkImport.d.ts +9 -7
  142. package/lib/core/model/ArkImport.d.ts.map +1 -1
  143. package/lib/core/model/ArkImport.js +11 -12
  144. package/lib/core/model/ArkMetadata.d.ts +20 -0
  145. package/lib/core/model/ArkMetadata.d.ts.map +1 -0
  146. package/lib/core/model/ArkMetadata.js +44 -0
  147. package/lib/core/model/ArkMethod.d.ts +195 -17
  148. package/lib/core/model/ArkMethod.d.ts.map +1 -1
  149. package/lib/core/model/ArkMethod.js +363 -46
  150. package/lib/core/model/ArkNamespace.d.ts +6 -8
  151. package/lib/core/model/ArkNamespace.d.ts.map +1 -1
  152. package/lib/core/model/ArkNamespace.js +16 -20
  153. package/lib/core/model/ArkSignature.d.ts +41 -0
  154. package/lib/core/model/ArkSignature.d.ts.map +1 -1
  155. package/lib/core/model/ArkSignature.js +76 -19
  156. package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -1
  157. package/lib/core/model/builder/ArkClassBuilder.js +60 -49
  158. package/lib/core/model/builder/ArkExportBuilder.d.ts.map +1 -1
  159. package/lib/core/model/builder/ArkExportBuilder.js +12 -6
  160. package/lib/core/model/builder/ArkFieldBuilder.d.ts.map +1 -1
  161. package/lib/core/model/builder/ArkFieldBuilder.js +13 -9
  162. package/lib/core/model/builder/ArkFileBuilder.js +1 -3
  163. package/lib/core/model/builder/ArkImportBuilder.d.ts +2 -1
  164. package/lib/core/model/builder/ArkImportBuilder.d.ts.map +1 -1
  165. package/lib/core/model/builder/ArkImportBuilder.js +16 -13
  166. package/lib/core/model/builder/ArkMethodBuilder.d.ts +3 -1
  167. package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
  168. package/lib/core/model/builder/ArkMethodBuilder.js +105 -45
  169. package/lib/core/model/builder/ArkNamespaceBuilder.d.ts.map +1 -1
  170. package/lib/core/model/builder/ArkNamespaceBuilder.js +4 -5
  171. package/lib/core/model/builder/builderUtils.d.ts +2 -1
  172. package/lib/core/model/builder/builderUtils.d.ts.map +1 -1
  173. package/lib/core/model/builder/builderUtils.js +63 -43
  174. package/lib/index.d.ts +2 -1
  175. package/lib/index.d.ts.map +1 -1
  176. package/lib/index.js +4 -3
  177. package/lib/save/ArkStream.js +1 -1
  178. package/lib/save/DotPrinter.d.ts.map +1 -1
  179. package/lib/save/DotPrinter.js +1 -15
  180. package/lib/save/GraphPrinter.d.ts.map +1 -1
  181. package/lib/save/GraphPrinter.js +4 -2
  182. package/lib/save/JsonPrinter.js +5 -5
  183. package/lib/save/ViewTreePrinter.d.ts +16 -0
  184. package/lib/save/ViewTreePrinter.d.ts.map +1 -0
  185. package/lib/save/ViewTreePrinter.js +130 -0
  186. package/lib/save/source/SourceBase.d.ts +2 -2
  187. package/lib/save/source/SourceBase.d.ts.map +1 -1
  188. package/lib/save/source/SourceBase.js +6 -13
  189. package/lib/save/source/SourceBody.d.ts.map +1 -1
  190. package/lib/save/source/SourceBody.js +27 -14
  191. package/lib/save/source/SourceClass.d.ts.map +1 -1
  192. package/lib/save/source/SourceClass.js +12 -8
  193. package/lib/save/source/SourceField.d.ts.map +1 -1
  194. package/lib/save/source/SourceField.js +6 -2
  195. package/lib/save/source/SourceMethod.d.ts.map +1 -1
  196. package/lib/save/source/SourceMethod.js +10 -3
  197. package/lib/save/source/SourceModule.d.ts.map +1 -1
  198. package/lib/save/source/SourceModule.js +16 -10
  199. package/lib/save/source/SourceNamespace.d.ts.map +1 -1
  200. package/lib/save/source/SourceNamespace.js +4 -0
  201. package/lib/save/source/SourceStmt.d.ts +1 -1
  202. package/lib/save/source/SourceStmt.d.ts.map +1 -1
  203. package/lib/save/source/SourceStmt.js +37 -25
  204. package/lib/save/source/SourceTransformer.d.ts +6 -0
  205. package/lib/save/source/SourceTransformer.d.ts.map +1 -1
  206. package/lib/save/source/SourceTransformer.js +82 -51
  207. package/lib/save/source/SourceUtils.d.ts.map +1 -1
  208. package/lib/save/source/SourceUtils.js +12 -11
  209. package/lib/transformer/StaticSingleAssignmentFormer.js +3 -3
  210. package/lib/utils/CfgStructualAnalysis.d.ts +1 -0
  211. package/lib/utils/CfgStructualAnalysis.d.ts.map +1 -1
  212. package/lib/utils/CfgStructualAnalysis.js +103 -72
  213. package/lib/utils/callGraphUtils.d.ts.map +1 -1
  214. package/lib/utils/callGraphUtils.js +7 -10
  215. package/lib/utils/crypto_utils.d.ts +6 -0
  216. package/lib/utils/crypto_utils.d.ts.map +1 -0
  217. package/lib/utils/crypto_utils.js +57 -0
  218. package/lib/utils/entryMethodUtils.d.ts.map +1 -1
  219. package/lib/utils/entryMethodUtils.js +27 -26
  220. package/lib/utils/getAllFiles.d.ts +1 -1
  221. package/lib/utils/getAllFiles.d.ts.map +1 -1
  222. package/lib/utils/getAllFiles.js +4 -5
  223. package/lib/utils/logger.js +2 -2
  224. package/package.json +3 -2
@@ -46,6 +46,8 @@ export declare class PointerAnalysis extends AbstractAnalysis {
46
46
  * 3. 在addDynamicCall里对传入指针过滤(已处理指针和未处理指针)
47
47
  */
48
48
  private onTheFlyDynamicCallSolve;
49
+ private processDynCallSite;
50
+ private processUnknownCallSite;
49
51
  private addToReanalyze;
50
52
  /**
51
53
  * compare interface
@@ -53,6 +55,9 @@ export declare class PointerAnalysis extends AbstractAnalysis {
53
55
  noAlias(leftValue: Value, rightValue: Value): boolean;
54
56
  mayAlias(leftValue: Value, rightValue: Value): boolean;
55
57
  getRelatedNodes(value: Value): Set<Value>;
58
+ private processRelatedNode;
59
+ private addIncomingEdgesToWorkList;
60
+ private addOutgoingEdgesToWorkList;
56
61
  private detectTypeDiff;
57
62
  getTypeDiffMap(): Map<Value, Set<Type>>;
58
63
  protected resolveCall(sourceMethod: NodeID, invokeStmt: Stmt): CallSite[];
@@ -60,5 +65,6 @@ export declare class PointerAnalysis extends AbstractAnalysis {
60
65
  getHandledFuncs(): FuncID[];
61
66
  getPTAConfig(): PointerAnalysisConfig;
62
67
  private dumpUnhandledFunctions;
68
+ mergeInstanceFieldMap(src: Map<number, number[]>, dst: Map<number, number[]>): Map<number, number[]>;
63
69
  }
64
70
  //# sourceMappingURL=PointerAnalysis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PointerAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PointerAnalysis.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAiB,QAAQ,EAAe,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAa,IAAI,EAAe,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAI5C,OAAO,EAAE,GAAG,EAAgF,MAAM,OAAO,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,qBAAa,eAAgB,SAAQ,gBAAgB;IACjD,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,GAAG,CAA6C;IACxD,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,QAAQ,CAAY;IAE5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,MAAM,CAAwB;gBAE1B,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB;IAW1E,MAAM,CAAC,8BAA8B,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,qBAAqB,GAAG,eAAe;IAuB3G,SAAS,CAAC,IAAI;IAYP,KAAK;IAMZ,OAAO,CAAC,WAAW;IAgBnB,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE;IAK/C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;IAIhC,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,SAAS;IAoBjB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAoChC,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACI,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,GAAG,OAAO;IAkCrD,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,GAAG,OAAO;IAItD,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAqDhD,OAAO,CAAC,cAAc;IA2Cf,cAAc,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAI9C,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,QAAQ,EAAE;IAIlE,iBAAiB,IAAI,MAAM,EAAE;IAI7B,eAAe,IAAI,MAAM,EAAE;IAI3B,YAAY,IAAI,qBAAqB;IAI5C,OAAO,CAAC,sBAAsB;CA+BjC"}
1
+ {"version":3,"file":"PointerAnalysis.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PointerAnalysis.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,7 @@ const Pag_1 = require("./Pag");
54
54
  const PagBuilder_1 = require("./PagBuilder");
55
55
  const PointerAnalysisConfig_1 = require("./PointerAnalysisConfig");
56
56
  const PtsDS_1 = require("./PtsDS");
57
+ const Local_1 = require("../../core/base/Local");
57
58
  const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'PTA');
58
59
  class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
59
60
  constructor(p, cg, s, config) {
@@ -181,19 +182,29 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
181
182
  return true;
182
183
  }
183
184
  handleLoadWrite(nodeID) {
185
+ var _a;
184
186
  let node = this.pag.getNode(nodeID);
187
+ let nodeValue = node.getValue();
185
188
  let diffPts = this.ptd.getDiffPts(nodeID);
186
- if (!diffPts || diffPts.count() == 0) {
189
+ if (!diffPts || diffPts.count() === 0) {
187
190
  return false;
188
191
  }
189
192
  // get related field node with current node's value
190
- let instanceFieldNodeMap = this.pag.getNodesByBaseValue(node.getValue());
191
- if (instanceFieldNodeMap === undefined) {
192
- return true;
193
+ let instanceFieldNodeMap = (_a = this.pag.getNodesByBaseValue(nodeValue)) !== null && _a !== void 0 ? _a : new Map();
194
+ // get intra procedural field node by exportMap
195
+ let intraProceduralFieldNodeMap = new Map();
196
+ if (nodeValue instanceof Local_1.Local) {
197
+ this.pagBuilder.getExportVariableMap(nodeValue).forEach((dst) => {
198
+ var _a;
199
+ let temp = (_a = this.pag.getNodesByBaseValue(dst)) !== null && _a !== void 0 ? _a : new Map();
200
+ intraProceduralFieldNodeMap = this.mergeInstanceFieldMap(instanceFieldNodeMap, temp);
201
+ });
193
202
  }
194
203
  instanceFieldNodeMap.forEach((nodeIDs, cid) => {
195
204
  // TODO: check cid
196
- if (cid != node.getCid()) {
205
+ // cid === -1 will escape the check, mainly for globalThis
206
+ let baseCid = node.getCid();
207
+ if (baseCid !== -1 && cid !== baseCid) {
197
208
  return;
198
209
  }
199
210
  nodeIDs.forEach((nodeID) => {
@@ -203,13 +214,21 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
203
214
  this.handleFieldOutEdges(fieldNode, diffPts);
204
215
  });
205
216
  });
217
+ // without cid check, because closure and export is under different cid
218
+ intraProceduralFieldNodeMap.forEach((nodeIDs) => {
219
+ nodeIDs.forEach((nodeID) => {
220
+ // get abstract field node
221
+ let fieldNode = this.pag.getNode(nodeID);
222
+ this.handleFieldInEdges(fieldNode, diffPts);
223
+ this.handleFieldOutEdges(fieldNode, diffPts);
224
+ });
225
+ });
206
226
  return true;
207
227
  }
208
228
  handleFieldInEdges(fieldNode, diffPts) {
209
229
  fieldNode.getIncomingEdge().forEach((edge) => {
210
230
  if (edge.getKind() !== Pag_1.PagEdgeKind.Write) {
211
231
  return;
212
- //throw new Error ("field node in edge is not write edge")
213
232
  }
214
233
  let srcNode = edge.getSrcNode();
215
234
  this.ptaStat.numProcessedWrite++;
@@ -271,7 +290,7 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
271
290
  }
272
291
  handlePt(nodeID) {
273
292
  let realDiff = this.ptd.calculateDiff(nodeID, nodeID);
274
- if (realDiff.count() != 0) {
293
+ if (realDiff.count() !== 0) {
275
294
  // record the updated nodes
276
295
  this.pagBuilder.addUpdatedNode(nodeID, realDiff);
277
296
  }
@@ -308,19 +327,8 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
308
327
  logger.warn(`node ${nodeID} is not local node, value: ${node.getValue()}`);
309
328
  return;
310
329
  }
311
- let dynCallSites = node.getRelatedDynCallSites();
312
- if (!dynCallSites) {
313
- logger.warn(`node ${nodeID} has no related dynamic call site`);
314
- return;
315
- }
316
- logger.info(`[process dynamic callsite] node ${nodeID}`);
317
- dynCallSites.forEach((dynCallsite) => {
318
- for (let pt of pts) {
319
- let srcNodes = this.pagBuilder.addDynamicCallEdge(dynCallsite, pt, node.getCid());
320
- changed = this.addToReanalyze(srcNodes) || changed;
321
- }
322
- processedCallSites.add(dynCallsite);
323
- });
330
+ changed = this.processDynCallSite(node, pts, processedCallSites) || changed;
331
+ changed = this.processUnknownCallSite(node, pts) || changed;
324
332
  });
325
333
  this.pagBuilder.resetUpdatedNodes();
326
334
  let srcNodes = this.pagBuilder.handleUnprocessedCallSites(processedCallSites);
@@ -329,6 +337,39 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
329
337
  this.initWorklist();
330
338
  return changed;
331
339
  }
340
+ processDynCallSite(node, pts, processedCallSites) {
341
+ let changed = false;
342
+ let dynCallSites = node.getRelatedDynCallSites();
343
+ if (!dynCallSites && !node.isSdkParam()) {
344
+ logger.warn(`node ${node.getID()} has no related dynamic call site`);
345
+ return changed;
346
+ }
347
+ logger.info(`[process dynamic callsite] node ${node.getID()}`);
348
+ dynCallSites.forEach((dynCallsite) => {
349
+ for (let pt of pts) {
350
+ let srcNodes = this.pagBuilder.addDynamicCallEdge(dynCallsite, pt, node.getCid());
351
+ changed = this.addToReanalyze(srcNodes) || changed;
352
+ }
353
+ processedCallSites.add(dynCallsite);
354
+ });
355
+ return changed;
356
+ }
357
+ processUnknownCallSite(node, pts) {
358
+ let changed = false;
359
+ let unknownCallSites = node.getRelatedUnknownCallSites();
360
+ if (!unknownCallSites) {
361
+ logger.warn(`node ${node.getID()} has no related unknown call site`);
362
+ return changed;
363
+ }
364
+ logger.info(`[process unknown callsite] node ${node.getID()}`);
365
+ unknownCallSites.forEach((unknownCallSite) => {
366
+ for (let pt of pts) {
367
+ let srcNodes = this.pagBuilder.addDynamicCallEdge(unknownCallSite, pt, node.getCid());
368
+ changed = this.addToReanalyze(srcNodes) || changed;
369
+ }
370
+ });
371
+ return changed;
372
+ }
332
373
  addToReanalyze(startNodes) {
333
374
  let flag = false;
334
375
  for (let node of startNodes) {
@@ -346,7 +387,8 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
346
387
  var _a, _b;
347
388
  let leftValueNodes = (_a = this.pag.getNodesByValue(leftValue)) === null || _a === void 0 ? void 0 : _a.values();
348
389
  let rightValueNodes = (_b = this.pag.getNodesByValue(rightValue)) === null || _b === void 0 ? void 0 : _b.values();
349
- let leftValuePts = new Set(), rightValuePts = new Set();
390
+ let leftValuePts = new Set();
391
+ let rightValuePts = new Set();
350
392
  for (let nodeID of leftValueNodes) {
351
393
  let node = this.pag.getNode(nodeID);
352
394
  for (let pt of node.getPointTo()) {
@@ -374,51 +416,59 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
374
416
  return !this.noAlias(leftValue, rightValue);
375
417
  }
376
418
  getRelatedNodes(value) {
377
- var _a;
378
- let valueNodes = (_a = this.pag.getNodesByValue(value)) === null || _a === void 0 ? void 0 : _a.values();
419
+ let valueNodes = this.pag.getNodesByValue(value);
379
420
  let relatedAllNodes = new Set();
380
421
  let workListNodes = [];
381
422
  let processedNodes = new Set();
382
- for (const nodeID of valueNodes) {
383
- workListNodes.push(nodeID);
423
+ if (valueNodes) {
424
+ for (const nodeID of valueNodes.values()) {
425
+ workListNodes.push(nodeID);
426
+ }
384
427
  }
385
428
  while (workListNodes.length !== 0) {
386
429
  let valueNodeID = workListNodes.shift();
387
430
  if (processedNodes.has(valueNodeID)) {
388
431
  continue;
389
432
  }
390
- let valueNode = this.pag.getNode(valueNodeID);
391
- let inCopyEdges = valueNode.getIncomingCopyEdges();
392
- if (!inCopyEdges) {
393
- continue;
394
- }
433
+ this.processRelatedNode(valueNodeID, workListNodes, processedNodes);
434
+ }
435
+ processedNodes.forEach(nodeID => {
436
+ let valueNode = this.pag.getNode(nodeID);
437
+ relatedAllNodes.add(valueNode.getValue());
438
+ });
439
+ return relatedAllNodes;
440
+ }
441
+ processRelatedNode(valueNodeID, workListNodes, processedNodes) {
442
+ let valueNode = this.pag.getNode(valueNodeID);
443
+ this.addIncomingEdgesToWorkList(valueNode, workListNodes, processedNodes);
444
+ this.addOutgoingEdgesToWorkList(valueNode, workListNodes, processedNodes);
445
+ processedNodes.add(valueNodeID);
446
+ }
447
+ addIncomingEdgesToWorkList(valueNode, workListNodes, processedNodes) {
448
+ let inCopyEdges = valueNode.getIncomingCopyEdges();
449
+ if (inCopyEdges) {
395
450
  inCopyEdges.forEach(edge => {
396
451
  let srcID = edge.getSrcID();
397
452
  if (!processedNodes.has(srcID)) {
398
453
  workListNodes.push(srcID);
399
454
  }
400
455
  });
401
- let outCopyEdges = valueNode.getOutgoingCopyEdges();
402
- if (!outCopyEdges) {
403
- continue;
404
- }
456
+ }
457
+ }
458
+ addOutgoingEdgesToWorkList(valueNode, workListNodes, processedNodes) {
459
+ let outCopyEdges = valueNode.getOutgoingCopyEdges();
460
+ if (outCopyEdges) {
405
461
  outCopyEdges.forEach(edge => {
406
462
  let dstID = edge.getDstID();
407
463
  if (!processedNodes.has(dstID)) {
408
464
  workListNodes.push(dstID);
409
465
  }
410
466
  });
411
- processedNodes.add(valueNodeID);
412
467
  }
413
- processedNodes.forEach(nodeID => {
414
- let valueNode = this.pag.getNode(nodeID);
415
- relatedAllNodes.add(valueNode.getValue());
416
- });
417
- return relatedAllNodes;
418
468
  }
419
469
  detectTypeDiff(nodeId) {
420
470
  var _a;
421
- if (this.config.detectTypeDiff == false) {
471
+ if (this.config.detectTypeDiff === false) {
422
472
  return;
423
473
  }
424
474
  this.typeDiffMap = (_a = this.typeDiffMap) !== null && _a !== void 0 ? _a : new Map();
@@ -431,14 +481,14 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
431
481
  }
432
482
  let findSameType = false;
433
483
  let pts = node.getPointTo();
434
- if (pts.size == 0) {
484
+ if (pts.size === 0) {
435
485
  return;
436
486
  }
437
487
  pts.forEach(pt => {
438
488
  var _a;
439
489
  let ptNode = this.pag.getNode(pt);
440
490
  let type = ptNode.getValue().getType();
441
- if (type.toString() != origType.toString()) {
491
+ if (type.toString() !== origType.toString()) {
442
492
  let diffSet = (_a = this.typeDiffMap.get(value)) !== null && _a !== void 0 ? _a : new Set();
443
493
  this.typeDiffMap.set(value, diffSet);
444
494
  if (!diffSet.has(type)) {
@@ -457,7 +507,8 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
457
507
  }
458
508
  }
459
509
  getTypeDiffMap() {
460
- return this.typeDiffMap;
510
+ var _a;
511
+ return (_a = this.typeDiffMap) !== null && _a !== void 0 ? _a : new Map();
461
512
  }
462
513
  resolveCall(sourceMethod, invokeStmt) {
463
514
  return [];
@@ -484,7 +535,7 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
484
535
  let updatedContent = '';
485
536
  this.getUnhandledFuncs().forEach(funcID => {
486
537
  let cgNode = this.cg.getNode(funcID);
487
- if (cgNode.getIsSdkMethod()) {
538
+ if (cgNode.isSdkMethod()) {
488
539
  return;
489
540
  }
490
541
  let f = this.cg.getArkMethodByFuncID(funcID);
@@ -499,5 +550,16 @@ class PointerAnalysis extends AbstractAnalysis_1.AbstractAnalysis {
499
550
  });
500
551
  });
501
552
  }
553
+ mergeInstanceFieldMap(src, dst) {
554
+ dst.forEach((value, key) => {
555
+ if (src.has(key)) {
556
+ src.set(key, [...src.get(key), ...value]);
557
+ }
558
+ else {
559
+ src.set(key, value);
560
+ }
561
+ });
562
+ return src;
563
+ }
502
564
  }
503
565
  exports.PointerAnalysis = PointerAnalysis;
@@ -1 +1 @@
1
- {"version":3,"file":"PtsDS.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PtsDS.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PtsDS.d.ts","sourceRoot":"","sources":["../../../src/callgraph/pointerAnalysis/PtsDS.ts"],"names":[],"mappings":"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"}
@@ -120,7 +120,6 @@ class DiffPTData {
120
120
  let propa = this.propaPtsMap.get(v);
121
121
  if (propa) {
122
122
  this.diffPtsMap.set(v, propa.clone());
123
- // this.propaPtsMap.set(v, new this.DSCreator());
124
123
  return true;
125
124
  }
126
125
  return false;
@@ -193,7 +192,6 @@ class DiffPTData {
193
192
  let diff = this.diffPtsMap.get(v);
194
193
  let propa = this.getPropaPtsMut(v);
195
194
  // do not clear origin propa, only copy the pt and add it to diff
196
- //let propa = this.propaPtsMap.get(v) || new this.DSCreator();
197
195
  propa.union(diff);
198
196
  diff.clear();
199
197
  }
@@ -4,14 +4,46 @@ import { Value } from './Value';
4
4
  * @category core/base
5
5
  */
6
6
  export declare class Constant implements Value {
7
- private value;
8
- private type;
9
- constructor(value: string, type?: Type);
7
+ private readonly value;
8
+ private readonly type;
9
+ constructor(value: string, type: Type);
10
+ /**
11
+ * Returns the constant's value as a **string**.
12
+ * @returns The constant's value.
13
+ */
10
14
  getValue(): string;
11
- setValue(newValue: string): void;
12
15
  getUses(): Value[];
16
+ /**
17
+ * Returns the type of this constant.
18
+ * @returns The type of this constant.
19
+ */
13
20
  getType(): Type;
14
- setType(newType: Type): void;
21
+ /**
22
+ * Get a string of constant value in Constant.
23
+ * @returns The string of constant value.
24
+ */
15
25
  toString(): string;
16
26
  }
27
+ export declare class BooleanConstant extends Constant {
28
+ private static readonly FALSE;
29
+ private static readonly TRUE;
30
+ constructor(value: boolean);
31
+ static getInstance(value: boolean): NullConstant;
32
+ }
33
+ export declare class NumberConstant extends Constant {
34
+ constructor(value: number);
35
+ }
36
+ export declare class StringConstant extends Constant {
37
+ constructor(value: string);
38
+ }
39
+ export declare class NullConstant extends Constant {
40
+ private static readonly INSTANCE;
41
+ constructor();
42
+ static getInstance(): NullConstant;
43
+ }
44
+ export declare class UndefinedConstant extends Constant {
45
+ private static readonly INSTANCE;
46
+ constructor();
47
+ static getInstance(): UndefinedConstant;
48
+ }
17
49
  //# sourceMappingURL=Constant.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Constant.d.ts","sourceRoot":"","sources":["../../../src/core/base/Constant.ts"],"names":[],"mappings":"AAeA,OAAO,EAAc,IAAI,EAAe,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC;;GAEG;AACH,qBAAa,QAAS,YAAW,KAAK;IAClC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAO;gBAEP,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,IAAgC;IAK1D,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIhC,OAAO,IAAI,KAAK,EAAE;IAIlB,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI;IAI5B,QAAQ,IAAI,MAAM;CAS5B"}
1
+ {"version":3,"file":"Constant.d.ts","sourceRoot":"","sources":["../../../src/core/base/Constant.ts"],"names":[],"mappings":"AAeA,OAAO,EAAiD,IAAI,EAAiB,MAAM,QAAQ,CAAC;AAC5F,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC;;GAEG;AACH,qBAAa,QAAS,YAAW,KAAK;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;IAKrC;;;OAGG;IACI,QAAQ,IAAI,MAAM;IAIlB,OAAO,IAAI,KAAK,EAAE;IAIzB;;;OAGG;IACI,OAAO,IAAI,IAAI;IAItB;;;OAGG;IACI,QAAQ,IAAI,MAAM;CAS5B;AAED,qBAAa,eAAgB,SAAQ,QAAQ;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAA8B;IAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAA6B;gBAE7C,KAAK,EAAE,OAAO;WAIZ,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY;CAG1D;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC5B,KAAK,EAAE,MAAM;CAG5B;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC5B,KAAK,EAAE,MAAM;CAG5B;AAED,qBAAa,YAAa,SAAQ,QAAQ;IACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAsB;;WAMxC,WAAW,IAAI,YAAY;CAG5C;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA2B;;WAM7C,WAAW,IAAI,iBAAiB;CAGjD"}
@@ -14,31 +14,38 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.Constant = void 0;
17
+ exports.UndefinedConstant = exports.NullConstant = exports.StringConstant = exports.NumberConstant = exports.BooleanConstant = exports.Constant = void 0;
18
18
  const Type_1 = require("./Type");
19
+ const TSConst_1 = require("../common/TSConst");
19
20
  /**
20
21
  * @category core/base
21
22
  */
22
23
  class Constant {
23
- constructor(value, type = Type_1.UnknownType.getInstance()) {
24
+ constructor(value, type) {
24
25
  this.value = value;
25
26
  this.type = type;
26
27
  }
28
+ /**
29
+ * Returns the constant's value as a **string**.
30
+ * @returns The constant's value.
31
+ */
27
32
  getValue() {
28
33
  return this.value;
29
34
  }
30
- setValue(newValue) {
31
- this.value = newValue;
32
- }
33
35
  getUses() {
34
36
  return [];
35
37
  }
38
+ /**
39
+ * Returns the type of this constant.
40
+ * @returns The type of this constant.
41
+ */
36
42
  getType() {
37
43
  return this.type;
38
44
  }
39
- setType(newType) {
40
- this.type = newType;
41
- }
45
+ /**
46
+ * Get a string of constant value in Constant.
47
+ * @returns The string of constant value.
48
+ */
42
49
  toString() {
43
50
  let str = '';
44
51
  if (this.type instanceof Type_1.StringType) {
@@ -51,3 +58,46 @@ class Constant {
51
58
  }
52
59
  }
53
60
  exports.Constant = Constant;
61
+ class BooleanConstant extends Constant {
62
+ constructor(value) {
63
+ super(value.toString(), Type_1.BooleanType.getInstance());
64
+ }
65
+ static getInstance(value) {
66
+ return value ? this.TRUE : this.FALSE;
67
+ }
68
+ }
69
+ exports.BooleanConstant = BooleanConstant;
70
+ BooleanConstant.FALSE = new BooleanConstant(false);
71
+ BooleanConstant.TRUE = new BooleanConstant(true);
72
+ class NumberConstant extends Constant {
73
+ constructor(value) {
74
+ super(value.toString(), Type_1.NumberType.getInstance());
75
+ }
76
+ }
77
+ exports.NumberConstant = NumberConstant;
78
+ class StringConstant extends Constant {
79
+ constructor(value) {
80
+ super(value.toString(), Type_1.StringType.getInstance());
81
+ }
82
+ }
83
+ exports.StringConstant = StringConstant;
84
+ class NullConstant extends Constant {
85
+ constructor() {
86
+ super(TSConst_1.NULL_KEYWORD, Type_1.NullType.getInstance());
87
+ }
88
+ static getInstance() {
89
+ return this.INSTANCE;
90
+ }
91
+ }
92
+ exports.NullConstant = NullConstant;
93
+ NullConstant.INSTANCE = new NullConstant();
94
+ class UndefinedConstant extends Constant {
95
+ constructor() {
96
+ super(TSConst_1.UNDEFINED_KEYWORD, Type_1.UndefinedType.getInstance());
97
+ }
98
+ static getInstance() {
99
+ return this.INSTANCE;
100
+ }
101
+ }
102
+ exports.UndefinedConstant = UndefinedConstant;
103
+ UndefinedConstant.INSTANCE = new UndefinedConstant();