svf-lib 1.0.2319 → 1.0.2321

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 (320) hide show
  1. package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/WorkList.h +0 -0
  2. package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/Modules/FindZ3.cmake +93 -0
  3. package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFConfig.cmake +106 -0
  4. package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFConfigVersion.cmake +43 -0
  5. package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFTargets-release.cmake +101 -0
  6. package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFTargets.cmake +180 -0
  7. package/SVF-linux-aarch64/Release-build/lib/libSvfCore.so.3.1 +0 -0
  8. package/SVF-linux-aarch64/Release-build/lib/libSvfLLVM.so.3.1 +0 -0
  9. package/SVF-linux-aarch64/Release-build/lib/pkgconfig/SVF.pc +12 -0
  10. package/SVF-osx/Release-build/bin/ae +0 -0
  11. package/SVF-osx/Release-build/bin/cfl +0 -0
  12. package/SVF-osx/Release-build/bin/dvf +0 -0
  13. package/SVF-osx/Release-build/bin/llvm2svf +0 -0
  14. package/SVF-osx/Release-build/bin/mta +0 -0
  15. package/SVF-osx/Release-build/bin/saber +0 -0
  16. package/SVF-osx/Release-build/bin/svf-ex +0 -0
  17. package/SVF-osx/Release-build/bin/wpa +0 -0
  18. package/SVF-osx/Release-build/include/SVF/AE/Core/AbstractState.h +425 -0
  19. package/SVF-osx/Release-build/include/SVF/AE/Core/AbstractValue.h +157 -0
  20. package/SVF-osx/Release-build/include/SVF/AE/Core/AddressValue.h +225 -0
  21. package/SVF-osx/Release-build/include/SVF/AE/Core/ICFGWTO.h +135 -0
  22. package/SVF-osx/Release-build/include/SVF/AE/Core/IntervalValue.h +1055 -0
  23. package/SVF-osx/Release-build/include/SVF/AE/Core/NumericValue.h +1292 -0
  24. package/SVF-osx/Release-build/include/SVF/AE/Core/RelExeState.h +226 -0
  25. package/SVF-osx/Release-build/include/SVF/AE/Core/RelationSolver.h +91 -0
  26. package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AEDetector.h +439 -0
  27. package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AbsExtAPI.h +138 -0
  28. package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AbstractInterpretation.h +384 -0
  29. package/SVF-osx/Release-build/include/SVF/CFL/CFGNormalizer.h +84 -0
  30. package/SVF-osx/Release-build/include/SVF/CFL/CFGrammar.h +468 -0
  31. package/SVF-osx/Release-build/include/SVF/CFL/CFLAlias.h +168 -0
  32. package/SVF-osx/Release-build/include/SVF/CFL/CFLBase.h +118 -0
  33. package/SVF-osx/Release-build/include/SVF/CFL/CFLGramGraphChecker.h +74 -0
  34. package/SVF-osx/Release-build/include/SVF/CFL/CFLGraphBuilder.h +168 -0
  35. package/SVF-osx/Release-build/include/SVF/CFL/CFLSVFGBuilder.h +58 -0
  36. package/SVF-osx/Release-build/include/SVF/CFL/CFLSolver.h +374 -0
  37. package/SVF-osx/Release-build/include/SVF/CFL/CFLStat.h +67 -0
  38. package/SVF-osx/Release-build/include/SVF/CFL/CFLVF.h +68 -0
  39. package/SVF-osx/Release-build/include/SVF/CFL/GrammarBuilder.h +100 -0
  40. package/SVF-osx/Release-build/include/SVF/DDA/ContextDDA.h +230 -0
  41. package/SVF-osx/Release-build/include/SVF/DDA/DDAClient.h +163 -0
  42. package/SVF-osx/Release-build/include/SVF/DDA/DDAPass.h +102 -0
  43. package/SVF-osx/Release-build/include/SVF/DDA/DDAStat.h +121 -0
  44. package/SVF-osx/Release-build/include/SVF/DDA/DDAVFSolver.h +794 -0
  45. package/SVF-osx/Release-build/include/SVF/DDA/FlowDDA.h +178 -0
  46. package/SVF-osx/Release-build/include/SVF/FastCluster/fastcluster.h +80 -0
  47. package/SVF-osx/Release-build/include/SVF/Graphs/BasicBlockG.h +318 -0
  48. package/SVF-osx/Release-build/include/SVF/Graphs/CDG.h +482 -0
  49. package/SVF-osx/Release-build/include/SVF/Graphs/CFLGraph.h +232 -0
  50. package/SVF-osx/Release-build/include/SVF/Graphs/CHG.h +368 -0
  51. package/SVF-osx/Release-build/include/SVF/Graphs/CallGraph.h +497 -0
  52. package/SVF-osx/Release-build/include/SVF/Graphs/ConsG.h +402 -0
  53. package/SVF-osx/Release-build/include/SVF/Graphs/ConsGEdge.h +355 -0
  54. package/SVF-osx/Release-build/include/SVF/Graphs/ConsGNode.h +418 -0
  55. package/SVF-osx/Release-build/include/SVF/Graphs/DOTGraphTraits.h +188 -0
  56. package/SVF-osx/Release-build/include/SVF/Graphs/GenericGraph.h +628 -0
  57. package/SVF-osx/Release-build/include/SVF/Graphs/GraphPrinter.h +111 -0
  58. package/SVF-osx/Release-build/include/SVF/Graphs/GraphTraits.h +150 -0
  59. package/SVF-osx/Release-build/include/SVF/Graphs/GraphWriter.h +380 -0
  60. package/SVF-osx/Release-build/include/SVF/Graphs/ICFG.h +331 -0
  61. package/SVF-osx/Release-build/include/SVF/Graphs/ICFGEdge.h +281 -0
  62. package/SVF-osx/Release-build/include/SVF/Graphs/ICFGNode.h +669 -0
  63. package/SVF-osx/Release-build/include/SVF/Graphs/ICFGStat.h +164 -0
  64. package/SVF-osx/Release-build/include/SVF/Graphs/IRGraph.h +398 -0
  65. package/SVF-osx/Release-build/include/SVF/Graphs/SCC.h +375 -0
  66. package/SVF-osx/Release-build/include/SVF/Graphs/SVFG.h +491 -0
  67. package/SVF-osx/Release-build/include/SVF/Graphs/SVFGEdge.h +237 -0
  68. package/SVF-osx/Release-build/include/SVF/Graphs/SVFGNode.h +501 -0
  69. package/SVF-osx/Release-build/include/SVF/Graphs/SVFGOPT.h +372 -0
  70. package/SVF-osx/Release-build/include/SVF/Graphs/SVFGStat.h +273 -0
  71. package/SVF-osx/Release-build/include/SVF/Graphs/ThreadCallGraph.h +399 -0
  72. package/SVF-osx/Release-build/include/SVF/Graphs/VFG.h +726 -0
  73. package/SVF-osx/Release-build/include/SVF/Graphs/VFGEdge.h +295 -0
  74. package/SVF-osx/Release-build/include/SVF/Graphs/VFGNode.h +1266 -0
  75. package/SVF-osx/Release-build/include/SVF/Graphs/WTO.h +872 -0
  76. package/SVF-osx/Release-build/include/SVF/MSSA/MSSAMuChi.h +722 -0
  77. package/SVF-osx/Release-build/include/SVF/MSSA/MemPartition.h +169 -0
  78. package/SVF-osx/Release-build/include/SVF/MSSA/MemRegion.h +489 -0
  79. package/SVF-osx/Release-build/include/SVF/MSSA/MemSSA.h +452 -0
  80. package/SVF-osx/Release-build/include/SVF/MSSA/SVFGBuilder.h +104 -0
  81. package/SVF-osx/Release-build/include/SVF/MTA/LockAnalysis.h +533 -0
  82. package/SVF-osx/Release-build/include/SVF/MTA/MHP.h +546 -0
  83. package/SVF-osx/Release-build/include/SVF/MTA/MTA.h +97 -0
  84. package/SVF-osx/Release-build/include/SVF/MTA/MTAStat.h +73 -0
  85. package/SVF-osx/Release-build/include/SVF/MTA/TCT.h +620 -0
  86. package/SVF-osx/Release-build/include/SVF/MemoryModel/AbstractPointsToDS.h +316 -0
  87. package/SVF-osx/Release-build/include/SVF/MemoryModel/AccessPath.h +194 -0
  88. package/SVF-osx/Release-build/include/SVF/MemoryModel/ConditionalPT.h +878 -0
  89. package/SVF-osx/Release-build/include/SVF/MemoryModel/MutablePointsToDS.h +1025 -0
  90. package/SVF-osx/Release-build/include/SVF/MemoryModel/PersistentPointsToCache.h +463 -0
  91. package/SVF-osx/Release-build/include/SVF/MemoryModel/PersistentPointsToDS.h +955 -0
  92. package/SVF-osx/Release-build/include/SVF/MemoryModel/PointerAnalysis.h +428 -0
  93. package/SVF-osx/Release-build/include/SVF/MemoryModel/PointerAnalysisImpl.h +602 -0
  94. package/SVF-osx/Release-build/include/SVF/MemoryModel/PointsTo.h +255 -0
  95. package/SVF-osx/Release-build/include/SVF/MemoryModel/SVFLoop.h +167 -0
  96. package/SVF-osx/Release-build/include/SVF/SABER/DoubleFreeChecker.h +76 -0
  97. package/SVF-osx/Release-build/include/SVF/SABER/FileChecker.h +80 -0
  98. package/SVF-osx/Release-build/include/SVF/SABER/LeakChecker.h +122 -0
  99. package/SVF-osx/Release-build/include/SVF/SABER/ProgSlice.h +327 -0
  100. package/SVF-osx/Release-build/include/SVF/SABER/SaberCheckerAPI.h +151 -0
  101. package/SVF-osx/Release-build/include/SVF/SABER/SaberCondAllocator.h +317 -0
  102. package/SVF-osx/Release-build/include/SVF/SABER/SaberSVFGBuilder.h +114 -0
  103. package/SVF-osx/Release-build/include/SVF/SABER/SrcSnkDDA.h +327 -0
  104. package/SVF-osx/Release-build/include/SVF/SABER/SrcSnkSolver.h +186 -0
  105. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/BasicTypes.h +280 -0
  106. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/BreakConstantExpr.h +93 -0
  107. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/CHGBuilder.h +78 -0
  108. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/CppUtil.h +184 -0
  109. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/DCHG.h +474 -0
  110. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/GEPTypeBridgeIterator.h +183 -0
  111. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/ICFGBuilder.h +160 -0
  112. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMLoopAnalysis.h +60 -0
  113. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMModule.h +527 -0
  114. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMUtil.h +433 -0
  115. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/ObjTypeInference.h +129 -0
  116. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/SVFIRBuilder.h +523 -0
  117. package/SVF-osx/Release-build/include/SVF/SVF-LLVM/SymbolTableBuilder.h +132 -0
  118. package/SVF-osx/Release-build/include/SVF/SVFIR/ObjTypeInfo.h +224 -0
  119. package/SVF-osx/Release-build/include/SVF/SVFIR/PAGBuilderFromFile.h +80 -0
  120. package/SVF-osx/Release-build/include/SVF/SVFIR/SVFIR.h +856 -0
  121. package/SVF-osx/Release-build/include/SVF/SVFIR/SVFStatements.h +1330 -0
  122. package/SVF-osx/Release-build/include/SVF/SVFIR/SVFType.h +606 -0
  123. package/SVF-osx/Release-build/include/SVF/SVFIR/SVFValue.h +338 -0
  124. package/SVF-osx/Release-build/include/SVF/SVFIR/SVFVariables.h +2212 -0
  125. package/SVF-osx/Release-build/include/SVF/Util/Annotator.h +180 -0
  126. package/SVF-osx/Release-build/include/SVF/Util/BitVector.h +55 -0
  127. package/SVF-osx/Release-build/include/SVF/Util/CDGBuilder.h +107 -0
  128. package/SVF-osx/Release-build/include/SVF/Util/CallGraphBuilder.h +61 -0
  129. package/SVF-osx/Release-build/include/SVF/Util/Casting.h +426 -0
  130. package/SVF-osx/Release-build/include/SVF/Util/CommandLine.h +530 -0
  131. package/SVF-osx/Release-build/include/SVF/Util/CoreBitVector.h +214 -0
  132. package/SVF-osx/Release-build/include/SVF/Util/CxtStmt.h +502 -0
  133. package/SVF-osx/Release-build/include/SVF/Util/DPItem.h +618 -0
  134. package/SVF-osx/Release-build/include/SVF/Util/ExtAPI.h +117 -0
  135. package/SVF-osx/Release-build/include/SVF/Util/GeneralType.h +127 -0
  136. package/SVF-osx/Release-build/include/SVF/Util/GraphReachSolver.h +186 -0
  137. package/SVF-osx/Release-build/include/SVF/Util/NodeIDAllocator.h +203 -0
  138. package/SVF-osx/Release-build/include/SVF/Util/Options.h +273 -0
  139. package/SVF-osx/Release-build/include/SVF/Util/PTAStat.h +83 -0
  140. package/SVF-osx/Release-build/include/SVF/Util/SVFBugReport.h +427 -0
  141. package/SVF-osx/Release-build/include/SVF/Util/SVFLoopAndDomInfo.h +169 -0
  142. package/SVF-osx/Release-build/include/SVF/Util/SVFStat.h +103 -0
  143. package/SVF-osx/Release-build/include/SVF/Util/SVFUtil.h +478 -0
  144. package/SVF-osx/Release-build/include/SVF/Util/SparseBitVector.h +1252 -0
  145. package/SVF-osx/Release-build/include/SVF/Util/ThreadAPI.h +188 -0
  146. package/SVF-osx/Release-build/include/SVF/Util/WorkList.h +317 -0
  147. package/SVF-osx/Release-build/include/SVF/Util/Z3Expr.h +325 -0
  148. package/SVF-osx/Release-build/include/SVF/Util/cJSON.h +300 -0
  149. package/SVF-osx/Release-build/include/SVF/Util/config.h +46 -0
  150. package/SVF-osx/Release-build/include/SVF/Util/iterator.h +407 -0
  151. package/SVF-osx/Release-build/include/SVF/Util/iterator_range.h +76 -0
  152. package/SVF-osx/Release-build/include/SVF/WPA/Andersen.h +434 -0
  153. package/SVF-osx/Release-build/include/SVF/WPA/AndersenPWC.h +160 -0
  154. package/SVF-osx/Release-build/include/SVF/WPA/CSC.h +95 -0
  155. package/SVF-osx/Release-build/include/SVF/WPA/FlowSensitive.h +322 -0
  156. package/SVF-osx/Release-build/include/SVF/WPA/Steensgaard.h +131 -0
  157. package/SVF-osx/Release-build/include/SVF/WPA/TypeAnalysis.h +90 -0
  158. package/SVF-osx/Release-build/include/SVF/WPA/VersionedFlowSensitive.h +295 -0
  159. package/SVF-osx/Release-build/include/SVF/WPA/WPAFSSolver.h +246 -0
  160. package/SVF-osx/Release-build/include/SVF/WPA/WPAPass.h +115 -0
  161. package/SVF-osx/Release-build/include/SVF/WPA/WPASolver.h +205 -0
  162. package/SVF-osx/Release-build/include/SVF/WPA/WPAStat.h +222 -0
  163. package/SVF-osx/Release-build/include/SVF/extapi.bc +2384 -0
  164. package/SVF-osx/Release-build/lib/cmake/SVF/Modules/FindZ3.cmake +93 -0
  165. package/SVF-osx/Release-build/lib/cmake/SVF/SVFConfig.cmake +106 -0
  166. package/SVF-osx/Release-build/lib/cmake/SVF/SVFConfigVersion.cmake +43 -0
  167. package/SVF-osx/Release-build/lib/cmake/SVF/SVFTargets-release.cmake +101 -0
  168. package/SVF-osx/Release-build/lib/cmake/SVF/SVFTargets.cmake +180 -0
  169. package/SVF-osx/Release-build/lib/libSvfCore.3.1.dylib +0 -0
  170. package/SVF-osx/Release-build/lib/libSvfLLVM.3.1.dylib +0 -0
  171. package/SVF-osx/Release-build/lib/pkgconfig/SVF.pc +12 -0
  172. package/package.json +1 -1
  173. package/SVF-linux-aarch64/Release-build/include/CFL/grammar/PAGGrammar.txt +0 -15
  174. package/SVF-linux-aarch64/Release-build/include/CFL/grammar/PEGGrammar.txt +0 -11
  175. package/SVF-linux-aarch64/Release-build/include/CFL/grammar/VFGGrammar.txt +0 -7
  176. package/SVF-linux-aarch64/Release-build/include/FastCluster/LICENSE.TXT +0 -13
  177. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AbstractState.h +0 -0
  178. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AbstractValue.h +0 -0
  179. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AddressValue.h +0 -0
  180. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/ICFGWTO.h +0 -0
  181. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/IntervalValue.h +0 -0
  182. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/NumericValue.h +0 -0
  183. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/RelExeState.h +0 -0
  184. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/RelationSolver.h +0 -0
  185. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AEDetector.h +0 -0
  186. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AbsExtAPI.h +0 -0
  187. /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AbstractInterpretation.h +0 -0
  188. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFGNormalizer.h +0 -0
  189. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFGrammar.h +0 -0
  190. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLAlias.h +0 -0
  191. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLBase.h +0 -0
  192. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLGramGraphChecker.h +0 -0
  193. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLGraphBuilder.h +0 -0
  194. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLSVFGBuilder.h +0 -0
  195. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLSolver.h +0 -0
  196. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLStat.h +0 -0
  197. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLVF.h +0 -0
  198. /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/GrammarBuilder.h +0 -0
  199. /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/ContextDDA.h +0 -0
  200. /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAClient.h +0 -0
  201. /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAPass.h +0 -0
  202. /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAStat.h +0 -0
  203. /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAVFSolver.h +0 -0
  204. /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/FlowDDA.h +0 -0
  205. /package/SVF-linux-aarch64/Release-build/include/{FastCluster → SVF/FastCluster}/fastcluster.h +0 -0
  206. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/BasicBlockG.h +0 -0
  207. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CDG.h +0 -0
  208. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CFLGraph.h +0 -0
  209. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CHG.h +0 -0
  210. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CallGraph.h +0 -0
  211. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsG.h +0 -0
  212. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsGEdge.h +0 -0
  213. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsGNode.h +0 -0
  214. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/DOTGraphTraits.h +0 -0
  215. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GenericGraph.h +0 -0
  216. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphPrinter.h +0 -0
  217. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphTraits.h +0 -0
  218. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphWriter.h +0 -0
  219. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFG.h +0 -0
  220. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGEdge.h +0 -0
  221. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGNode.h +0 -0
  222. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGStat.h +0 -0
  223. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/IRGraph.h +0 -0
  224. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SCC.h +0 -0
  225. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFG.h +0 -0
  226. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGEdge.h +0 -0
  227. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGNode.h +0 -0
  228. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGOPT.h +0 -0
  229. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGStat.h +0 -0
  230. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ThreadCallGraph.h +0 -0
  231. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFG.h +0 -0
  232. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFGEdge.h +0 -0
  233. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFGNode.h +0 -0
  234. /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/WTO.h +0 -0
  235. /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MSSAMuChi.h +0 -0
  236. /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemPartition.h +0 -0
  237. /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemRegion.h +0 -0
  238. /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemSSA.h +0 -0
  239. /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/SVFGBuilder.h +0 -0
  240. /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/LockAnalysis.h +0 -0
  241. /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MHP.h +0 -0
  242. /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MTA.h +0 -0
  243. /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MTAStat.h +0 -0
  244. /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/TCT.h +0 -0
  245. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/AbstractPointsToDS.h +0 -0
  246. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/AccessPath.h +0 -0
  247. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/ConditionalPT.h +0 -0
  248. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/MutablePointsToDS.h +0 -0
  249. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PersistentPointsToCache.h +0 -0
  250. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PersistentPointsToDS.h +0 -0
  251. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointerAnalysis.h +0 -0
  252. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointerAnalysisImpl.h +0 -0
  253. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointsTo.h +0 -0
  254. /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/SVFLoop.h +0 -0
  255. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/DoubleFreeChecker.h +0 -0
  256. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/FileChecker.h +0 -0
  257. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/LeakChecker.h +0 -0
  258. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/ProgSlice.h +0 -0
  259. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberCheckerAPI.h +0 -0
  260. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberCondAllocator.h +0 -0
  261. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberSVFGBuilder.h +0 -0
  262. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SrcSnkDDA.h +0 -0
  263. /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SrcSnkSolver.h +0 -0
  264. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/BasicTypes.h +0 -0
  265. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/BreakConstantExpr.h +0 -0
  266. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/CHGBuilder.h +0 -0
  267. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/CppUtil.h +0 -0
  268. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/DCHG.h +0 -0
  269. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/GEPTypeBridgeIterator.h +0 -0
  270. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/ICFGBuilder.h +0 -0
  271. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMLoopAnalysis.h +0 -0
  272. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMModule.h +0 -0
  273. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMUtil.h +0 -0
  274. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/ObjTypeInference.h +0 -0
  275. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/SVFIRBuilder.h +0 -0
  276. /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/SymbolTableBuilder.h +0 -0
  277. /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/ObjTypeInfo.h +0 -0
  278. /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/PAGBuilderFromFile.h +0 -0
  279. /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFIR.h +0 -0
  280. /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFStatements.h +0 -0
  281. /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFType.h +0 -0
  282. /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFValue.h +0 -0
  283. /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFVariables.h +0 -0
  284. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Annotator.h +0 -0
  285. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/BitVector.h +0 -0
  286. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CDGBuilder.h +0 -0
  287. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CallGraphBuilder.h +0 -0
  288. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Casting.h +0 -0
  289. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CommandLine.h +0 -0
  290. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CoreBitVector.h +0 -0
  291. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CxtStmt.h +0 -0
  292. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/DPItem.h +0 -0
  293. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/ExtAPI.h +0 -0
  294. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/GeneralType.h +0 -0
  295. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/GraphReachSolver.h +0 -0
  296. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/NodeIDAllocator.h +0 -0
  297. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Options.h +0 -0
  298. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/PTAStat.h +0 -0
  299. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFBugReport.h +0 -0
  300. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFLoopAndDomInfo.h +0 -0
  301. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFStat.h +0 -0
  302. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFUtil.h +0 -0
  303. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SparseBitVector.h +0 -0
  304. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/ThreadAPI.h +0 -0
  305. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Z3Expr.h +0 -0
  306. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/cJSON.h +0 -0
  307. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/iterator.h +0 -0
  308. /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/iterator_range.h +0 -0
  309. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/Andersen.h +0 -0
  310. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/AndersenPWC.h +0 -0
  311. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/CSC.h +0 -0
  312. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/FlowSensitive.h +0 -0
  313. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/Steensgaard.h +0 -0
  314. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/TypeAnalysis.h +0 -0
  315. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/VersionedFlowSensitive.h +0 -0
  316. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAFSSolver.h +0 -0
  317. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAPass.h +0 -0
  318. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPASolver.h +0 -0
  319. /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAStat.h +0 -0
  320. /package/SVF-linux-aarch64/Release-build/{lib → include/SVF}/extapi.bc +0 -0
@@ -0,0 +1,726 @@
1
+ //===- VFG.h ----------------------------------------------------------------//
2
+ //
3
+ // SVF: Static Value-Flow Analysis
4
+ //
5
+ // Copyright (C) <2013-2018> <Yulei Sui>
6
+ //
7
+
8
+ // This program is free software: you can redistribute it and/or modify
9
+ // it under the terms of the GNU Affero General Public License as published by
10
+ // the Free Software Foundation, either version 3 of the License, or
11
+ // (at your option) any later version.
12
+
13
+ // This program is distributed in the hope that it will be useful,
14
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ // GNU Affero General Public License for more details.
17
+
18
+ // You should have received a copy of the GNU Affero General Public License
19
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+ //
21
+ //===----------------------------------------------------------------------===//
22
+
23
+ /*
24
+ * VFG.h
25
+ *
26
+ * Created on: 18 Sep. 2018
27
+ * Author: Yulei Sui
28
+ */
29
+
30
+ #ifndef INCLUDE_UTIL_VFG_H_
31
+ #define INCLUDE_UTIL_VFG_H_
32
+
33
+
34
+ #include "SVFIR/SVFIR.h"
35
+ #include "Graphs/CallGraph.h"
36
+ #include "Graphs/VFGNode.h"
37
+ #include "Graphs/VFGEdge.h"
38
+
39
+ namespace SVF
40
+ {
41
+
42
+ class PointerAnalysis;
43
+ class VFGStat;
44
+ class CallICFGNode;
45
+
46
+ /*!
47
+ * Value Flow Graph (VFG)
48
+ */
49
+ typedef GenericGraph<VFGNode,VFGEdge> GenericVFGTy;
50
+ class VFG : public GenericVFGTy
51
+ {
52
+
53
+ public:
54
+ /// VFG kind
55
+ enum VFGK
56
+ {
57
+ FULLSVFG, PTRONLYSVFG, FULLSVFG_OPT, PTRONLYSVFG_OPT
58
+ };
59
+
60
+ typedef OrderedMap<NodeID, VFGNode *> VFGNodeIDToNodeMapTy;
61
+ typedef Set<VFGNode*> VFGNodeSet;
62
+ typedef Map<const PAGNode*, NodeID> PAGNodeToDefMapTy;
63
+ typedef Map<std::pair<NodeID,const CallICFGNode*>, ActualParmVFGNode *> PAGNodeToActualParmMapTy;
64
+ typedef Map<const PAGNode*, ActualRetVFGNode *> PAGNodeToActualRetMapTy;
65
+ typedef Map<const PAGNode*, FormalParmVFGNode *> PAGNodeToFormalParmMapTy;
66
+ typedef Map<const PAGNode*, FormalRetVFGNode *> PAGNodeToFormalRetMapTy;
67
+ typedef Map<const PAGEdge*, StmtVFGNode*> PAGEdgeToStmtVFGNodeMapTy;
68
+ typedef Map<const PAGNode*, IntraPHIVFGNode*> PAGNodeToPHIVFGNodeMapTy;
69
+ typedef Map<const PAGNode*, BinaryOPVFGNode*> PAGNodeToBinaryOPVFGNodeMapTy;
70
+ typedef Map<const PAGNode*, UnaryOPVFGNode*> PAGNodeToUnaryOPVFGNodeMapTy;
71
+ typedef Map<const PAGNode*, BranchVFGNode*> PAGNodeToBranchVFGNodeMapTy;
72
+ typedef Map<const PAGNode*, CmpVFGNode*> PAGNodeToCmpVFGNodeMapTy;
73
+ typedef Map<const FunObjVar*, VFGNodeSet > FunToVFGNodesMapTy;
74
+
75
+ typedef FormalParmVFGNode::CallPESet CallPESet;
76
+ typedef FormalRetVFGNode::RetPESet RetPESet;
77
+ typedef VFGEdge::VFGEdgeSetTy VFGEdgeSetTy;
78
+ typedef VFGEdge::SVFGEdgeSetTy SVFGEdgeSetTy;
79
+ typedef VFGEdge::VFGEdgeSetTy::iterator VFGNodeIter;
80
+ typedef VFGNodeIDToNodeMapTy::iterator iterator;
81
+ typedef VFGNodeIDToNodeMapTy::const_iterator const_iterator;
82
+ typedef SVFIR::SVFStmtSet SVFStmtSet;
83
+ typedef Set<const VFGNode*> GlobalVFGNodeSet;
84
+ typedef Set<const PAGNode*> PAGNodeSet;
85
+
86
+
87
+ protected:
88
+ NodeID totalVFGNode;
89
+ PAGNodeToDefMapTy PAGNodeToDefMap; ///< map a pag node to its definition SVG node
90
+ PAGNodeToActualParmMapTy PAGNodeToActualParmMap; ///< map a PAGNode to an actual parameter
91
+ PAGNodeToActualRetMapTy PAGNodeToActualRetMap; ///< map a PAGNode to an actual return
92
+ PAGNodeToFormalParmMapTy PAGNodeToFormalParmMap; ///< map a PAGNode to a formal parameter
93
+ PAGNodeToFormalRetMapTy PAGNodeToFormalRetMap; ///< map a PAGNode to a formal return
94
+ PAGNodeToPHIVFGNodeMapTy PAGNodeToIntraPHIVFGNodeMap; ///< map a PAGNode to its PHIVFGNode
95
+ PAGNodeToBinaryOPVFGNodeMapTy PAGNodeToBinaryOPVFGNodeMap; ///< map a PAGNode to its BinaryOPVFGNode
96
+ PAGNodeToUnaryOPVFGNodeMapTy PAGNodeToUnaryOPVFGNodeMap; ///< map a PAGNode to its UnaryOPVFGNode
97
+ PAGNodeToBranchVFGNodeMapTy PAGNodeToBranchVFGNodeMap; ///< map a PAGNode to its BranchVFGNode
98
+ PAGNodeToCmpVFGNodeMapTy PAGNodeToCmpVFGNodeMap; ///< map a PAGNode to its CmpVFGNode
99
+ PAGEdgeToStmtVFGNodeMapTy PAGEdgeToStmtVFGNodeMap; ///< map a PAGEdge to its StmtVFGNode
100
+ FunToVFGNodesMapTy funToVFGNodesMap; ///< map a function to its VFGNodes;
101
+
102
+ GlobalVFGNodeSet globalVFGNodes; ///< set of global store VFG nodes
103
+ CallGraph* callgraph;
104
+ SVFIR* pag;
105
+ VFGK kind;
106
+
107
+ /// Clean up memory
108
+ void destroy();
109
+
110
+ public:
111
+ /// Constructor
112
+ VFG(CallGraph* callgraph, VFGK k = FULLSVFG);
113
+
114
+ /// Destructor
115
+ virtual ~VFG()
116
+ {
117
+ destroy();
118
+ }
119
+
120
+ /// Get VFG kind
121
+ inline VFGK getKind() const
122
+ {
123
+ return kind;
124
+ }
125
+
126
+ /// Return true if this VFG only contains pointer related SVFGNodes for pointer analysis
127
+ inline bool isPtrOnlySVFG() const
128
+ {
129
+ return (kind == PTRONLYSVFG) || (kind == PTRONLYSVFG_OPT);
130
+ }
131
+
132
+ /// Return SVFIR
133
+ inline SVFIR* getPAG() const
134
+ {
135
+ return pag;
136
+ }
137
+
138
+ /// Return PTACallGraph
139
+ inline CallGraph* getCallGraph() const
140
+ {
141
+ return callgraph;
142
+ }
143
+
144
+ /// Get a VFG node
145
+ inline VFGNode* getVFGNode(NodeID id) const
146
+ {
147
+ return getGNode(id);
148
+ }
149
+
150
+ /// Whether has the VFGNode
151
+ inline bool hasVFGNode(NodeID id) const
152
+ {
153
+ return hasGNode(id);
154
+ }
155
+ /// Return global stores
156
+ inline GlobalVFGNodeSet& getGlobalVFGNodes()
157
+ {
158
+ return globalVFGNodes;
159
+ }
160
+
161
+ /// Get a SVFG edge according to src and dst
162
+ VFGEdge* getIntraVFGEdge(const VFGNode* src, const VFGNode* dst, VFGEdge::VFGEdgeK kind);
163
+
164
+ /// Dump graph into dot file
165
+ void dump(const std::string& file, bool simple = false);
166
+
167
+ /// Dump graph into dot file
168
+ void view();
169
+
170
+ /// Update VFG based on pointer analysis results
171
+ void updateCallGraph(PointerAnalysis* pta);
172
+
173
+ /// Connect VFG nodes between caller and callee for indirect call site
174
+ virtual void connectCallerAndCallee(const CallICFGNode* cs, const FunObjVar* callee, VFGEdgeSetTy& edges);
175
+
176
+ /// Get callsite given a callsiteID
177
+ //@{
178
+ inline CallSiteID getCallSiteID(const CallICFGNode* cs, const FunObjVar* func) const
179
+ {
180
+ return callgraph->getCallSiteID(cs, func);
181
+ }
182
+ inline const CallICFGNode* getCallSite(CallSiteID id) const
183
+ {
184
+ return callgraph->getCallSite(id);
185
+ }
186
+ //@}
187
+
188
+ /// Given a pagNode, return its definition site
189
+ inline const VFGNode* getDefVFGNode(const PAGNode* pagNode) const
190
+ {
191
+ return getVFGNode(getDef(pagNode));
192
+ }
193
+
194
+ // Given an VFG node, return true if it has a left hand side top level pointer (PAGnode)
195
+ inline bool hasLHSTopLevPtr(const VFGNode* node) const
196
+ {
197
+ return node && SVFUtil::isa<AddrVFGNode,
198
+ CopyVFGNode,
199
+ GepVFGNode,
200
+ LoadVFGNode,
201
+ PHIVFGNode,
202
+ CmpVFGNode,
203
+ BinaryOPVFGNode,
204
+ UnaryOPVFGNode,
205
+ ActualParmVFGNode,
206
+ FormalParmVFGNode,
207
+ ActualRetVFGNode,
208
+ FormalRetVFGNode,
209
+ NullPtrVFGNode>(node);
210
+ }
211
+
212
+ // Given an VFG node, return its left hand side top level pointer (PAGnode)
213
+ const PAGNode* getLHSTopLevPtr(const VFGNode* node) const;
214
+
215
+ /// Existence checks for VFGNodes
216
+ //@{
217
+ inline bool hasStmtVFGNode(const PAGEdge* pagEdge) const
218
+ {
219
+ return PAGEdgeToStmtVFGNodeMap.find(pagEdge) != PAGEdgeToStmtVFGNodeMap.end();
220
+ }
221
+ inline bool hasIntraPHIVFGNode(const PAGNode* pagNode) const
222
+ {
223
+ return PAGNodeToIntraPHIVFGNodeMap.find(pagNode) != PAGNodeToIntraPHIVFGNodeMap.end();
224
+ }
225
+ inline bool hasBinaryOPVFGNode(const PAGNode* pagNode) const
226
+ {
227
+ return PAGNodeToBinaryOPVFGNodeMap.find(pagNode) != PAGNodeToBinaryOPVFGNodeMap.end();
228
+ }
229
+ inline bool hasUnaryOPVFGNode(const PAGNode* pagNode) const
230
+ {
231
+ return PAGNodeToUnaryOPVFGNodeMap.find(pagNode) != PAGNodeToUnaryOPVFGNodeMap.end();
232
+ }
233
+ inline bool hasBranchVFGNode(const PAGNode* pagNode) const
234
+ {
235
+ return PAGNodeToBranchVFGNodeMap.find(pagNode) != PAGNodeToBranchVFGNodeMap.end();
236
+ }
237
+ inline bool hasCmpVFGNode(const PAGNode* pagNode) const
238
+ {
239
+ return PAGNodeToCmpVFGNodeMap.find(pagNode) != PAGNodeToCmpVFGNodeMap.end();
240
+ }
241
+ inline bool hasActualParmVFGNode(const PAGNode* aparm,const CallICFGNode* cs) const
242
+ {
243
+ return PAGNodeToActualParmMap.find(std::make_pair(aparm->getId(),cs)) != PAGNodeToActualParmMap.end();
244
+ }
245
+ inline bool hasActualRetVFGNode(const PAGNode* aret) const
246
+ {
247
+ return PAGNodeToActualRetMap.find(aret) != PAGNodeToActualRetMap.end();
248
+ }
249
+ inline bool hasFormalParmVFGNode(const PAGNode* fparm) const
250
+ {
251
+ return PAGNodeToFormalParmMap.find(fparm) != PAGNodeToFormalParmMap.end();
252
+ }
253
+ inline bool hasFormalRetVFGNode(const PAGNode* fret) const
254
+ {
255
+ return PAGNodeToFormalRetMap.find(fret) != PAGNodeToFormalRetMap.end();
256
+ }
257
+ //@}
258
+
259
+ /// Get an VFGNode
260
+ //@{
261
+ inline StmtVFGNode* getStmtVFGNode(const PAGEdge* pagEdge) const
262
+ {
263
+ PAGEdgeToStmtVFGNodeMapTy::const_iterator it = PAGEdgeToStmtVFGNodeMap.find(pagEdge);
264
+ assert(it != PAGEdgeToStmtVFGNodeMap.end() && "StmtVFGNode can not be found??");
265
+ return it->second;
266
+ }
267
+ inline IntraPHIVFGNode* getIntraPHIVFGNode(const PAGNode* pagNode) const
268
+ {
269
+ PAGNodeToPHIVFGNodeMapTy::const_iterator it = PAGNodeToIntraPHIVFGNodeMap.find(pagNode);
270
+ assert(it != PAGNodeToIntraPHIVFGNodeMap.end() && "PHIVFGNode can not be found??");
271
+ return it->second;
272
+ }
273
+ inline BinaryOPVFGNode* getBinaryOPVFGNode(const PAGNode* pagNode) const
274
+ {
275
+ PAGNodeToBinaryOPVFGNodeMapTy::const_iterator it = PAGNodeToBinaryOPVFGNodeMap.find(pagNode);
276
+ assert(it != PAGNodeToBinaryOPVFGNodeMap.end() && "BinaryOPVFGNode can not be found??");
277
+ return it->second;
278
+ }
279
+ inline UnaryOPVFGNode* getUnaryOPVFGNode(const PAGNode* pagNode) const
280
+ {
281
+ PAGNodeToUnaryOPVFGNodeMapTy::const_iterator it = PAGNodeToUnaryOPVFGNodeMap.find(pagNode);
282
+ assert(it != PAGNodeToUnaryOPVFGNodeMap.end() && "UnaryOPVFGNode can not be found??");
283
+ return it->second;
284
+ }
285
+ inline BranchVFGNode* getBranchVFGNode(const PAGNode* pagNode) const
286
+ {
287
+ PAGNodeToBranchVFGNodeMapTy::const_iterator it = PAGNodeToBranchVFGNodeMap.find(pagNode);
288
+ assert(it != PAGNodeToBranchVFGNodeMap.end() && "BranchVFGNode can not be found??");
289
+ return it->second;
290
+ }
291
+ inline CmpVFGNode* getCmpVFGNode(const PAGNode* pagNode) const
292
+ {
293
+ PAGNodeToCmpVFGNodeMapTy::const_iterator it = PAGNodeToCmpVFGNodeMap.find(pagNode);
294
+ assert(it != PAGNodeToCmpVFGNodeMap.end() && "CmpVFGNode can not be found??");
295
+ return it->second;
296
+ }
297
+ inline ActualParmVFGNode* getActualParmVFGNode(const PAGNode* aparm,const CallICFGNode* cs) const
298
+ {
299
+ PAGNodeToActualParmMapTy::const_iterator it = PAGNodeToActualParmMap.find(std::make_pair(aparm->getId(),cs));
300
+ assert(it!=PAGNodeToActualParmMap.end() && "actual parameter VFG node can not be found??");
301
+ return it->second;
302
+ }
303
+ inline ActualRetVFGNode* getActualRetVFGNode(const PAGNode* aret) const
304
+ {
305
+ PAGNodeToActualRetMapTy::const_iterator it = PAGNodeToActualRetMap.find(aret);
306
+ assert(it!=PAGNodeToActualRetMap.end() && "actual return VFG node can not be found??");
307
+ return it->second;
308
+ }
309
+ inline FormalParmVFGNode* getFormalParmVFGNode(const PAGNode* fparm) const
310
+ {
311
+ PAGNodeToFormalParmMapTy::const_iterator it = PAGNodeToFormalParmMap.find(fparm);
312
+ assert(it!=PAGNodeToFormalParmMap.end() && "formal parameter VFG node can not be found??");
313
+ return it->second;
314
+ }
315
+ inline FormalRetVFGNode* getFormalRetVFGNode(const PAGNode* fret) const
316
+ {
317
+ PAGNodeToFormalRetMapTy::const_iterator it = PAGNodeToFormalRetMap.find(fret);
318
+ assert(it!=PAGNodeToFormalRetMap.end() && "formal return VFG node can not be found??");
319
+ return it->second;
320
+ }
321
+ //@}
322
+
323
+ /// Whether a node is function entry VFGNode
324
+ const FunObjVar* isFunEntryVFGNode(const VFGNode* node) const;
325
+
326
+ /// Whether a PAGNode has a blackhole or const object as its definition
327
+ inline bool hasBlackHoleConstObjAddrAsDef(const PAGNode* pagNode) const
328
+ {
329
+ if (hasDef(pagNode))
330
+ {
331
+ const VFGNode* defNode = getVFGNode(getDef(pagNode));
332
+ if (const AddrVFGNode* addr = SVFUtil::dyn_cast<AddrVFGNode>(defNode))
333
+ {
334
+ if (SVFIR::getPAG()->isBlkObjOrConstantObj(addr->getPAGEdge()->getSrcID()))
335
+ return true;
336
+ }
337
+ else if(const CopyVFGNode* copy = SVFUtil::dyn_cast<CopyVFGNode>(defNode))
338
+ {
339
+ if (SVFIR::getPAG()->isNullPtr(copy->getPAGEdge()->getSrcID()))
340
+ return true;
341
+ }
342
+ }
343
+ return false;
344
+ }
345
+
346
+ /// Return all the VFGNodes of a function
347
+ ///@{
348
+ inline VFGNodeSet& getVFGNodes(const FunObjVar *fun)
349
+ {
350
+ return funToVFGNodesMap[fun];
351
+ }
352
+ inline bool hasVFGNodes(const FunObjVar *fun) const
353
+ {
354
+ return funToVFGNodesMap.find(fun) != funToVFGNodesMap.end();
355
+ }
356
+ inline bool VFGNodes(const FunObjVar *fun) const
357
+ {
358
+ return funToVFGNodesMap.find(fun) != funToVFGNodesMap.end();
359
+ }
360
+ inline VFGNodeSet::const_iterator getVFGNodeBegin(const FunObjVar *fun) const
361
+ {
362
+ FunToVFGNodesMapTy::const_iterator it = funToVFGNodesMap.find(fun);
363
+ assert(it != funToVFGNodesMap.end() && "this function does not have any VFGNode");
364
+ return it->second.begin();
365
+ }
366
+ inline VFGNodeSet::const_iterator getVFGNodeEnd(const FunObjVar *fun) const
367
+ {
368
+ FunToVFGNodesMapTy::const_iterator it = funToVFGNodesMap.find(fun);
369
+ assert(it != funToVFGNodesMap.end() && "this function does not have any VFGNode");
370
+ return it->second.end();
371
+ }
372
+ ///@}
373
+ /// Add control-flow edges for top level pointers
374
+ //@{
375
+ VFGEdge* addIntraDirectVFEdge(NodeID srcId, NodeID dstId);
376
+ VFGEdge* addCallEdge(NodeID srcId, NodeID dstId, CallSiteID csId);
377
+ VFGEdge* addRetEdge(NodeID srcId, NodeID dstId, CallSiteID csId);
378
+ //@}
379
+
380
+ /// Remove a SVFG edge
381
+ inline void removeVFGEdge(VFGEdge* edge)
382
+ {
383
+ edge->getDstNode()->removeIncomingEdge(edge);
384
+ edge->getSrcNode()->removeOutgoingEdge(edge);
385
+ delete edge;
386
+ }
387
+ /// Remove a VFGNode
388
+ inline void removeVFGNode(VFGNode* node)
389
+ {
390
+ removeGNode(node);
391
+ }
392
+
393
+ /// Whether we has a SVFG edge
394
+ //@{
395
+ VFGEdge* hasIntraVFGEdge(VFGNode* src, VFGNode* dst, VFGEdge::VFGEdgeK kind);
396
+ VFGEdge* hasInterVFGEdge(VFGNode* src, VFGNode* dst, VFGEdge::VFGEdgeK kind, CallSiteID csId);
397
+ VFGEdge* hasThreadVFGEdge(VFGNode* src, VFGNode* dst, VFGEdge::VFGEdgeK kind);
398
+ //@}
399
+
400
+ /// Add VFG edge
401
+ inline bool addVFGEdge(VFGEdge* edge)
402
+ {
403
+ bool added1 = edge->getDstNode()->addIncomingEdge(edge);
404
+ bool added2 = edge->getSrcNode()->addOutgoingEdge(edge);
405
+ bool both_added = added1 & added2;
406
+ assert(both_added && "VFGEdge not added??");
407
+ return both_added;
408
+ }
409
+
410
+ protected:
411
+
412
+ /// sanitize Intra edges, verify that both nodes belong to the same function.
413
+ inline void checkIntraEdgeParents(const VFGNode *srcNode, const VFGNode *dstNode)
414
+ {
415
+ const FunObjVar *srcfun = srcNode->getFun();
416
+ const FunObjVar *dstfun = dstNode->getFun();
417
+ if(srcfun != nullptr && dstfun != nullptr)
418
+ {
419
+ assert((srcfun == dstfun) && "src and dst nodes of an intra VFG edge are not in the same function?");
420
+ }
421
+ }
422
+
423
+ /// Add inter VF edge from actual to formal parameters
424
+ inline VFGEdge* addInterEdgeFromAPToFP(ActualParmVFGNode* src, FormalParmVFGNode* dst, CallSiteID csId)
425
+ {
426
+ return addCallEdge(src->getId(),dst->getId(),csId);
427
+ }
428
+ /// Add inter VF edge from callee return to callsite receive parameter
429
+ inline VFGEdge* addInterEdgeFromFRToAR(FormalRetVFGNode* src, ActualRetVFGNode* dst, CallSiteID csId)
430
+ {
431
+ return addRetEdge(src->getId(),dst->getId(),csId);
432
+ }
433
+
434
+ /// Add inter VF edge from actual to formal parameters
435
+ inline VFGEdge* addInterEdgeFromAPToFP(NodeID src, NodeID dst, CallSiteID csId)
436
+ {
437
+ return addCallEdge(src,dst,csId);
438
+ }
439
+ /// Add inter VF edge from callee return to callsite receive parameter
440
+ inline VFGEdge* addInterEdgeFromFRToAR(NodeID src, NodeID dst, CallSiteID csId)
441
+ {
442
+ return addRetEdge(src,dst,csId);
443
+ }
444
+
445
+ /// Connect VFG nodes between caller and callee for indirect call site
446
+ //@{
447
+ /// Connect actual-param and formal param
448
+ virtual inline void connectAParamAndFParam(const PAGNode* csArg, const PAGNode* funArg, const CallICFGNode* cbn, CallSiteID csId, VFGEdgeSetTy& edges)
449
+ {
450
+ NodeID actualParam = getActualParmVFGNode(csArg, cbn)->getId();
451
+ NodeID formalParam = getFormalParmVFGNode(funArg)->getId();
452
+ VFGEdge* edge = addInterEdgeFromAPToFP(actualParam, formalParam,csId);
453
+ if (edge != nullptr)
454
+ edges.insert(edge);
455
+ }
456
+ /// Connect formal-ret and actual ret
457
+ virtual inline void connectFRetAndARet(const PAGNode* funReturn, const PAGNode* csReturn, CallSiteID csId, VFGEdgeSetTy& edges)
458
+ {
459
+ NodeID formalRet = getFormalRetVFGNode(funReturn)->getId();
460
+ NodeID actualRet = getActualRetVFGNode(csReturn)->getId();
461
+ VFGEdge* edge = addInterEdgeFromFRToAR(formalRet, actualRet,csId);
462
+ if (edge != nullptr)
463
+ edges.insert(edge);
464
+ }
465
+ //@}
466
+
467
+ /// Given a PAGNode, set/get its def VFG node (definition of top level pointers)
468
+ //@{
469
+ inline void setDef(const PAGNode* pagNode, const VFGNode* node)
470
+ {
471
+ PAGNodeToDefMapTy::iterator it = PAGNodeToDefMap.find(pagNode);
472
+ if(it == PAGNodeToDefMap.end())
473
+ {
474
+ PAGNodeToDefMap[pagNode] = node->getId();
475
+ assert(hasVFGNode(node->getId()) && "not in the map!!");
476
+ }
477
+ else
478
+ {
479
+ assert((it->second == node->getId()) && "a SVFVar can only have unique definition ");
480
+ }
481
+ }
482
+ inline NodeID getDef(const PAGNode* pagNode) const
483
+ {
484
+ PAGNodeToDefMapTy::const_iterator it = PAGNodeToDefMap.find(pagNode);
485
+ assert(it!=PAGNodeToDefMap.end() && "SVFVar does not have a definition??");
486
+ return it->second;
487
+ }
488
+ inline bool hasDef(const PAGNode* pagNode) const
489
+ {
490
+ return (PAGNodeToDefMap.find(pagNode) != PAGNodeToDefMap.end());
491
+ }
492
+ //@}
493
+
494
+ /// Create VFG nodes
495
+ void addVFGNodes();
496
+
497
+ /// Get PAGEdge set
498
+ virtual inline SVFStmt::SVFStmtSetTy& getPAGEdgeSet(SVFStmt::PEDGEK kind)
499
+ {
500
+ if (isPtrOnlySVFG())
501
+ return pag->getPTASVFStmtSet(kind);
502
+ else
503
+ return pag->getSVFStmtSet(kind);
504
+ }
505
+
506
+ virtual inline bool isInterestedPAGNode(const SVFVar* node) const
507
+ {
508
+ if (isPtrOnlySVFG())
509
+ return node->isPointer();
510
+ else
511
+ return true;
512
+ }
513
+
514
+ /// Create edges between VFG nodes within a function
515
+ void connectDirectVFGEdges();
516
+
517
+ /// Create edges between VFG nodes across functions
518
+ void addVFGInterEdges(const CallICFGNode* cs, const FunObjVar* callee);
519
+
520
+ inline bool isPhiCopyEdge(const PAGEdge* copy) const
521
+ {
522
+ return pag->isPhiNode(copy->getDstNode());
523
+ }
524
+
525
+ /// Add a VFG node
526
+ virtual inline void addVFGNode(VFGNode* vfgNode, ICFGNode* icfgNode)
527
+ {
528
+ addGNode(vfgNode->getId(), vfgNode);
529
+ vfgNode->setICFGNode(icfgNode);
530
+ icfgNode->addVFGNode(vfgNode);
531
+
532
+ if(const FunObjVar* fun = icfgNode->getFun())
533
+ funToVFGNodesMap[fun].insert(vfgNode);
534
+ else
535
+ globalVFGNodes.insert(vfgNode);
536
+ }
537
+
538
+ /// Add a VFG node for program statement
539
+ inline void addStmtVFGNode(StmtVFGNode* node, const PAGEdge* pagEdge)
540
+ {
541
+ assert(PAGEdgeToStmtVFGNodeMap.find(pagEdge)==PAGEdgeToStmtVFGNodeMap.end() && "should not insert twice!");
542
+ PAGEdgeToStmtVFGNodeMap[pagEdge] = node;
543
+ addVFGNode(node, pagEdge->getICFGNode());
544
+ }
545
+ /// Add a Dummy VFG node for null pointer definition
546
+ /// To be noted for black hole pointer it has already has address edge connected
547
+ inline void addNullPtrVFGNode(const PAGNode* pagNode)
548
+ {
549
+ NullPtrVFGNode* sNode = new NullPtrVFGNode(totalVFGNode++,pagNode);
550
+ addVFGNode(sNode, pag->getICFG()->getGlobalICFGNode());
551
+ setDef(pagNode,sNode);
552
+ }
553
+ /// Add an Address VFG node
554
+ inline void addAddrVFGNode(const AddrStmt* addr)
555
+ {
556
+ AddrVFGNode* sNode = new AddrVFGNode(totalVFGNode++,addr);
557
+ addStmtVFGNode(sNode, addr);
558
+ setDef(addr->getLHSVar(),sNode);
559
+ }
560
+ /// Add a Copy VFG node
561
+ inline void addCopyVFGNode(const CopyStmt* copy)
562
+ {
563
+ CopyVFGNode* sNode = new CopyVFGNode(totalVFGNode++,copy);
564
+ addStmtVFGNode(sNode, copy);
565
+ setDef(copy->getLHSVar(),sNode);
566
+ }
567
+ /// Add a Gep VFG node
568
+ inline void addGepVFGNode(const GepStmt* gep)
569
+ {
570
+ GepVFGNode* sNode = new GepVFGNode(totalVFGNode++,gep);
571
+ addStmtVFGNode(sNode, gep);
572
+ setDef(gep->getLHSVar(),sNode);
573
+ }
574
+ /// Add a Load VFG node
575
+ void addLoadVFGNode(const LoadStmt* load)
576
+ {
577
+ LoadVFGNode* sNode = new LoadVFGNode(totalVFGNode++,load);
578
+ addStmtVFGNode(sNode, load);
579
+ setDef(load->getLHSVar(),sNode);
580
+ }
581
+ /// Add a Store VFG node,
582
+ /// To be noted store does not create a new pointer, we do not set def for any SVFIR node
583
+ void addStoreVFGNode(const StoreStmt* store)
584
+ {
585
+ StoreVFGNode* sNode = new StoreVFGNode(totalVFGNode++,store);
586
+ addStmtVFGNode(sNode, store);
587
+ }
588
+
589
+ /// Add an actual parameter VFG node
590
+ /// To be noted that multiple actual parameters may have same value (PAGNode)
591
+ /// So we need to make a pair <PAGNodeID,CallSiteID> to find the right VFGParmNode
592
+ inline void addActualParmVFGNode(const PAGNode* aparm, const CallICFGNode* cs)
593
+ {
594
+ ActualParmVFGNode* sNode = new ActualParmVFGNode(totalVFGNode++,aparm,cs);
595
+ addVFGNode(sNode, const_cast<CallICFGNode*>(cs));
596
+ PAGNodeToActualParmMap[std::make_pair(aparm->getId(),cs)] = sNode;
597
+ /// do not set def here, this node is not a variable definition
598
+ }
599
+ /// Add a formal parameter VFG node
600
+ inline void addFormalParmVFGNode(const PAGNode* fparm, const FunObjVar* fun, CallPESet& callPEs)
601
+ {
602
+ FormalParmVFGNode* sNode = new FormalParmVFGNode(totalVFGNode++,fparm,fun);
603
+ addVFGNode(sNode, pag->getICFG()->getFunEntryICFGNode(fun));
604
+ for(CallPESet::const_iterator it = callPEs.begin(), eit=callPEs.end();
605
+ it!=eit; ++it)
606
+ sNode->addCallPE(*it);
607
+
608
+ setDef(fparm,sNode);
609
+ PAGNodeToFormalParmMap[fparm] = sNode;
610
+ }
611
+ /// Add a callee Return VFG node
612
+ /// To be noted that here we assume returns of a procedure have already been unified into one
613
+ /// Otherwise, we need to handle formalRet using <PAGNodeID,CallSiteID> pair to find FormalRetVFG node same as handling actual parameters
614
+ inline void addFormalRetVFGNode(const PAGNode* uniqueFunRet, const FunObjVar* fun, RetPESet& retPEs)
615
+ {
616
+ FormalRetVFGNode *sNode = new FormalRetVFGNode(totalVFGNode++, uniqueFunRet, fun);
617
+ addVFGNode(sNode, pag->getICFG()->getFunExitICFGNode(fun));
618
+ for (RetPESet::const_iterator it = retPEs.begin(), eit = retPEs.end(); it != eit; ++it)
619
+ sNode->addRetPE(*it);
620
+
621
+ PAGNodeToFormalRetMap[uniqueFunRet] = sNode;
622
+ /// if this uniqueFunRet is a phi node, which means it will receive values from multiple return instructions of fun
623
+ /// we will set this phi node's def later
624
+ /// Ideally, every function uniqueFunRet should be a PhiNode (SVFIRBuilder.cpp), unless it does not have ret instruction
625
+ if (!pag->isPhiNode(uniqueFunRet))
626
+ {
627
+ std::string warn = fun->getName();
628
+ SVFUtil::writeWrnMsg(warn + " does not have any ret instruction!");
629
+ setDef(uniqueFunRet, sNode);
630
+ }
631
+ }
632
+ /// Add a callsite Receive VFG node
633
+ inline void addActualRetVFGNode(const PAGNode* ret,const CallICFGNode* cs)
634
+ {
635
+ ActualRetVFGNode* sNode = new ActualRetVFGNode(totalVFGNode++,ret,cs);
636
+ addVFGNode(sNode, const_cast<RetICFGNode*>(cs->getRetICFGNode()));
637
+ setDef(ret,sNode);
638
+ PAGNodeToActualRetMap[ret] = sNode;
639
+ }
640
+ /// Add an llvm PHI VFG node
641
+ inline void addIntraPHIVFGNode(const MultiOpndStmt* edge)
642
+ {
643
+ IntraPHIVFGNode* sNode = new IntraPHIVFGNode(totalVFGNode++,edge->getRes());
644
+ u32_t pos = 0;
645
+ for(auto var : edge->getOpndVars())
646
+ {
647
+ sNode->setOpVerAndBB(pos, var, edge->getICFGNode());
648
+ pos++;
649
+ }
650
+ addVFGNode(sNode,edge->getICFGNode());
651
+ setDef(edge->getRes(),sNode);
652
+ PAGNodeToIntraPHIVFGNodeMap[edge->getRes()] = sNode;
653
+ }
654
+ /// Add a Compare VFG node
655
+ inline void addCmpVFGNode(const CmpStmt* edge)
656
+ {
657
+ CmpVFGNode* sNode = new CmpVFGNode(totalVFGNode++, edge->getRes());
658
+ u32_t pos = 0;
659
+ for(auto var : edge->getOpndVars())
660
+ {
661
+ sNode->setOpVer(pos, var);
662
+ pos++;
663
+ }
664
+ addVFGNode(sNode,edge->getICFGNode());
665
+ setDef(edge->getRes(),sNode);
666
+ PAGNodeToCmpVFGNodeMap[edge->getRes()] = sNode;
667
+ }
668
+ /// Add a BinaryOperator VFG node
669
+ inline void addBinaryOPVFGNode(const BinaryOPStmt* edge)
670
+ {
671
+ BinaryOPVFGNode* sNode = new BinaryOPVFGNode(totalVFGNode++, edge->getRes());
672
+ u32_t pos = 0;
673
+ for(auto var : edge->getOpndVars())
674
+ {
675
+ sNode->setOpVer(pos, var);
676
+ pos++;
677
+ }
678
+ addVFGNode(sNode,edge->getICFGNode());
679
+ setDef(edge->getRes(),sNode);
680
+ PAGNodeToBinaryOPVFGNodeMap[edge->getRes()] = sNode;
681
+ }
682
+ /// Add a UnaryOperator VFG node
683
+ inline void addUnaryOPVFGNode(const UnaryOPStmt* edge)
684
+ {
685
+ UnaryOPVFGNode* sNode = new UnaryOPVFGNode(totalVFGNode++, edge->getRes());
686
+ sNode->setOpVer(0, edge->getOpVar());
687
+ addVFGNode(sNode,edge->getICFGNode());
688
+ setDef(edge->getRes(),sNode);
689
+ PAGNodeToUnaryOPVFGNodeMap[edge->getRes()] = sNode;
690
+ }
691
+ /// Add a BranchVFGNode
692
+ inline void addBranchVFGNode(const BranchStmt* edge)
693
+ {
694
+ BranchVFGNode* sNode = new BranchVFGNode(totalVFGNode++, edge);
695
+ addVFGNode(sNode,edge->getICFGNode());
696
+ setDef(edge->getBranchInst(),sNode);
697
+ PAGNodeToBranchVFGNodeMap[edge->getBranchInst()] = sNode;
698
+ }
699
+ };
700
+
701
+ } // End namespace SVF
702
+
703
+ namespace SVF
704
+ {
705
+ /* !
706
+ * GenericGraphTraits specializations for generic graph algorithms.
707
+ * Provide graph traits for traversing from a constraint node using standard graph traversals.
708
+ */
709
+ template<> struct GenericGraphTraits<SVF::VFGNode*> : public GenericGraphTraits<SVF::GenericNode<SVF::VFGNode,SVF::VFGEdge>* >
710
+ {
711
+ };
712
+
713
+ /// Inverse GenericGraphTraits specializations for call graph node, it is used for inverse traversal.
714
+ template<>
715
+ struct GenericGraphTraits<Inverse<SVF::VFGNode *> > : public GenericGraphTraits<Inverse<SVF::GenericNode<SVF::VFGNode,SVF::VFGEdge>* > >
716
+ {
717
+ };
718
+
719
+ template<> struct GenericGraphTraits<SVF::VFG*> : public GenericGraphTraits<SVF::GenericGraph<SVF::VFGNode,SVF::VFGEdge>* >
720
+ {
721
+ typedef SVF::VFGNode *NodeRef;
722
+ };
723
+
724
+ } // End namespace llvm
725
+
726
+ #endif /* INCLUDE_UTIL_VFG_H_ */