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,872 @@
1
+ //===- WTO.h -- Weakest Topological Order Analysis-------------------------//
2
+ //
3
+ // SVF: Static Value-Flow Analysis
4
+ //
5
+ // Copyright (C) <2013-> <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 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 General Public License for more details.
17
+
18
+ // You should have received a copy of the GNU General Public License
19
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+ //
21
+ //===----------------------------------------------------------------------===//
22
+
23
+ /*
24
+ * WTO.h
25
+ *
26
+ * The implementation is based on F. Bourdoncle's paper:
27
+ * "Efficient chaotic iteration strategies with widenings", Formal
28
+ * Methods in Programming and Their Applications, 1993, pages 128-141.
29
+ *
30
+ * Created on: Jan 22, 2024
31
+ * Author: Xiao Cheng, Jiawei Wang
32
+ *
33
+ */
34
+ #ifndef WTO_H_
35
+ #define WTO_H_
36
+
37
+ #include "SVFIR/SVFType.h"
38
+ #include "SVFIR/SVFValue.h"
39
+ #include <functional>
40
+
41
+ namespace SVF
42
+ {
43
+
44
+ template <typename GraphT> class WTO;
45
+
46
+ template <typename GraphT> class WTONode;
47
+
48
+ template <typename GraphT> class WTOCycle;
49
+
50
+ template <typename GraphT> class WTOComponentVisitor;
51
+
52
+ // Helper to test for the existence of a sub type
53
+ template <typename T, typename = void> struct has_nodetype : std::false_type
54
+ {
55
+ };
56
+
57
+ template <typename T>
58
+ struct has_nodetype<T, std::void_t<typename T::NodeType>> : std::true_type
59
+ {
60
+ };
61
+
62
+ template <typename T, typename = void> struct has_edgetype : std::false_type
63
+ {
64
+ };
65
+
66
+ template <typename T>
67
+ struct has_edgetype<T, std::void_t<typename T::EdgeType>> : std::true_type
68
+ {
69
+ };
70
+
71
+ /*!
72
+ * Cycle depth of a WTO Component
73
+ *
74
+ * The cycle depth is represented as **a list of cycle's heads**,
75
+ * **from the outermost to the innermost**.
76
+ *
77
+ * e.g., consider the following nested cycle:
78
+ *
79
+ * -->1 --> 2 --> 3 --> 4
80
+ * \ /
81
+ * <-- 6 <-- 5 <--
82
+ * \ /
83
+ * >7>
84
+ *
85
+ * where C1: (1 2 3 4 5 6 7) is the outer cycle, where 1 is the head,
86
+ * and C2: (5 6 7) is the inner cycle, where 5 is the head.
87
+ *
88
+ * The cycle depth is as following:
89
+ * ---------------------------------
90
+ * | Node NO. | Cycle Depth |
91
+ * --------------------------------
92
+ * | 1 (head of C1) | [ ] |
93
+ * --------------------------------
94
+ * | 2, 3, 4 | [1] |
95
+ * --------------------------------
96
+ * | 5 (head of C2) | [1] |
97
+ * --------------------------------
98
+ * | 6, 7 | [1, 5] |
99
+ * --------------------------------
100
+ */
101
+ template <typename GraphT> class WTOCycleDepth
102
+ {
103
+ public:
104
+ static_assert(has_nodetype<GraphT>::value,
105
+ "GraphT must have a nested type named 'NodeType'");
106
+ typedef typename GraphT::NodeType NodeT;
107
+
108
+ private:
109
+ typedef std::vector<const NodeT*> NodeRefList;
110
+
111
+ public:
112
+ typedef typename NodeRefList::const_iterator Iterator;
113
+
114
+ private:
115
+ NodeRefList _heads;
116
+
117
+ public:
118
+ /// Constructor
119
+ WTOCycleDepth() = default;
120
+
121
+ /// Copy constructor
122
+ WTOCycleDepth(const WTOCycleDepth&) = default;
123
+
124
+ /// Move constructor
125
+ WTOCycleDepth(WTOCycleDepth&&) = default;
126
+
127
+ /// Copy assignment operator
128
+ WTOCycleDepth& operator=(const WTOCycleDepth&) = default;
129
+
130
+ /// Move assignment operator
131
+ WTOCycleDepth& operator=(WTOCycleDepth&&) = default;
132
+
133
+ /// Destructor
134
+ ~WTOCycleDepth() = default;
135
+
136
+ /// Add a cycle head in the cycleDepth
137
+ void add(const NodeT* head)
138
+ {
139
+ _heads.push_back(head);
140
+ }
141
+
142
+ /// Begin iterator over the head of cycles
143
+ Iterator begin() const
144
+ {
145
+ return _heads.cbegin();
146
+ }
147
+
148
+ /// End iterator over the head of cycles
149
+ Iterator end() const
150
+ {
151
+ return _heads.cend();
152
+ }
153
+
154
+ /// Return the common prefix of the given cycle depths
155
+ WTOCycleDepth operator^(const WTOCycleDepth& other) const
156
+ {
157
+ WTOCycleDepth res;
158
+ for (auto this_it = begin(), other_it = other.begin();
159
+ this_it != end() && other_it != other.end(); ++this_it, ++other_it)
160
+ {
161
+ if (*this_it == *other_it)
162
+ {
163
+ res.add(*this_it);
164
+ }
165
+ else
166
+ {
167
+ break;
168
+ }
169
+ }
170
+ return res;
171
+ }
172
+
173
+ private:
174
+ /// Compare the given cycle depths
175
+ int compare(const WTOCycleDepth& other) const
176
+ {
177
+ if (this == &other)
178
+ {
179
+ return 0; // equals
180
+ }
181
+
182
+ auto this_it = begin();
183
+ auto other_it = other.begin();
184
+ while (this_it != end())
185
+ {
186
+ if (other_it == other.end())
187
+ {
188
+ return 1; // `this` is nested within `other`
189
+ }
190
+ else if (*this_it == *other_it)
191
+ {
192
+ ++this_it;
193
+ ++other_it;
194
+ }
195
+ else
196
+ {
197
+ return 2; // not comparable
198
+ }
199
+ }
200
+ if (other_it == other.end())
201
+ {
202
+ return 0; // equals
203
+ }
204
+ else
205
+ {
206
+ return -1; // `other` is nested within `this`
207
+ }
208
+ }
209
+
210
+ public:
211
+ bool operator<(const WTOCycleDepth& other) const
212
+ {
213
+ return compare(other) == -1;
214
+ }
215
+
216
+ bool operator<=(const WTOCycleDepth& other) const
217
+ {
218
+ return compare(other) <= 0;
219
+ }
220
+
221
+ bool operator==(const WTOCycleDepth& other) const
222
+ {
223
+ return compare(other) == 0;
224
+ }
225
+
226
+ bool operator>=(const WTOCycleDepth& other) const
227
+ {
228
+ return operator<=(other, *this);
229
+ }
230
+
231
+ bool operator>(const WTOCycleDepth& other) const
232
+ {
233
+ return compare(other) == 1;
234
+ }
235
+
236
+ /// Dump the cycleDepth, for debugging purpose
237
+ [[nodiscard]] std::string toString() const
238
+ {
239
+ std::string str;
240
+ std::stringstream rawstr(str);
241
+ rawstr << "[";
242
+ for (auto it = begin(), et = end(); it != et;)
243
+ {
244
+ rawstr << (*it)->toString();
245
+ ++it;
246
+ if (it != et)
247
+ {
248
+ rawstr << ", ";
249
+ }
250
+ }
251
+ rawstr << "]";
252
+ return rawstr.str();
253
+ }
254
+
255
+ /// Overloading operator << for dumping ICFG node ID
256
+ //@{
257
+ friend std::ostream& operator<<(std::ostream& o,
258
+ const WTOCycleDepth<GraphT>& wto)
259
+ {
260
+ o << wto.toString();
261
+ return o;
262
+ }
263
+ //@}
264
+
265
+ }; // end class WTOCycleDepth
266
+
267
+ /*!
268
+ * Base class for a WTO component
269
+ *
270
+ * A WTO component can be either a node or cycle
271
+ */
272
+ template <typename GraphT> class WTOComponent
273
+ {
274
+ public:
275
+ enum WTOCT
276
+ {
277
+ Node,
278
+ Cycle
279
+ };
280
+
281
+ /// Default constructor
282
+ explicit WTOComponent(WTOCT k) : _type(k) {};
283
+
284
+ /// Copy constructor
285
+ WTOComponent(const WTOComponent&) noexcept = default;
286
+
287
+ /// Move constructor
288
+ WTOComponent(WTOComponent&&) noexcept = default;
289
+
290
+ /// Copy assignment operator
291
+ WTOComponent& operator=(const WTOComponent&) noexcept = default;
292
+
293
+ /// Move assignment operator
294
+ WTOComponent& operator=(WTOComponent&&) noexcept = default;
295
+
296
+ /// Accept the given visitor
297
+ virtual void accept(WTOComponentVisitor<GraphT>&) const = 0;
298
+
299
+ /// Destructor
300
+ virtual ~WTOComponent() = default;
301
+
302
+ inline WTOCT getKind() const
303
+ {
304
+ return _type;
305
+ }
306
+
307
+ [[nodiscard]] virtual std::string toString() const = 0;
308
+
309
+ /// Overloading operator << for dumping ICFG node ID
310
+ //@{
311
+ friend std::ostream& operator<<(std::ostream& o,
312
+ const WTOComponent<GraphT>& wto)
313
+ {
314
+ o << wto.toString();
315
+ return o;
316
+ }
317
+ //@}
318
+
319
+ WTOCT _type;
320
+
321
+ }; // end class WTOComponent
322
+
323
+ /*!
324
+ * WTO node for GraphT
325
+ */
326
+ template <typename GraphT> class WTONode final : public WTOComponent<GraphT>
327
+ {
328
+ public:
329
+ static_assert(has_nodetype<GraphT>::value,
330
+ "GraphT must have a nested type named 'NodeType'");
331
+ typedef typename GraphT::NodeType NodeT;
332
+
333
+ private:
334
+ const NodeT* _node;
335
+
336
+ public:
337
+ /// Constructor
338
+ explicit WTONode(const NodeT* node)
339
+ : WTOComponent<GraphT>(WTOComponent<GraphT>::Node), _node(node)
340
+ {
341
+ }
342
+
343
+ /// Return the graph node
344
+ const NodeT* getICFGNode() const
345
+ {
346
+ return _node;
347
+ }
348
+
349
+ /// Accept the given visitor
350
+ void accept(WTOComponentVisitor<GraphT>& v) const override
351
+ {
352
+ v.visit(*this);
353
+ }
354
+
355
+ /// Dump the node, for debugging purpose
356
+ [[nodiscard]] std::string toString() const override
357
+ {
358
+ // return _node->toString();
359
+ return std::to_string(_node->getId());
360
+ }
361
+
362
+ /// ClassOf
363
+ //@{
364
+ static inline bool classof(const WTONode<GraphT>*)
365
+ {
366
+ return true;
367
+ }
368
+
369
+ static inline bool classof(const WTOComponent<GraphT>* c)
370
+ {
371
+ return c->getKind() == WTOComponent<GraphT>::Node;
372
+ }
373
+ ///@}
374
+
375
+ }; // end class WTONode
376
+
377
+ /*!
378
+ * WTO cycle for GraphT
379
+ */
380
+ template <typename GraphT> class WTOCycle final : public WTOComponent<GraphT>
381
+ {
382
+ public:
383
+ static_assert(has_nodetype<GraphT>::value,
384
+ "GraphT must have a nested type named 'NodeType'");
385
+ typedef typename GraphT::NodeType NodeT;
386
+ typedef WTOComponent<GraphT> WTOComponentT;
387
+
388
+ private:
389
+ typedef const WTOComponentT* WTOComponentPtr;
390
+ typedef std::list<WTOComponentPtr> WTOComponentRefList;
391
+
392
+ public:
393
+ /// Iterator over the components
394
+ typedef typename WTOComponentRefList::const_iterator Iterator;
395
+
396
+ private:
397
+ /// Head of the cycle
398
+ const WTONode<GraphT>* _head;
399
+
400
+ /// List of components
401
+ WTOComponentRefList _components;
402
+
403
+ public:
404
+ /// Constructor
405
+ WTOCycle(const WTONode<GraphT>* head, WTOComponentRefList components)
406
+ : WTOComponent<GraphT>(WTOComponent<GraphT>::Cycle), _head(head),
407
+ _components(std::move(components))
408
+ {
409
+ }
410
+
411
+ /// Return the head of the cycle
412
+ const WTONode<GraphT>* head() const
413
+ {
414
+ return _head;
415
+ }
416
+
417
+ /// Get all wto components in WTO cycle
418
+ const WTOComponentRefList& getWTOComponents() const
419
+ {
420
+ return _components;
421
+ }
422
+
423
+ /// Begin iterator over the components
424
+ Iterator begin() const
425
+ {
426
+ return _components.cbegin();
427
+ }
428
+
429
+ /// End iterator over the components
430
+ Iterator end() const
431
+ {
432
+ return _components.cend();
433
+ }
434
+
435
+ /// Accept the given visitor
436
+ void accept(WTOComponentVisitor<GraphT>& v) const override
437
+ {
438
+ v.visit(*this);
439
+ }
440
+
441
+ /// ClassOf
442
+ //@{
443
+ static inline bool classof(const WTOCycle<GraphT>*)
444
+ {
445
+ return true;
446
+ }
447
+
448
+ static inline bool classof(const WTOComponent<GraphT>* c)
449
+ {
450
+ return c->getKind() == WTOComponent<GraphT>::Cycle;
451
+ }
452
+ ///@}
453
+
454
+ /// Dump the cycle, for debugging purpose
455
+ [[nodiscard]] std::string toString() const override
456
+ {
457
+ std::string str;
458
+ std::stringstream rawstr(str);
459
+ rawstr << "(";
460
+ rawstr << _head->getICFGNode()->getId() << ", ";
461
+ for (auto it = begin(), et = end(); it != et;)
462
+ {
463
+ rawstr << (*it)->toString();
464
+ ++it;
465
+ if (it != et)
466
+ {
467
+ rawstr << ", ";
468
+ }
469
+ }
470
+ rawstr << ")";
471
+ return rawstr.str();
472
+ }
473
+
474
+ }; // end class WTOCycle
475
+
476
+ /*!
477
+ * Weak topological order (WTO) visitor
478
+ */
479
+ template <typename GraphT> class WTOComponentVisitor
480
+ {
481
+ public:
482
+ typedef WTONode<GraphT> WTONodeT;
483
+ typedef WTOCycle<GraphT> WTOCycleT;
484
+
485
+ public:
486
+ /// Default constructor
487
+ WTOComponentVisitor() = default;
488
+
489
+ /// Copy constructor
490
+ WTOComponentVisitor(const WTOComponentVisitor&) noexcept = default;
491
+
492
+ /// Move constructor
493
+ WTOComponentVisitor(WTOComponentVisitor&&) noexcept = default;
494
+
495
+ /// Copy assignment operator
496
+ WTOComponentVisitor& operator=(const WTOComponentVisitor&) noexcept =
497
+ default;
498
+
499
+ /// Move assignment operator
500
+ WTOComponentVisitor& operator=(WTOComponentVisitor&&) noexcept = default;
501
+
502
+ /// Visit the given node
503
+ virtual void visit(const WTONodeT&) = 0;
504
+
505
+ /// Visit the given cycle
506
+ virtual void visit(const WTOCycleT&) = 0;
507
+
508
+ /// Destructor
509
+ virtual ~WTOComponentVisitor() = default;
510
+
511
+ }; // end class WTOComponentVisitor
512
+
513
+ /*!
514
+ * Weak topological order for GraphT
515
+ */
516
+ template <typename GraphT> class WTO
517
+ {
518
+
519
+ public:
520
+ static_assert(has_nodetype<GraphT>::value,
521
+ "GraphT must have a nested type named 'NodeType'");
522
+ static_assert(has_edgetype<GraphT>::value,
523
+ "GraphT must have a nested type named 'EdgeType'");
524
+ typedef typename GraphT::NodeType NodeT;
525
+ typedef typename GraphT::EdgeType EdgeT;
526
+ typedef WTOCycleDepth<GraphT> GraphTWTOCycleDepth;
527
+ typedef WTOComponent<GraphT> WTOComponentT;
528
+ typedef WTONode<GraphT> WTONodeT;
529
+ typedef WTOCycle<GraphT> WTOCycleT;
530
+ typedef Set<const NodeT*> NodeRefList;
531
+
532
+ protected:
533
+ typedef const WTOComponentT* WTOComponentPtr;
534
+ typedef std::list<WTOComponentPtr> WTOComponentRefList;
535
+ typedef Set<WTOComponentPtr> WTOComponentRefSet;
536
+ typedef Map<const NodeT*, const WTOCycleT*> NodeRefToWTOCycleMap;
537
+ typedef Map<const NodeT*, NodeRefList> NodeRefTONodeRefListMap;
538
+
539
+ typedef u32_t CycleDepthNumber;
540
+ typedef Map<const NodeT*, CycleDepthNumber> NodeRefToCycleDepthNumber;
541
+ typedef std::vector<const NodeT*> Stack;
542
+ typedef std::shared_ptr<GraphTWTOCycleDepth> WTOCycleDepthPtr;
543
+ typedef Map<const NodeT*, WTOCycleDepthPtr> NodeRefToWTOCycleDepthPtr;
544
+
545
+ public:
546
+ /// Iterator over the components
547
+ typedef typename WTOComponentRefList::const_iterator Iterator;
548
+
549
+ protected:
550
+ WTOComponentRefList _components;
551
+ WTOComponentRefSet _allComponents;
552
+ NodeRefToWTOCycleMap headRefToCycle;
553
+ NodeRefToWTOCycleDepthPtr _nodeToDepth;
554
+ NodeRefToCycleDepthNumber _nodeToCDN;
555
+ CycleDepthNumber _num;
556
+ Stack _stack;
557
+ GraphT* _graph;
558
+ const NodeT* _entry;
559
+
560
+ public:
561
+
562
+ /// Compute the weak topological order of the given graph
563
+ explicit WTO(GraphT* graph, const NodeT* entry) : _num(0), _graph(graph), _entry(entry)
564
+ {
565
+ }
566
+
567
+ /// No copy constructor
568
+ WTO(const WTO& other) = default;
569
+
570
+ /// Move constructor
571
+ WTO(WTO&& other) = default;
572
+
573
+ /// No copy assignment operator
574
+ WTO& operator=(const WTO& other) = default;
575
+
576
+ /// Move assignment operator
577
+ WTO& operator=(WTO&& other) = default;
578
+
579
+ /// Destructor
580
+ ~WTO()
581
+ {
582
+ for (const auto& component : _allComponents)
583
+ {
584
+ delete component;
585
+ }
586
+ }
587
+
588
+ /// Get all wto components in WTO
589
+ const WTOComponentRefList& getWTOComponents() const
590
+ {
591
+ return _components;
592
+ }
593
+
594
+ /// Begin iterator over the components
595
+ Iterator begin() const
596
+ {
597
+ return _components.cbegin();
598
+ }
599
+
600
+ /// End iterator over the components
601
+ Iterator end() const
602
+ {
603
+ return _components.cend();
604
+ }
605
+
606
+ bool isHead(const NodeT* node) const
607
+ {
608
+ return headRefToCycle.find(node) != headRefToCycle.end();
609
+ }
610
+
611
+ typename NodeRefToWTOCycleMap::const_iterator headBegin() const
612
+ {
613
+ return headRefToCycle.cbegin();
614
+ }
615
+
616
+ /// End iterator over the components
617
+ typename NodeRefToWTOCycleMap::const_iterator headEnd() const
618
+ {
619
+ return headRefToCycle.cend();
620
+ }
621
+
622
+ /// Return the cycleDepth of the given node
623
+ const GraphTWTOCycleDepth& cycleDepth(const NodeT* n) const
624
+ {
625
+ auto it = _nodeToDepth.find(n);
626
+ assert(it != _nodeToDepth.end() && "node not found");
627
+ return *(it->second);
628
+ }
629
+
630
+ /// Return the cycleDepth of the given node
631
+ inline bool in_cycleDepth_table(const NodeT* n) const
632
+ {
633
+ auto it = _nodeToDepth.find(n);
634
+ return it != _nodeToDepth.end();
635
+ }
636
+
637
+ /// Accept the given visitor
638
+ void accept(WTOComponentVisitor<GraphT>& v)
639
+ {
640
+ for (const auto& c : _components)
641
+ {
642
+ c->accept(v);
643
+ }
644
+ }
645
+
646
+ /// Dump the order, for debugging purpose
647
+ [[nodiscard]] std::string toString() const
648
+ {
649
+ std::string str;
650
+ std::stringstream rawstr(str);
651
+ rawstr << "[";
652
+ for (auto it = begin(), et = end(); it != et;)
653
+ {
654
+ rawstr << (*it)->toString();
655
+ ++it;
656
+ if (it != et)
657
+ {
658
+ rawstr << ", ";
659
+ }
660
+ }
661
+ rawstr << "]";
662
+ return rawstr.str();
663
+ }
664
+
665
+ /// Overloading operator << for dumping ICFG node ID
666
+ //@{
667
+ friend std::ostream& operator<<(std::ostream& o, const WTO<GraphT>& wto)
668
+ {
669
+ o << wto.toString();
670
+ return o;
671
+ }
672
+ //@}
673
+
674
+ void init()
675
+ {
676
+ visit(_entry, _components);
677
+ _nodeToCDN.clear();
678
+ _stack.clear();
679
+ buildNodeToDepth();
680
+ }
681
+
682
+ protected:
683
+
684
+ /// Visitor to build the cycle depths of each node
685
+ class WTOCycleDepthBuilder final : public WTOComponentVisitor<GraphT>
686
+ {
687
+ private:
688
+ WTOCycleDepthPtr _wtoCycleDepth;
689
+ NodeRefToWTOCycleDepthPtr& _nodeToWTOCycleDepth;
690
+
691
+ public:
692
+ explicit WTOCycleDepthBuilder(
693
+ NodeRefToWTOCycleDepthPtr& nodeToWTOCycleDepth)
694
+ : _wtoCycleDepth(std::make_shared<GraphTWTOCycleDepth>()),
695
+ _nodeToWTOCycleDepth(nodeToWTOCycleDepth)
696
+ {
697
+ }
698
+
699
+ void visit(const WTOCycleT& cycle) override
700
+ {
701
+ const NodeT* head = cycle.head()->getICFGNode();
702
+ WTOCycleDepthPtr previous_cycleDepth = _wtoCycleDepth;
703
+ _nodeToWTOCycleDepth.insert(std::make_pair(head, _wtoCycleDepth));
704
+ _wtoCycleDepth =
705
+ std::make_shared<GraphTWTOCycleDepth>(*_wtoCycleDepth);
706
+ _wtoCycleDepth->add(head);
707
+ for (auto it = cycle.begin(), et = cycle.end(); it != et; ++it)
708
+ {
709
+ (*it)->accept(*this);
710
+ }
711
+ _wtoCycleDepth = previous_cycleDepth;
712
+ }
713
+
714
+ void visit(const WTONodeT& node) override
715
+ {
716
+ _nodeToWTOCycleDepth.insert(
717
+ std::make_pair(node.getICFGNode(), _wtoCycleDepth));
718
+ }
719
+
720
+ }; // end class WTOCycleDepthBuilder
721
+
722
+ protected:
723
+
724
+ inline virtual void forEachSuccessor(const NodeT* node, std::function<void(const NodeT*)> func) const
725
+ {
726
+ for (const auto& e : node->getOutEdges())
727
+ {
728
+ func(e->getDstNode());
729
+ }
730
+ }
731
+
732
+ protected:
733
+ /// Return the depth-first number of the given node
734
+ CycleDepthNumber getCDN(const NodeT* n) const
735
+ {
736
+ auto it = _nodeToCDN.find(n);
737
+ if (it != _nodeToCDN.end())
738
+ {
739
+ return it->second;
740
+ }
741
+ else
742
+ {
743
+ return 0;
744
+ }
745
+ }
746
+
747
+ /// Set the depth-first number of the given node
748
+ void setCDN(const NodeT* n, const CycleDepthNumber& dfn)
749
+ {
750
+ auto res = _nodeToCDN.insert(std::make_pair(n, dfn));
751
+ if (!res.second)
752
+ {
753
+ (res.first)->second = dfn;
754
+ }
755
+ }
756
+
757
+ /// Pop a node from the stack
758
+ const NodeT* pop()
759
+ {
760
+ assert(!_stack.empty() && "empty stack");
761
+ const NodeT* top = _stack.back();
762
+ _stack.pop_back();
763
+ return top;
764
+ }
765
+
766
+ /// Push a node on the stack
767
+ void push(const NodeT* n)
768
+ {
769
+ _stack.push_back(n);
770
+ }
771
+
772
+ const WTONodeT* newNode(const NodeT* node)
773
+ {
774
+ const WTONodeT* ptr = new WTONodeT(node);
775
+ _allComponents.insert(ptr);
776
+ return ptr;
777
+ }
778
+
779
+ const WTOCycleT* newCycle(const WTONodeT* node,
780
+ const WTOComponentRefList& partition)
781
+ {
782
+ const WTOCycleT* ptr = new WTOCycleT(node, std::move(partition));
783
+ _allComponents.insert(ptr);
784
+ return ptr;
785
+ }
786
+
787
+ /// Create the cycle component for the given node
788
+ virtual const WTOCycleT* component(const NodeT* node)
789
+ {
790
+ WTOComponentRefList partition;
791
+ forEachSuccessor(node, [&](const NodeT* succ)
792
+ {
793
+ if (getCDN(succ) == 0)
794
+ {
795
+ visit(succ, partition);
796
+ }
797
+ });
798
+ const WTONodeT* head = newNode(node);
799
+ const WTOCycleT* ptr = newCycle(head, partition);
800
+ headRefToCycle.emplace(node, ptr);
801
+ return ptr;
802
+ }
803
+
804
+ /// Visit the given node
805
+ ///
806
+ /// Algorithm to build a weak topological order of a graph
807
+ virtual CycleDepthNumber visit(const NodeT* node,
808
+ WTOComponentRefList& partition)
809
+ {
810
+ CycleDepthNumber head(0);
811
+ CycleDepthNumber min(0);
812
+ bool loop;
813
+
814
+ push(node);
815
+ _num += CycleDepthNumber(1);
816
+ head = _num;
817
+ setCDN(node, head);
818
+ loop = false;
819
+ forEachSuccessor(node, [&](const NodeT* succ)
820
+ {
821
+ CycleDepthNumber succ_dfn = getCDN(succ);
822
+ if (succ_dfn == CycleDepthNumber(0))
823
+ {
824
+ min = visit(succ, partition);
825
+ }
826
+ else
827
+ {
828
+ min = succ_dfn;
829
+ }
830
+ if (min <= head)
831
+ {
832
+ head = min;
833
+ loop = true;
834
+ }
835
+ });
836
+
837
+ if (head == getCDN(node))
838
+ {
839
+ setCDN(node, UINT_MAX);
840
+ const NodeT* element = pop();
841
+ if (loop)
842
+ {
843
+ while (element != node)
844
+ {
845
+ setCDN(element, 0);
846
+ element = pop();
847
+ }
848
+ partition.push_front(component(node));
849
+ }
850
+ else
851
+ {
852
+ partition.push_front(newNode(node));
853
+ }
854
+ }
855
+ return head;
856
+ }
857
+
858
+ /// Build the node to WTO cycle depth table
859
+ void buildNodeToDepth()
860
+ {
861
+ WTOCycleDepthBuilder builder(_nodeToDepth);
862
+ for (auto it = begin(), et = end(); it != et; ++it)
863
+ {
864
+ (*it)->accept(builder);
865
+ }
866
+ }
867
+
868
+ }; // end class WTO
869
+
870
+ } // namespace SVF
871
+
872
+ #endif /* WTO_H_ */