svf-tools 1.0.333 → 1.0.337

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 (315) hide show
  1. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +1 -1
  2. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +7 -7
  3. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +4 -4
  4. package/SVF-doxygen/html/html/Andersen_8h_source.html +2 -2
  5. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +18 -9
  6. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +8 -8
  7. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +4 -4
  8. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
  9. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +2 -2
  10. package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +3 -3
  11. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
  12. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
  13. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +3 -3
  14. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +3 -3
  15. package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +6 -6
  16. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
  17. package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +3 -3
  18. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +5 -2
  19. package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +1 -1
  20. package/SVF-doxygen/html/html/ICFGNode_8h_source.html +4 -4
  21. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +17 -17
  22. package/SVF-doxygen/html/html/ICFG_8h_source.html +38 -37
  23. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +3 -3
  24. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +5 -5
  25. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +1 -1
  26. package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +2 -2
  27. package/SVF-doxygen/html/html/MTA_8cpp_source.html +2 -2
  28. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +6 -6
  29. package/SVF-doxygen/html/html/MemRegion_8h_source.html +2 -2
  30. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +3 -3
  31. package/SVF-doxygen/html/html/MemSSA_8h_source.html +2 -2
  32. package/SVF-doxygen/html/html/OfflineConsG_8cpp_source.html +1 -1
  33. package/SVF-doxygen/html/html/PAGBuilderFromFile_8cpp_source.html +2 -2
  34. package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +2 -2
  35. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +9 -9
  36. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +5 -5
  37. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +24 -27
  38. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +42 -43
  39. package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +1 -1
  40. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +2 -2
  41. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp.html +1 -0
  42. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +6 -5
  43. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +50 -50
  44. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +35 -35
  45. package/SVF-doxygen/html/html/SVFIR_8h_source.html +25 -25
  46. package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +22 -21
  47. package/SVF-doxygen/html/html/SVFStatements_8h.html +14 -12
  48. package/SVF-doxygen/html/html/SVFStatements_8h_source.html +131 -122
  49. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +17 -17
  50. package/SVF-doxygen/html/html/SVFVariables_8h_source.html +131 -128
  51. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +7 -7
  52. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
  53. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +5 -4
  54. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +3 -3
  55. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
  56. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +11 -11
  57. package/SVF-doxygen/html/html/VFGNode_8h_source.html +13 -13
  58. package/SVF-doxygen/html/html/VFG_8cpp_source.html +26 -26
  59. package/SVF-doxygen/html/html/VFG_8h_source.html +19 -18
  60. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
  61. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +2 -2
  62. package/SVF-doxygen/html/html/annotated.html +271 -270
  63. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt-members.html +16 -10
  64. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +36 -14
  65. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.png +0 -0
  66. package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +2 -2
  67. package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +187 -188
  68. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +8 -11
  69. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +160 -161
  70. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +4 -7
  71. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +199 -200
  72. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +0 -3
  73. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +202 -203
  74. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +0 -3
  75. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +195 -196
  76. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +0 -3
  77. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +196 -197
  78. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +0 -3
  79. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +205 -206
  80. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +1 -4
  81. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +7 -7
  82. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +193 -194
  83. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +0 -3
  84. package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +2 -2
  85. package/SVF-doxygen/html/html/classSVF_1_1AssignStmt-members.html +145 -0
  86. package/SVF-doxygen/html/html/classSVF_1_1AssignStmt.html +770 -0
  87. package/SVF-doxygen/html/html/classSVF_1_1AssignStmt.png +0 -0
  88. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +116 -117
  89. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +12 -15
  90. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt-members.html +7 -11
  91. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +23 -142
  92. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -3
  93. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt-members.html +2 -2
  94. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +46 -46
  95. package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +4 -4
  96. package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode-members.html +3 -3
  97. package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode.html +18 -18
  98. package/SVF-doxygen/html/html/classSVF_1_1CallPE-members.html +19 -13
  99. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +44 -22
  100. package/SVF-doxygen/html/html/classSVF_1_1CallPE.png +0 -0
  101. package/SVF-doxygen/html/html/classSVF_1_1CloneDummyObjVar-members.html +37 -40
  102. package/SVF-doxygen/html/html/classSVF_1_1CloneDummyObjVar.html +14 -22
  103. package/SVF-doxygen/html/html/classSVF_1_1CloneFIObjVar-members.html +37 -40
  104. package/SVF-doxygen/html/html/classSVF_1_1CloneFIObjVar.html +15 -23
  105. package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar-members.html +38 -41
  106. package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar.html +15 -23
  107. package/SVF-doxygen/html/html/classSVF_1_1CmpStmt-members.html +7 -11
  108. package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +24 -143
  109. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -3
  110. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl-members.html +104 -105
  111. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +5 -8
  112. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +17 -10
  113. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA-members.html +182 -183
  114. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +13 -16
  115. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt-members.html +16 -10
  116. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +36 -14
  117. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.png +0 -0
  118. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +5 -5
  119. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +3 -3
  120. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar-members.html +37 -40
  121. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +16 -24
  122. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar-members.html +36 -39
  123. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +15 -23
  124. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar-members.html +37 -40
  125. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +21 -29
  126. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +219 -220
  127. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +0 -3
  128. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +180 -181
  129. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +10 -13
  130. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +212 -213
  131. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +18 -21
  132. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +5 -5
  133. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +244 -245
  134. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +8 -11
  135. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
  136. package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.html +3 -9
  137. package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.png +0 -0
  138. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar-members.html +39 -42
  139. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +39 -47
  140. package/SVF-doxygen/html/html/classSVF_1_1GepStmt-members.html +16 -10
  141. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +42 -20
  142. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.png +0 -0
  143. package/SVF-doxygen/html/html/classSVF_1_1GepValVar-members.html +37 -40
  144. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +32 -40
  145. package/SVF-doxygen/html/html/classSVF_1_1ICFG-members.html +27 -26
  146. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +183 -116
  147. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +10 -5
  148. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter-members.html +9 -9
  149. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +37 -36
  150. package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +2 -2
  151. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
  152. package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +2 -2
  153. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +1 -1
  154. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt-members.html +16 -10
  155. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +37 -15
  156. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.png +0 -0
  157. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +10 -10
  158. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
  159. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +1 -1
  160. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +7 -7
  161. package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt-members.html +36 -29
  162. package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt.html +252 -33
  163. package/SVF-doxygen/html/html/classSVF_1_1NormalGepStmt-members.html +17 -11
  164. package/SVF-doxygen/html/html/classSVF_1_1NormalGepStmt.html +40 -18
  165. package/SVF-doxygen/html/html/classSVF_1_1NormalGepStmt.png +0 -0
  166. package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +1 -1
  167. package/SVF-doxygen/html/html/classSVF_1_1ObjVar-members.html +37 -40
  168. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +34 -42
  169. package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +2 -2
  170. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +4 -4
  171. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +2 -2
  172. package/SVF-doxygen/html/html/classSVF_1_1PhiStmt-members.html +41 -44
  173. package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +32 -127
  174. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis-members.html +78 -79
  175. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +111 -151
  176. package/SVF-doxygen/html/html/classSVF_1_1RetPE-members.html +16 -10
  177. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +44 -22
  178. package/SVF-doxygen/html/html/classSVF_1_1RetPE.png +0 -0
  179. package/SVF-doxygen/html/html/classSVF_1_1RetPN-members.html +36 -39
  180. package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +16 -24
  181. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +2 -2
  182. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +1 -1
  183. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +39 -39
  184. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +122 -115
  185. package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.html +12 -8
  186. package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.png +0 -0
  187. package/SVF-doxygen/html/html/classSVF_1_1SVFVar-members.html +28 -25
  188. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +185 -107
  189. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +7 -7
  190. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +1 -1
  191. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +171 -172
  192. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +0 -3
  193. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt-members.html +16 -10
  194. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +37 -15
  195. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.png +0 -0
  196. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +13 -9
  197. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE-members.html +18 -12
  198. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +36 -14
  199. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.png +0 -0
  200. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE-members.html +17 -11
  201. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +36 -14
  202. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.png +0 -0
  203. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +2 -2
  204. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +161 -162
  205. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +3 -6
  206. package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +17 -17
  207. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt-members.html +2 -2
  208. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +38 -38
  209. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +2 -2
  210. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +36 -36
  211. package/SVF-doxygen/html/html/classSVF_1_1ValVar-members.html +36 -39
  212. package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +19 -27
  213. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN-members.html +36 -39
  214. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +16 -24
  215. package/SVF-doxygen/html/html/classSVF_1_1VariantGepStmt-members.html +17 -11
  216. package/SVF-doxygen/html/html/classSVF_1_1VariantGepStmt.html +38 -16
  217. package/SVF-doxygen/html/html/classSVF_1_1VariantGepStmt.png +0 -0
  218. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +254 -255
  219. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +2 -5
  220. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +2 -2
  221. package/SVF-doxygen/html/html/classes.html +91 -93
  222. package/SVF-doxygen/html/html/functions_a.html +14 -11
  223. package/SVF-doxygen/html/html/functions_c.html +16 -15
  224. package/SVF-doxygen/html/html/functions_d.html +0 -3
  225. package/SVF-doxygen/html/html/functions_func.html +7 -4
  226. package/SVF-doxygen/html/html/functions_func_c.html +24 -23
  227. package/SVF-doxygen/html/html/functions_func_d.html +0 -3
  228. package/SVF-doxygen/html/html/functions_func_g.html +27 -19
  229. package/SVF-doxygen/html/html/functions_func_i.html +13 -10
  230. package/SVF-doxygen/html/html/functions_func_o.html +5 -3
  231. package/SVF-doxygen/html/html/functions_func_t.html +1 -0
  232. package/SVF-doxygen/html/html/functions_g.html +31 -23
  233. package/SVF-doxygen/html/html/functions_i.html +11 -6
  234. package/SVF-doxygen/html/html/functions_l.html +3 -3
  235. package/SVF-doxygen/html/html/functions_m.html +1 -1
  236. package/SVF-doxygen/html/html/functions_n.html +3 -3
  237. package/SVF-doxygen/html/html/functions_o.html +11 -9
  238. package/SVF-doxygen/html/html/functions_p.html +15 -11
  239. package/SVF-doxygen/html/html/functions_rela.html +59 -1
  240. package/SVF-doxygen/html/html/functions_s.html +9 -8
  241. package/SVF-doxygen/html/html/functions_t.html +5 -4
  242. package/SVF-doxygen/html/html/functions_type.html +2 -2
  243. package/SVF-doxygen/html/html/functions_v.html +8 -7
  244. package/SVF-doxygen/html/html/functions_vars_a.html +1 -1
  245. package/SVF-doxygen/html/html/functions_w.html +9 -5
  246. package/SVF-doxygen/html/html/hierarchy.html +17 -16
  247. package/SVF-doxygen/html/html/menudata.js +13 -1
  248. package/SVF-doxygen/html/html/namespaceSVF.html +2 -0
  249. package/SVF-doxygen/html/html/search/all_1.js +3 -2
  250. package/SVF-doxygen/html/html/search/all_10.js +9 -9
  251. package/SVF-doxygen/html/html/search/all_12.js +1 -1
  252. package/SVF-doxygen/html/html/search/all_13.js +6 -6
  253. package/SVF-doxygen/html/html/search/all_14.js +7 -7
  254. package/SVF-doxygen/html/html/search/all_16.js +2 -2
  255. package/SVF-doxygen/html/html/search/all_17.js +1 -1
  256. package/SVF-doxygen/html/html/search/all_3.js +2 -2
  257. package/SVF-doxygen/html/html/search/all_4.js +0 -1
  258. package/SVF-doxygen/html/html/search/all_7.js +9 -5
  259. package/SVF-doxygen/html/html/search/all_9.js +3 -2
  260. package/SVF-doxygen/html/html/search/all_c.js +2 -2
  261. package/SVF-doxygen/html/html/search/all_d.js +2 -2
  262. package/SVF-doxygen/html/html/search/all_e.js +2 -2
  263. package/SVF-doxygen/html/html/search/all_f.js +2 -2
  264. package/SVF-doxygen/html/html/search/classes_0.js +2 -1
  265. package/SVF-doxygen/html/html/search/functions_0.js +1 -0
  266. package/SVF-doxygen/html/html/search/functions_11.js +1 -1
  267. package/SVF-doxygen/html/html/search/functions_2.js +1 -1
  268. package/SVF-doxygen/html/html/search/functions_3.js +0 -1
  269. package/SVF-doxygen/html/html/search/functions_6.js +9 -5
  270. package/SVF-doxygen/html/html/search/functions_8.js +1 -0
  271. package/SVF-doxygen/html/html/search/functions_b.js +1 -1
  272. package/SVF-doxygen/html/html/search/functions_d.js +1 -1
  273. package/SVF-doxygen/html/html/search/functions_e.js +1 -1
  274. package/SVF-doxygen/html/html/search/related_4.js +2 -2
  275. package/SVF-doxygen/html/html/search/related_5.js +2 -1
  276. package/SVF-doxygen/html/html/search/related_6.js +1 -4
  277. package/SVF-doxygen/html/html/search/related_7.js +4 -1
  278. package/SVF-doxygen/html/html/search/related_8.js +1 -5
  279. package/SVF-doxygen/html/html/search/related_9.js +6 -2
  280. package/SVF-doxygen/html/html/search/related_a.js +2 -1
  281. package/SVF-doxygen/html/html/search/related_b.html +26 -0
  282. package/SVF-doxygen/html/html/search/related_b.js +5 -0
  283. package/SVF-doxygen/html/html/search/searchdata.js +1 -1
  284. package/SVF-doxygen/html/html/search/typedefs_0.js +1 -1
  285. package/SVF-doxygen/html/html/search/variables_1.js +1 -1
  286. package/SVF-doxygen/html/html/search/variables_14.js +3 -3
  287. package/SVF-doxygen/html/html/search/variables_d.js +1 -1
  288. package/SVF-doxygen/html/html/search/variables_e.js +1 -1
  289. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
  290. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +1 -1
  291. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +3 -3
  292. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01OfflineConsG_01_5_01_4.html +1 -1
  293. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4.html +1 -1
  294. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4.html +1 -1
  295. package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFG_01_5_01_4.html +2 -2
  296. package/SVF-doxygen/html/html/svf-ex_8cpp.html +3 -3
  297. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +3 -3
  298. package/images/svf-stat.pdf +0 -0
  299. package/include/Graphs/ICFG.h +5 -3
  300. package/include/Graphs/ICFGNode.h +3 -3
  301. package/include/Graphs/VFG.h +4 -4
  302. package/include/MemoryModel/PointerAnalysis.h +0 -3
  303. package/include/MemoryModel/SVFStatements.h +382 -308
  304. package/include/MemoryModel/SVFVariables.h +22 -21
  305. package/lib/Graphs/ConsG.cpp +24 -24
  306. package/lib/Graphs/ICFG.cpp +2 -2
  307. package/lib/Graphs/VFG.cpp +10 -10
  308. package/lib/MSSA/MemRegion.cpp +5 -5
  309. package/lib/MemoryModel/PointerAnalysis.cpp +1 -21
  310. package/lib/MemoryModel/SVFIR.cpp +2 -2
  311. package/lib/MemoryModel/SVFStatements.cpp +21 -12
  312. package/lib/SVF-FE/ICFGBuilder.cpp +17 -2
  313. package/lib/SVF-FE/SVFIRBuilder.cpp +13 -0
  314. package/lib/SVF-FE/SymbolTableBuilder.cpp +16 -3
  315. package/package.json +1 -1
@@ -190,16 +190,89 @@ private:
190
190
  static u64_t multiOpndLabelCounter; ///< MultiOpndStmt counter
191
191
  };
192
192
 
193
+ /*
194
+ Parent class of Addr, Copy, Store, Load, Call, Ret, NormalGep, VariantGep, ThreadFork, ThreadJoin
195
+ connecting RHS expression and LHS expression with an assignment (e.g., LHSExpr = RHSExpr)
196
+ Only one operand on the right handside of an assignment
197
+ */
198
+ class AssignStmt : public SVFStmt{
199
+
200
+ private:
201
+ AssignStmt(); ///< place holder
202
+ AssignStmt(const AssignStmt &); ///< place holder
203
+ void operator=(const AssignStmt &); ///< place holder
204
+ SVFVar* getSrcNode(); ///< not allowed, use getRHSVar() instead
205
+ SVFVar* getDstNode(); ///< not allowed, use getLHSVar() instead
206
+ NodeID getSrcID(); ///< not allowed, use getRHSVarID() instead
207
+ NodeID getDstID(); ///< not allowed, use getLHSVarID() instead
208
+
209
+ protected:
210
+ /// constructor
211
+ AssignStmt(SVFVar* s, SVFVar* d, GEdgeFlag k) : SVFStmt(s,d,k)
212
+ {
213
+ }
214
+
215
+ public:
216
+ /// Methods for support type inquiry through isa, cast, and dyn_cast:
217
+ //@{
218
+ static inline bool classof(const AssignStmt *)
219
+ {
220
+ return true;
221
+ }
222
+ static inline bool classof(const SVFStmt *edge)
223
+ {
224
+ return edge->getEdgeKind() == SVFStmt::Addr ||
225
+ edge->getEdgeKind() == SVFStmt::Copy ||
226
+ edge->getEdgeKind() == SVFStmt::Store ||
227
+ edge->getEdgeKind() == SVFStmt::Load ||
228
+ edge->getEdgeKind() == SVFStmt::Call ||
229
+ edge->getEdgeKind() == SVFStmt::Ret ||
230
+ edge->getEdgeKind() == SVFStmt::NormalGep ||
231
+ edge->getEdgeKind() == SVFStmt::VariantGep ||
232
+ edge->getEdgeKind() == SVFStmt::ThreadFork ||
233
+ edge->getEdgeKind() == SVFStmt::ThreadJoin;
234
+ }
235
+ static inline bool classof(const GenericPAGEdgeTy *edge)
236
+ {
237
+ return edge->getEdgeKind() == SVFStmt::Addr ||
238
+ edge->getEdgeKind() == SVFStmt::Copy ||
239
+ edge->getEdgeKind() == SVFStmt::Store ||
240
+ edge->getEdgeKind() == SVFStmt::Load ||
241
+ edge->getEdgeKind() == SVFStmt::Call ||
242
+ edge->getEdgeKind() == SVFStmt::Ret ||
243
+ edge->getEdgeKind() == SVFStmt::NormalGep ||
244
+ edge->getEdgeKind() == SVFStmt::VariantGep ||
245
+ edge->getEdgeKind() == SVFStmt::ThreadFork ||
246
+ edge->getEdgeKind() == SVFStmt::ThreadJoin;
247
+ }
248
+ //@}
249
+
250
+ inline SVFVar* getRHSVar() const {
251
+ return SVFStmt::getSrcNode();
252
+ }
253
+ inline SVFVar* getLHSVar() const {
254
+ return SVFStmt::getDstNode();
255
+ }
256
+ inline NodeID getRHSVarID() const {
257
+ return SVFStmt::getSrcID();
258
+ }
259
+ inline NodeID getLHSVarID() const {
260
+ return SVFStmt::getDstID();
261
+ }
262
+
263
+ virtual const std::string toString() const = 0;
264
+ };
193
265
 
194
266
  /*!
195
267
  * Address statement (memory allocations)
196
268
  */
197
- class AddrStmt: public SVFStmt
269
+ class AddrStmt: public AssignStmt
198
270
  {
199
271
  private:
200
272
  AddrStmt(); ///< place holder
201
273
  AddrStmt(const AddrStmt &); ///< place holder
202
274
  void operator=(const AddrStmt &); ///< place holder
275
+
203
276
  public:
204
277
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
205
278
  //@{
@@ -218,7 +291,7 @@ public:
218
291
  //@}
219
292
 
220
293
  /// constructor
221
- AddrStmt(SVFVar* s, SVFVar* d) : SVFStmt(s,d,SVFStmt::Addr)
294
+ AddrStmt(SVFVar* s, SVFVar* d) : AssignStmt(s,d,SVFStmt::Addr)
222
295
  {
223
296
  }
224
297
 
@@ -229,7 +302,7 @@ public:
229
302
  /*!
230
303
  * Copy statements (simple assignment and casting)
231
304
  */
232
- class CopyStmt: public SVFStmt
305
+ class CopyStmt: public AssignStmt
233
306
  {
234
307
  private:
235
308
  CopyStmt(); ///< place holder
@@ -253,646 +326,647 @@ public:
253
326
  //@}
254
327
 
255
328
  /// constructor
256
- CopyStmt(SVFVar* s, SVFVar* d) : SVFStmt(s,d,SVFStmt::Copy)
329
+ CopyStmt(SVFVar* s, SVFVar* d) : AssignStmt(s,d,SVFStmt::Copy)
257
330
  {
258
331
  }
259
332
 
260
333
  virtual const std::string toString() const override;
261
334
  };
262
335
 
263
- /*
264
- * Program statements with multiple operands including BinaryOPStmt, CmpStmt and PhiStmt
265
- */
266
- class MultiOpndStmt : public SVFStmt{
267
- public:
268
- typedef std::vector<SVFVar*> OPVars;
269
- protected:
270
- OPVars opVars;
336
+ /*!
337
+ * Store statement
338
+ */
339
+ class StoreStmt: public AssignStmt
340
+ {
341
+ private:
342
+ StoreStmt(); ///< place holder
343
+ StoreStmt(const StoreStmt &); ///< place holder
344
+ void operator=(const StoreStmt &); ///< place holder
345
+
271
346
  public:
272
- /// Constructor, only used by subclassess but not external users
273
- MultiOpndStmt(SVFVar* r, const OPVars& opnds, GEdgeFlag k): SVFStmt(opnds.at(0), r, k), opVars(opnds)
274
- {
275
- }
276
347
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
277
348
  //@{
278
- static inline bool classof(const MultiOpndStmt *)
349
+ static inline bool classof(const StoreStmt *)
279
350
  {
280
351
  return true;
281
352
  }
282
- static inline bool classof(const SVFStmt *node)
353
+ static inline bool classof(const SVFStmt *edge)
283
354
  {
284
- return node->getEdgeKind() == Phi ||
285
- node->getEdgeKind() == BinaryOp ||
286
- node->getEdgeKind() == Cmp;
355
+ return edge->getEdgeKind() == SVFStmt::Store;
287
356
  }
288
- static inline bool classof(const GenericPAGEdgeTy *node)
357
+ static inline bool classof(const GenericPAGEdgeTy *edge)
289
358
  {
290
- return node->getEdgeKind() == Phi ||
291
- node->getEdgeKind() == BinaryOp ||
292
- node->getEdgeKind() == Cmp;
359
+ return edge->getEdgeKind() == SVFStmt::Store;
293
360
  }
294
361
  //@}
295
- /// Operands and result at a BinaryNode e.g., p = q + r, `p` is resVar and `r` is OpVar
296
- //@{
297
- /// Operand SVFVars
298
- inline const SVFVar* getOpVar(u32_t pos) const
299
- {
300
- return opVars.at(pos);
301
- }
302
- /// Result SVFVar
303
- inline const SVFVar* getRes() const
304
- {
305
- return getDstNode();
306
- }
307
-
308
- NodeID getOpVarID(u32_t pos) const;
309
- NodeID getResID() const;
310
362
 
311
- inline u32_t getOpVarNum() const
312
- {
313
- return opVars.size();
314
- }
315
- inline const OPVars& getOpndVars() const{
316
- return opVars;
317
- }
318
- inline OPVars::const_iterator opVarBegin() const
319
- {
320
- return opVars.begin();
321
- }
322
- inline OPVars::const_iterator opVerEnd() const
363
+ /// constructor
364
+ StoreStmt(SVFVar* s, SVFVar* d, const IntraBlockNode* st) :
365
+ AssignStmt(s, d, makeEdgeFlagWithStoreInst(SVFStmt::Store, st))
323
366
  {
324
- return opVars.end();
325
367
  }
326
- //@}
368
+
369
+ virtual const std::string toString() const override;
327
370
  };
328
371
 
372
+
329
373
  /*!
330
- * Phi statement (e.g., p = phi(q,r) which receives values from variables q and r from different paths)
331
- * it is typically at a joint point of the control-flow graph
374
+ * Load statement
332
375
  */
333
- class PhiStmt: public MultiOpndStmt
376
+ class LoadStmt: public AssignStmt
334
377
  {
335
378
  private:
336
- PhiStmt(); ///< place holder
337
- PhiStmt(const PhiStmt &); ///< place holder
338
- void operator=(const PhiStmt &); ///< place holder
339
- SVFVar* getSrcNode(); ///< place holder, not allowed since this SVFStmt has multiple operands but not a single source
340
- SVFVar* getDstNode(); ///< place holder, use getRes() instead
341
- SVFVar* getSrcID(); ///< place holder, use getOpVarID(pos) instead
342
- SVFVar* getDstID(); ///< place holder, use getResID() instead
379
+ LoadStmt(); ///< place holder
380
+ LoadStmt(const LoadStmt &); ///< place holder
381
+ void operator=(const LoadStmt &); ///< place holder
343
382
 
344
383
  public:
345
384
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
346
385
  //@{
347
- static inline bool classof(const PhiStmt *)
386
+ static inline bool classof(const LoadStmt *)
348
387
  {
349
388
  return true;
350
389
  }
351
390
  static inline bool classof(const SVFStmt *edge)
352
391
  {
353
- return edge->getEdgeKind() == SVFStmt::Phi;
354
- }
355
- static inline bool classof(const MultiOpndStmt *edge)
356
- {
357
- return edge->getEdgeKind() == SVFStmt::Phi;
392
+ return edge->getEdgeKind() == SVFStmt::Load;
358
393
  }
359
394
  static inline bool classof(const GenericPAGEdgeTy *edge)
360
395
  {
361
- return edge->getEdgeKind() == SVFStmt::Phi;
396
+ return edge->getEdgeKind() == SVFStmt::Load;
362
397
  }
363
398
  //@}
364
399
 
365
400
  /// constructor
366
- PhiStmt(SVFVar* s, const OPVars& opnds) : MultiOpndStmt(s,opnds,SVFStmt::Phi)
401
+ LoadStmt(SVFVar* s, SVFVar* d) : AssignStmt(s,d,SVFStmt::Load)
367
402
  {
368
403
  }
369
- void addOpVar(SVFVar* op){
370
- opVars.push_back(op);
371
- }
404
+
372
405
  virtual const std::string toString() const override;
373
406
  };
374
407
 
375
408
 
376
409
  /*!
377
- * Comparison statement
410
+ * Gep statement for struct field access, array access and pointer arithmetic
378
411
  */
379
- class CmpStmt: public MultiOpndStmt
412
+ class GepStmt: public AssignStmt
380
413
  {
381
414
  private:
382
- CmpStmt(); ///< place holder
383
- CmpStmt(const CmpStmt &); ///< place holder
384
- void operator=(const CmpStmt &); ///< place holder
385
- SVFVar* getSrcNode(); ///< place holder, not allowed since this SVFStmt has multiple operands but not a single source
386
- SVFVar* getDstNode(); ///< place holder, use getRes() instead
387
- SVFVar* getSrcID(); ///< place holder, use getOpVarID(pos) instead
388
- SVFVar* getDstID(); ///< place holder, use getResID() instead
415
+ GepStmt(); ///< place holder
416
+ GepStmt(const GepStmt &); ///< place holder
417
+ void operator=(const GepStmt &); ///< place holder
418
+
419
+ LocationSet ls; ///< location set of the gep edge
389
420
 
390
- u32_t predicate;
391
421
  public:
392
422
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
393
423
  //@{
394
- static inline bool classof(const CmpStmt *)
424
+ static inline bool classof(const GepStmt *)
395
425
  {
396
426
  return true;
397
427
  }
398
428
  static inline bool classof(const SVFStmt *edge)
399
429
  {
400
- return edge->getEdgeKind() == SVFStmt::Cmp;
401
- }
402
- static inline bool classof(const MultiOpndStmt *edge)
403
- {
404
- return edge->getEdgeKind() == SVFStmt::Cmp;
430
+ return edge->getEdgeKind() == SVFStmt::NormalGep ||
431
+ edge->getEdgeKind() == SVFStmt::VariantGep;
405
432
  }
406
433
  static inline bool classof(const GenericPAGEdgeTy *edge)
407
434
  {
408
- return edge->getEdgeKind() == SVFStmt::Cmp;
435
+ return edge->getEdgeKind() == SVFStmt::NormalGep ||
436
+ edge->getEdgeKind() == SVFStmt::VariantGep;
409
437
  }
410
438
  //@}
411
439
 
412
- /// constructor
413
- CmpStmt(SVFVar* s, const OPVars& opnds, u32_t pre) : MultiOpndStmt(s,opnds,SVFStmt::Cmp), predicate(pre)
440
+ inline const LocationSet& getLocationSet() const
414
441
  {
442
+ return ls;
415
443
  }
416
444
 
417
- u32_t getPredicate() const
445
+ protected:
446
+ /// constructor
447
+ GepStmt(SVFVar* s, SVFVar* d, const LocationSet& l, PEDGEK k) : AssignStmt(s,d,k), ls(l)
418
448
  {
419
- return predicate;
420
449
  }
421
-
422
- virtual const std::string toString() const override;
450
+
451
+ virtual const std::string toString() const;
452
+
423
453
  };
424
454
 
425
455
 
426
456
  /*!
427
- * Binary statement
457
+ * Gep statement with a fixed field index for struct field access
428
458
  */
429
- class BinaryOPStmt: public MultiOpndStmt
459
+ class NormalGepStmt : public GepStmt
430
460
  {
431
461
  private:
432
- BinaryOPStmt(); ///< place holder
433
- BinaryOPStmt(const BinaryOPStmt &); ///< place holder
434
- void operator=(const BinaryOPStmt &); ///< place holder
435
- SVFVar* getSrcNode(); ///< place holder, not allowed since this SVFStmt has multiple operands but not a single source
436
- SVFVar* getDstNode(); ///< place holder, use getRes() instead
437
- SVFVar* getSrcID(); ///< place holder, use getOpVarID(pos) instead
438
- SVFVar* getDstID(); ///< place holder, use getResID() instead
439
-
440
- u32_t opcode;
462
+ NormalGepStmt(); ///< place holder
463
+ NormalGepStmt(const NormalGepStmt&); ///< place holder
464
+ void operator=(const NormalGepStmt&); ///< place holder
441
465
 
442
466
  public:
443
467
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
444
468
  //@{
445
- static inline bool classof(const BinaryOPStmt *)
469
+ static inline bool classof(const NormalGepStmt *)
446
470
  {
447
471
  return true;
448
472
  }
449
- static inline bool classof(const SVFStmt *edge)
473
+ static inline bool classof(const GepStmt *edge)
450
474
  {
451
- return edge->getEdgeKind() == SVFStmt::BinaryOp;
475
+ return edge->getEdgeKind() == SVFStmt::NormalGep;
452
476
  }
453
- static inline bool classof(const MultiOpndStmt *edge)
477
+ static inline bool classof(const SVFStmt *edge)
454
478
  {
455
- return edge->getEdgeKind() == SVFStmt::BinaryOp;
479
+ return edge->getEdgeKind() == SVFStmt::NormalGep;
456
480
  }
457
481
  static inline bool classof(const GenericPAGEdgeTy *edge)
458
482
  {
459
- return edge->getEdgeKind() == SVFStmt::BinaryOp;
483
+ return edge->getEdgeKind() == SVFStmt::NormalGep;
460
484
  }
461
485
  //@}
462
486
 
463
487
  /// constructor
464
- BinaryOPStmt(SVFVar* s, const OPVars& opnds, u32_t oc) : MultiOpndStmt(s,opnds,SVFStmt::BinaryOp), opcode(oc)
465
- {
466
- }
488
+ NormalGepStmt(SVFVar* s, SVFVar* d, const LocationSet& l) : GepStmt(s,d,l, SVFStmt::NormalGep)
489
+ {}
467
490
 
468
- u32_t getOpcode() const
491
+ /// offset of the gep edge
492
+ inline u32_t getFieldOffset() const
469
493
  {
470
- return opcode;
494
+ return getLocationSet().accumulateConstantFieldIdx();
471
495
  }
472
496
 
473
497
  virtual const std::string toString() const override;
474
498
  };
475
499
 
476
500
  /*!
477
- * Unary statement
501
+ * Gep statement with a variant field index for struct field access
478
502
  */
479
- class UnaryOPStmt: public SVFStmt
503
+ class VariantGepStmt : public GepStmt
480
504
  {
481
505
  private:
482
- UnaryOPStmt(); ///< place holder
483
- UnaryOPStmt(const UnaryOPStmt &); ///< place holder
484
- void operator=(const UnaryOPStmt &); ///< place holder
485
- SVFVar* getSrcNode(); ///< place holder, use getOpVar() instead
486
- SVFVar* getDstNode(); ///< place holder, use getRes() instead
487
- SVFVar* getSrcID(); ///< place holder, use getOpVarID() instead
488
- SVFVar* getDstID(); ///< place holder, use getResID() instead
506
+ VariantGepStmt(); ///< place holder
507
+ VariantGepStmt(const VariantGepStmt&); ///< place holder
508
+ void operator=(const VariantGepStmt&); ///< place holder
489
509
 
490
- u32_t opcode;
491
510
  public:
492
511
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
493
512
  //@{
494
- static inline bool classof(const UnaryOPStmt *)
513
+ static inline bool classof(const VariantGepStmt *)
495
514
  {
496
515
  return true;
497
516
  }
517
+ static inline bool classof(const GepStmt *edge)
518
+ {
519
+ return edge->getEdgeKind() == SVFStmt::VariantGep;
520
+ }
498
521
  static inline bool classof(const SVFStmt *edge)
499
522
  {
500
- return edge->getEdgeKind() == SVFStmt::UnaryOp;
523
+ return edge->getEdgeKind() == SVFStmt::VariantGep;
501
524
  }
502
525
  static inline bool classof(const GenericPAGEdgeTy *edge)
503
526
  {
504
- return edge->getEdgeKind() == SVFStmt::UnaryOp;
527
+ return edge->getEdgeKind() == SVFStmt::VariantGep;
505
528
  }
506
529
  //@}
507
530
 
508
531
  /// constructor
509
- UnaryOPStmt(SVFVar* s, SVFVar* d, u32_t oc) : SVFStmt(s,d,SVFStmt::UnaryOp), opcode(oc)
510
- {
511
- }
512
-
513
- u32_t getOpcode() const
514
- {
515
- return opcode;
516
- }
517
- inline const SVFVar* getOpVar() const{
518
- return SVFStmt::getSrcNode();
519
- }
520
- inline const SVFVar* getRes() const{
521
- return SVFStmt::getDstNode();
522
- }
523
- NodeID getOpVarID() const;
524
- NodeID getResID() const;
532
+ VariantGepStmt(SVFVar* s, SVFVar* d, const LocationSet& l) : GepStmt(s,d,l, SVFStmt::VariantGep) {}
525
533
 
526
534
  virtual const std::string toString() const override;
535
+
527
536
  };
528
537
 
529
538
 
530
539
  /*!
531
- * Branch statements including if/else and switch
540
+ * Call
532
541
  */
533
- class BranchStmt: public SVFStmt
542
+ class CallPE: public AssignStmt
534
543
  {
535
544
  private:
536
- BranchStmt(); ///< place holder
537
- BranchStmt(const BranchStmt &); ///< place holder
538
- void operator=(const BranchStmt &); ///< place holder
539
- SVFVar* getSrcNode(); ///< place holder, not allowed
540
- SVFVar* getDstNode(); ///< place holder, not allowed
541
- SVFVar* getSrcID(); ///< place holder, not allowed
542
- SVFVar* getDstID(); ///< place holder, not allowed
545
+ CallPE(); ///< place holder
546
+ CallPE(const CallPE &); ///< place holder
547
+ void operator=(const CallPE &); ///< place holder
543
548
 
544
- std::vector<const ICFGNode*> successors;
545
- const SVFVar* cond;
546
- const SVFVar* brInst;
549
+ const CallBlockNode* inst; ///< llvm instruction for this call
547
550
  public:
548
551
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
549
552
  //@{
550
- static inline bool classof(const BranchStmt *)
553
+ static inline bool classof(const CallPE *)
551
554
  {
552
555
  return true;
553
556
  }
554
557
  static inline bool classof(const SVFStmt *edge)
555
558
  {
556
- return edge->getEdgeKind() == SVFStmt::Branch;
559
+ return edge->getEdgeKind() == SVFStmt::Call
560
+ || edge->getEdgeKind() == SVFStmt::ThreadFork;
557
561
  }
558
562
  static inline bool classof(const GenericPAGEdgeTy *edge)
559
563
  {
560
- return edge->getEdgeKind() == SVFStmt::Branch;
564
+ return edge->getEdgeKind() == SVFStmt::Call
565
+ || edge->getEdgeKind() == SVFStmt::ThreadFork;
561
566
  }
562
567
  //@}
563
568
 
564
569
  /// constructor
565
- BranchStmt(SVFVar* inst, SVFVar* c, const std::vector<const ICFGNode*>& succs) : SVFStmt(c,inst,SVFStmt::Branch), successors(succs), cond(c), brInst(inst)
570
+ CallPE(SVFVar* s, SVFVar* d, const CallBlockNode* i, GEdgeKind k = SVFStmt::Call) :
571
+ AssignStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
566
572
  {
567
573
  }
568
574
 
569
- /// The branch is unconditional if cond is a null value
570
- bool isUnconditional() const;
571
- /// The branch is conditional if cond is not a null value
572
- bool isConditional() const;
573
- /// Return the condition
574
- const SVFVar* getCondition() const;
575
- const SVFVar* getBranchInst() const{
576
- return brInst;
577
- }
578
- /// Successors of this branch statement
579
- ///@{
580
- u32_t getNumSuccessors() const{
581
- return successors.size();
582
- }
583
- const std::vector<const ICFGNode*>& getSuccessors() const{
584
- return successors;
575
+ /// Get method for the call instruction
576
+ //@{
577
+ inline const CallBlockNode* getCallInst() const
578
+ {
579
+ return inst;
585
580
  }
586
- const ICFGNode* getSuccessor (u32_t i) const{
587
- return successors.at(i);
581
+ inline const CallBlockNode* getCallSite() const
582
+ {
583
+ return inst;
588
584
  }
589
- ///@}
585
+ //@}
586
+
590
587
  virtual const std::string toString() const override;
591
588
  };
592
589
 
590
+
593
591
  /*!
594
- * Store statement
592
+ * Return
595
593
  */
596
- class StoreStmt: public SVFStmt
594
+ class RetPE: public AssignStmt
597
595
  {
598
596
  private:
599
- StoreStmt(); ///< place holder
600
- StoreStmt(const StoreStmt &); ///< place holder
601
- void operator=(const StoreStmt &); ///< place holder
597
+ RetPE(); ///< place holder
598
+ RetPE(const RetPE &); ///< place holder
599
+ void operator=(const RetPE &); ///< place holder
602
600
 
601
+ const CallBlockNode* inst; /// the callsite instruction return to
603
602
  public:
604
603
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
605
604
  //@{
606
- static inline bool classof(const StoreStmt *)
605
+ static inline bool classof(const RetPE *)
607
606
  {
608
607
  return true;
609
608
  }
610
609
  static inline bool classof(const SVFStmt *edge)
611
610
  {
612
- return edge->getEdgeKind() == SVFStmt::Store;
611
+ return edge->getEdgeKind() == SVFStmt::Ret
612
+ || edge->getEdgeKind() == SVFStmt::ThreadJoin;
613
613
  }
614
614
  static inline bool classof(const GenericPAGEdgeTy *edge)
615
615
  {
616
- return edge->getEdgeKind() == SVFStmt::Store;
616
+ return edge->getEdgeKind() == SVFStmt::Ret
617
+ || edge->getEdgeKind() == SVFStmt::ThreadJoin;
617
618
  }
618
619
  //@}
619
620
 
620
621
  /// constructor
621
- StoreStmt(SVFVar* s, SVFVar* d, const IntraBlockNode* st) :
622
- SVFStmt(s, d, makeEdgeFlagWithStoreInst(SVFStmt::Store, st))
622
+ RetPE(SVFVar* s, SVFVar* d, const CallBlockNode* i, GEdgeKind k = SVFStmt::Ret) :
623
+ AssignStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
624
+ {
625
+ }
626
+
627
+ /// Get method for call instruction at caller
628
+ //@{
629
+ inline const CallBlockNode* getCallInst() const
623
630
  {
631
+ return inst;
624
632
  }
633
+ inline const CallBlockNode* getCallSite() const
634
+ {
635
+ return inst;
636
+ }
637
+ //@}
625
638
 
626
639
  virtual const std::string toString() const override;
627
640
  };
628
641
 
629
-
630
- /*!
631
- * Load statement
632
- */
633
- class LoadStmt: public SVFStmt
634
- {
642
+ /*
643
+ * Program statements with multiple operands including BinaryOPStmt, CmpStmt and PhiStmt
644
+ */
645
+ class MultiOpndStmt : public SVFStmt{
646
+ public:
647
+ typedef std::vector<SVFVar*> OPVars;
635
648
  private:
636
- LoadStmt(); ///< place holder
637
- LoadStmt(const LoadStmt &); ///< place holder
638
- void operator=(const LoadStmt &); ///< place holder
649
+ MultiOpndStmt(); ///< place holder
650
+ MultiOpndStmt(const MultiOpndStmt &); ///< place holder
651
+ void operator=(const MultiOpndStmt &); ///< place holder
652
+ SVFVar* getSrcNode(); ///< not allowed, use getOpVar(idx) instead
653
+ SVFVar* getDstNode(); ///< not allowed, use getRes() instead
654
+ NodeID getSrcID(); ///< not allowed, use getOpVarID(idx) instead
655
+ NodeID getDstID(); ///< not allowed, use getResID() instead
639
656
 
657
+ protected:
658
+ OPVars opVars;
659
+ /// Constructor, only used by subclassess but not external users
660
+ MultiOpndStmt(SVFVar* r, const OPVars& opnds, GEdgeFlag k): SVFStmt(opnds.at(0), r, k), opVars(opnds)
661
+ {
662
+ }
640
663
  public:
641
664
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
642
665
  //@{
643
- static inline bool classof(const LoadStmt *)
666
+ static inline bool classof(const MultiOpndStmt *)
644
667
  {
645
668
  return true;
646
669
  }
647
- static inline bool classof(const SVFStmt *edge)
670
+ static inline bool classof(const SVFStmt *node)
648
671
  {
649
- return edge->getEdgeKind() == SVFStmt::Load;
672
+ return node->getEdgeKind() == Phi ||
673
+ node->getEdgeKind() == BinaryOp ||
674
+ node->getEdgeKind() == Cmp;
650
675
  }
651
- static inline bool classof(const GenericPAGEdgeTy *edge)
676
+ static inline bool classof(const GenericPAGEdgeTy *node)
652
677
  {
653
- return edge->getEdgeKind() == SVFStmt::Load;
678
+ return node->getEdgeKind() == Phi ||
679
+ node->getEdgeKind() == BinaryOp ||
680
+ node->getEdgeKind() == Cmp;
654
681
  }
655
682
  //@}
656
-
657
- /// constructor
658
- LoadStmt(SVFVar* s, SVFVar* d) : SVFStmt(s,d,SVFStmt::Load)
683
+ /// Operands and result at a BinaryNode e.g., p = q + r, `p` is resVar and `r` is OpVar
684
+ //@{
685
+ /// Operand SVFVars
686
+ inline const SVFVar* getOpVar(u32_t pos) const
659
687
  {
688
+ return opVars.at(pos);
660
689
  }
690
+ /// Result SVFVar
691
+ inline const SVFVar* getRes() const
692
+ {
693
+ return SVFStmt::getDstNode();
694
+ }
695
+
696
+ NodeID getOpVarID(u32_t pos) const;
697
+ NodeID getResID() const;
661
698
 
662
- virtual const std::string toString() const override;
699
+ inline u32_t getOpVarNum() const
700
+ {
701
+ return opVars.size();
702
+ }
703
+ inline const OPVars& getOpndVars() const{
704
+ return opVars;
705
+ }
706
+ inline OPVars::const_iterator opVarBegin() const
707
+ {
708
+ return opVars.begin();
709
+ }
710
+ inline OPVars::const_iterator opVerEnd() const
711
+ {
712
+ return opVars.end();
713
+ }
714
+ //@}
663
715
  };
664
716
 
665
-
666
717
  /*!
667
- * Gep statement for struct field access, array access and pointer arithmetic
718
+ * Phi statement (e.g., p = phi(q,r) which receives values from variables q and r from different paths)
719
+ * it is typically at a joint point of the control-flow graph
668
720
  */
669
- class GepStmt: public SVFStmt
721
+ class PhiStmt: public MultiOpndStmt
670
722
  {
671
723
  private:
672
- GepStmt(); ///< place holder
673
- GepStmt(const GepStmt &); ///< place holder
674
- void operator=(const GepStmt &); ///< place holder
675
-
676
- LocationSet ls; ///< location set of the gep edge
724
+ PhiStmt(); ///< place holder
725
+ PhiStmt(const PhiStmt &); ///< place holder
726
+ void operator=(const PhiStmt &); ///< place holder
677
727
 
678
728
  public:
679
729
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
680
730
  //@{
681
- static inline bool classof(const GepStmt *)
731
+ static inline bool classof(const PhiStmt *)
682
732
  {
683
733
  return true;
684
734
  }
685
735
  static inline bool classof(const SVFStmt *edge)
686
736
  {
687
- return edge->getEdgeKind() == SVFStmt::NormalGep ||
688
- edge->getEdgeKind() == SVFStmt::VariantGep;
737
+ return edge->getEdgeKind() == SVFStmt::Phi;
689
738
  }
690
- static inline bool classof(const GenericPAGEdgeTy *edge)
739
+ static inline bool classof(const MultiOpndStmt *edge)
691
740
  {
692
- return edge->getEdgeKind() == SVFStmt::NormalGep ||
693
- edge->getEdgeKind() == SVFStmt::VariantGep;
741
+ return edge->getEdgeKind() == SVFStmt::Phi;
694
742
  }
695
- //@}
696
-
697
- inline const LocationSet& getLocationSet() const
743
+ static inline bool classof(const GenericPAGEdgeTy *edge)
698
744
  {
699
- return ls;
745
+ return edge->getEdgeKind() == SVFStmt::Phi;
700
746
  }
747
+ //@}
701
748
 
702
- protected:
703
749
  /// constructor
704
- GepStmt(SVFVar* s, SVFVar* d, const LocationSet& l, PEDGEK k) : SVFStmt(s,d,k), ls(l)
750
+ PhiStmt(SVFVar* s, const OPVars& opnds) : MultiOpndStmt(s,opnds,SVFStmt::Phi)
705
751
  {
706
752
  }
753
+ void addOpVar(SVFVar* op){
754
+ opVars.push_back(op);
755
+ }
707
756
 
708
- virtual const std::string toString() const;
757
+ /// Return true if this is a phi at the function exit
758
+ /// to receive one or multiple return values of this function
759
+ bool isFunctionRetPhi() const;
709
760
 
761
+ virtual const std::string toString() const override;
710
762
  };
711
763
 
712
764
 
713
765
  /*!
714
- * Gep statement with a fixed field index for struct field access
766
+ * Comparison statement
715
767
  */
716
- class NormalGepStmt : public GepStmt
768
+ class CmpStmt: public MultiOpndStmt
717
769
  {
718
770
  private:
719
- NormalGepStmt(); ///< place holder
720
- NormalGepStmt(const NormalGepStmt&); ///< place holder
721
- void operator=(const NormalGepStmt&); ///< place holder
771
+ CmpStmt(); ///< place holder
772
+ CmpStmt(const CmpStmt &); ///< place holder
773
+ void operator=(const CmpStmt &); ///< place holder
722
774
 
775
+ u32_t predicate;
723
776
  public:
724
777
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
725
778
  //@{
726
- static inline bool classof(const NormalGepStmt *)
779
+ static inline bool classof(const CmpStmt *)
727
780
  {
728
781
  return true;
729
782
  }
730
- static inline bool classof(const GepStmt *edge)
783
+ static inline bool classof(const SVFStmt *edge)
731
784
  {
732
- return edge->getEdgeKind() == SVFStmt::NormalGep;
785
+ return edge->getEdgeKind() == SVFStmt::Cmp;
733
786
  }
734
- static inline bool classof(const SVFStmt *edge)
787
+ static inline bool classof(const MultiOpndStmt *edge)
735
788
  {
736
- return edge->getEdgeKind() == SVFStmt::NormalGep;
789
+ return edge->getEdgeKind() == SVFStmt::Cmp;
737
790
  }
738
791
  static inline bool classof(const GenericPAGEdgeTy *edge)
739
792
  {
740
- return edge->getEdgeKind() == SVFStmt::NormalGep;
793
+ return edge->getEdgeKind() == SVFStmt::Cmp;
741
794
  }
742
795
  //@}
743
796
 
744
797
  /// constructor
745
- NormalGepStmt(SVFVar* s, SVFVar* d, const LocationSet& l) : GepStmt(s,d,l, SVFStmt::NormalGep)
746
- {}
747
-
748
- /// offset of the gep edge
749
- inline u32_t getFieldOffset() const
798
+ CmpStmt(SVFVar* s, const OPVars& opnds, u32_t pre) : MultiOpndStmt(s,opnds,SVFStmt::Cmp), predicate(pre)
750
799
  {
751
- return getLocationSet().accumulateConstantFieldIdx();
752
800
  }
753
801
 
802
+ u32_t getPredicate() const
803
+ {
804
+ return predicate;
805
+ }
806
+
754
807
  virtual const std::string toString() const override;
755
808
  };
756
809
 
810
+
757
811
  /*!
758
- * Gep statement with a variant field index for struct field access
812
+ * Binary statement
759
813
  */
760
- class VariantGepStmt : public GepStmt
814
+ class BinaryOPStmt: public MultiOpndStmt
761
815
  {
762
816
  private:
763
- VariantGepStmt(); ///< place holder
764
- VariantGepStmt(const VariantGepStmt&); ///< place holder
765
- void operator=(const VariantGepStmt&); ///< place holder
817
+ BinaryOPStmt(); ///< place holder
818
+ BinaryOPStmt(const BinaryOPStmt &); ///< place holder
819
+ void operator=(const BinaryOPStmt &); ///< place holder
820
+ u32_t opcode;
766
821
 
767
822
  public:
768
823
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
769
824
  //@{
770
- static inline bool classof(const VariantGepStmt *)
825
+ static inline bool classof(const BinaryOPStmt *)
771
826
  {
772
827
  return true;
773
828
  }
774
- static inline bool classof(const GepStmt *edge)
829
+ static inline bool classof(const SVFStmt *edge)
775
830
  {
776
- return edge->getEdgeKind() == SVFStmt::VariantGep;
831
+ return edge->getEdgeKind() == SVFStmt::BinaryOp;
777
832
  }
778
- static inline bool classof(const SVFStmt *edge)
833
+ static inline bool classof(const MultiOpndStmt *edge)
779
834
  {
780
- return edge->getEdgeKind() == SVFStmt::VariantGep;
835
+ return edge->getEdgeKind() == SVFStmt::BinaryOp;
781
836
  }
782
837
  static inline bool classof(const GenericPAGEdgeTy *edge)
783
838
  {
784
- return edge->getEdgeKind() == SVFStmt::VariantGep;
839
+ return edge->getEdgeKind() == SVFStmt::BinaryOp;
785
840
  }
786
841
  //@}
787
842
 
788
843
  /// constructor
789
- VariantGepStmt(SVFVar* s, SVFVar* d, const LocationSet& l) : GepStmt(s,d,l, SVFStmt::VariantGep) {}
844
+ BinaryOPStmt(SVFVar* s, const OPVars& opnds, u32_t oc) : MultiOpndStmt(s,opnds,SVFStmt::BinaryOp), opcode(oc)
845
+ {
846
+ }
790
847
 
791
- virtual const std::string toString() const override;
848
+ u32_t getOpcode() const
849
+ {
850
+ return opcode;
851
+ }
792
852
 
853
+ virtual const std::string toString() const override;
793
854
  };
794
855
 
795
-
796
856
  /*!
797
- * Call
857
+ * Unary statement
798
858
  */
799
- class CallPE: public SVFStmt
859
+ class UnaryOPStmt: public SVFStmt
800
860
  {
801
861
  private:
802
- CallPE(); ///< place holder
803
- CallPE(const CallPE &); ///< place holder
804
- void operator=(const CallPE &); ///< place holder
862
+ UnaryOPStmt(); ///< place holder
863
+ UnaryOPStmt(const UnaryOPStmt &); ///< place holder
864
+ void operator=(const UnaryOPStmt &); ///< place holder
865
+ SVFVar* getSrcNode(); ///< place holder, use getOpVar() instead
866
+ SVFVar* getDstNode(); ///< place holder, use getRes() instead
867
+ NodeID getSrcID(); ///< place holder, use getOpVarID(pos) instead
868
+ NodeID getDstID(); ///< place holder, use getResID() instead
805
869
 
806
- const CallBlockNode* inst; ///< llvm instruction for this call
870
+ u32_t opcode;
807
871
  public:
808
872
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
809
873
  //@{
810
- static inline bool classof(const CallPE *)
874
+ static inline bool classof(const UnaryOPStmt *)
811
875
  {
812
876
  return true;
813
877
  }
814
878
  static inline bool classof(const SVFStmt *edge)
815
879
  {
816
- return edge->getEdgeKind() == SVFStmt::Call
817
- || edge->getEdgeKind() == SVFStmt::ThreadFork;
880
+ return edge->getEdgeKind() == SVFStmt::UnaryOp;
818
881
  }
819
882
  static inline bool classof(const GenericPAGEdgeTy *edge)
820
883
  {
821
- return edge->getEdgeKind() == SVFStmt::Call
822
- || edge->getEdgeKind() == SVFStmt::ThreadFork;
884
+ return edge->getEdgeKind() == SVFStmt::UnaryOp;
823
885
  }
824
886
  //@}
825
887
 
826
888
  /// constructor
827
- CallPE(SVFVar* s, SVFVar* d, const CallBlockNode* i, GEdgeKind k = SVFStmt::Call) :
828
- SVFStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
889
+ UnaryOPStmt(SVFVar* s, SVFVar* d, u32_t oc) : SVFStmt(s,d,SVFStmt::UnaryOp), opcode(oc)
829
890
  {
830
891
  }
831
892
 
832
- /// Get method for the call instruction
833
- //@{
834
- inline const CallBlockNode* getCallInst() const
893
+ u32_t getOpcode() const
835
894
  {
836
- return inst;
895
+ return opcode;
837
896
  }
838
- inline const CallBlockNode* getCallSite() const
839
- {
840
- return inst;
897
+ inline const SVFVar* getOpVar() const{
898
+ return SVFStmt::getSrcNode();
841
899
  }
842
- //@}
900
+ inline const SVFVar* getRes() const{
901
+ return SVFStmt::getDstNode();
902
+ }
903
+ NodeID getOpVarID() const;
904
+ NodeID getResID() const;
843
905
 
844
906
  virtual const std::string toString() const override;
845
907
  };
846
908
 
847
909
 
848
910
  /*!
849
- * Return
911
+ * Branch statements including if/else and switch
850
912
  */
851
- class RetPE: public SVFStmt
913
+ class BranchStmt: public SVFStmt
852
914
  {
853
915
  private:
854
- RetPE(); ///< place holder
855
- RetPE(const RetPE &); ///< place holder
856
- void operator=(const RetPE &); ///< place holder
916
+ BranchStmt(); ///< place holder
917
+ BranchStmt(const BranchStmt &); ///< place holder
918
+ void operator=(const BranchStmt &); ///< place holder
919
+ SVFVar* getSrcNode(); ///< place holder, not allowed
920
+ SVFVar* getDstNode(); ///< place holder, not allowed
921
+ NodeID getSrcID(); ///< place holder, use getOpVarID(pos) instead
922
+ NodeID getDstID(); ///< place holder, use getResID() instead
857
923
 
858
- const CallBlockNode* inst; /// the callsite instruction return to
924
+ std::vector<const ICFGNode*> successors;
925
+ const SVFVar* cond;
926
+ const SVFVar* brInst;
859
927
  public:
860
928
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
861
929
  //@{
862
- static inline bool classof(const RetPE *)
930
+ static inline bool classof(const BranchStmt *)
863
931
  {
864
932
  return true;
865
933
  }
866
934
  static inline bool classof(const SVFStmt *edge)
867
935
  {
868
- return edge->getEdgeKind() == SVFStmt::Ret
869
- || edge->getEdgeKind() == SVFStmt::ThreadJoin;
936
+ return edge->getEdgeKind() == SVFStmt::Branch;
870
937
  }
871
938
  static inline bool classof(const GenericPAGEdgeTy *edge)
872
939
  {
873
- return edge->getEdgeKind() == SVFStmt::Ret
874
- || edge->getEdgeKind() == SVFStmt::ThreadJoin;
940
+ return edge->getEdgeKind() == SVFStmt::Branch;
875
941
  }
876
942
  //@}
877
943
 
878
944
  /// constructor
879
- RetPE(SVFVar* s, SVFVar* d, const CallBlockNode* i, GEdgeKind k = SVFStmt::Ret) :
880
- SVFStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
945
+ BranchStmt(SVFVar* inst, SVFVar* c, const std::vector<const ICFGNode*>& succs) : SVFStmt(c,inst,SVFStmt::Branch), successors(succs), cond(c), brInst(inst)
881
946
  {
882
947
  }
883
948
 
884
- /// Get method for call instruction at caller
885
- //@{
886
- inline const CallBlockNode* getCallInst() const
887
- {
888
- return inst;
949
+ /// The branch is unconditional if cond is a null value
950
+ bool isUnconditional() const;
951
+ /// The branch is conditional if cond is not a null value
952
+ bool isConditional() const;
953
+ /// Return the condition
954
+ const SVFVar* getCondition() const;
955
+ const SVFVar* getBranchInst() const{
956
+ return brInst;
889
957
  }
890
- inline const CallBlockNode* getCallSite() const
891
- {
892
- return inst;
958
+ /// Successors of this branch statement
959
+ ///@{
960
+ u32_t getNumSuccessors() const{
961
+ return successors.size();
893
962
  }
894
- //@}
895
-
963
+ const std::vector<const ICFGNode*>& getSuccessors() const{
964
+ return successors;
965
+ }
966
+ const ICFGNode* getSuccessor (u32_t i) const{
967
+ return successors.at(i);
968
+ }
969
+ ///@}
896
970
  virtual const std::string toString() const override;
897
971
  };
898
972