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,372 @@
1
+ //===- SVFGOPT.h -- SVFG optimizer--------------------------------------------//
2
+ //
3
+ // SVF: Static Value-Flow Analysis
4
+ //
5
+ // Copyright (C) <2013-2017> <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
+ * @file: SVFGOPT.h
25
+ * @author: yesen
26
+ * @date: 20/03/2014
27
+ * @version: 1.0
28
+ *
29
+ * @section LICENSE
30
+ *
31
+ * @section DESCRIPTION
32
+ *
33
+ */
34
+
35
+
36
+ #ifndef SVFGOPT_H_
37
+ #define SVFGOPT_H_
38
+
39
+
40
+ #include "Graphs/SVFG.h"
41
+ #include "Util/WorkList.h"
42
+
43
+ namespace SVF
44
+ {
45
+
46
+ /**
47
+ * Optimised SVFG.
48
+ * 1. FormalParam/ActualRet is converted into Phi. ActualParam/FormalRet becomes the
49
+ * operands of Phi nodes created at callee/caller's entry/callsite.
50
+ * 2. ActualIns/ActualOuts resides at direct call sites id removed. Sources of its incoming
51
+ * edges are connected with the destinations of its outgoing edges directly.
52
+ * 3. FormalIns/FormalOuts reside at the entry/exit of non-address-taken functions is
53
+ * removed as ActualIn/ActualOuts.
54
+ * 4. MSSAPHI nodes are removed if it have no self cycle. Otherwise depends on user option.
55
+ */
56
+ class SVFGOPT : public SVFG
57
+ {
58
+ typedef Set<SVFGNode*> SVFGNodeSet;
59
+ typedef Map<NodeID, NodeID> NodeIDToNodeIDMap;
60
+ typedef FIFOWorkList<const MSSAPHISVFGNode*> WorkList;
61
+
62
+ public:
63
+ /// Constructor
64
+ SVFGOPT(std::unique_ptr<MemSSA> mssa, VFGK kind) : SVFG(std::move(mssa), kind)
65
+ {
66
+ keepAllSelfCycle = keepContextSelfCycle = keepActualOutFormalIn = false;
67
+ }
68
+ /// Destructor
69
+ ~SVFGOPT() override = default;
70
+
71
+ inline void setTokeepActualOutFormalIn()
72
+ {
73
+ keepActualOutFormalIn = true;
74
+ }
75
+ inline void setTokeepAllSelfCycle()
76
+ {
77
+ keepAllSelfCycle = true;
78
+ }
79
+ inline void setTokeepContextSelfCycle()
80
+ {
81
+ keepContextSelfCycle = true;
82
+ }
83
+
84
+ /// Optimised SVFG's aren't written in their optimised form; read full SVFG and optimise it
85
+ void readAndOptSVFG(const std::string &filename);
86
+
87
+ /// Optimised SVFG's shouldn't be written in their optimised form; writes the full SVFG to file before optimising
88
+ void buildAndWriteSVFG(const std::string &filename);
89
+
90
+ protected:
91
+ void buildSVFG() override;
92
+
93
+ /// Separate optimisation function to avoid duplicate code
94
+ void optimiseSVFG();
95
+
96
+ /// Connect SVFG nodes between caller and callee for indirect call sites
97
+ //@{
98
+ inline void connectAParamAndFParam(const PAGNode* cs_arg, const PAGNode* fun_arg, const CallICFGNode*, CallSiteID csId, SVFGEdgeSetTy& edges) override
99
+ {
100
+ NodeID phiId = getDef(fun_arg);
101
+ SVFGEdge* edge = addCallEdge(getDef(cs_arg), phiId, csId);
102
+ if (edge != nullptr)
103
+ {
104
+ PHISVFGNode* phi = SVFUtil::cast<PHISVFGNode>(getSVFGNode(phiId));
105
+ addInterPHIOperands(phi, cs_arg);
106
+ edges.insert(edge);
107
+ }
108
+ }
109
+ /// Connect formal-ret and actual ret
110
+ inline void connectFRetAndARet(const PAGNode* fun_ret, const PAGNode* cs_ret, CallSiteID csId, SVFGEdgeSetTy& edges) override
111
+ {
112
+ NodeID phiId = getDef(cs_ret);
113
+ NodeID retdef = getDef(fun_ret);
114
+ /// If a function does not have any return instruction. The def of a FormalRetVFGNode is itself (see VFG.h: addFormalRetVFGNode).
115
+ /// Therefore, we do not connect return edge from a function without any return instruction (i.e., pag->isPhiNode(fun_ret)==false)
116
+ /// because unique fun_ret PAGNode was not collected as a PhiNode in SVFIRBuilder::visitReturnInst
117
+ if (pag->isPhiNode(fun_ret)==false)
118
+ return;
119
+
120
+ SVFGEdge* edge = addRetEdge(retdef, phiId, csId);
121
+ if (edge != nullptr)
122
+ {
123
+ PHISVFGNode* phi = SVFUtil::cast<PHISVFGNode>(getSVFGNode(phiId));
124
+ addInterPHIOperands(phi, fun_ret);
125
+ edges.insert(edge);
126
+ }
127
+ }
128
+ /// Connect actual-in and formal-in
129
+ inline void connectAInAndFIn(const ActualINSVFGNode* actualIn, const FormalINSVFGNode* formalIn, CallSiteID csId, SVFGEdgeSetTy& edges) override
130
+ {
131
+ NodeBS intersection = actualIn->getPointsTo();
132
+ intersection &= formalIn->getPointsTo();
133
+ if (intersection.empty() == false)
134
+ {
135
+ NodeID aiDef = getActualINDef(actualIn->getId());
136
+ SVFGEdge* edge = addCallIndirectSVFGEdge(aiDef,formalIn->getId(),csId,intersection);
137
+ if (edge != nullptr)
138
+ edges.insert(edge);
139
+ }
140
+ }
141
+ /// Connect formal-out and actual-out
142
+ inline void connectFOutAndAOut(const FormalOUTSVFGNode* formalOut, const ActualOUTSVFGNode* actualOut, CallSiteID csId, SVFGEdgeSetTy& edges) override
143
+ {
144
+ NodeBS intersection = formalOut->getPointsTo();
145
+ intersection &= actualOut->getPointsTo();
146
+ if (intersection.empty() == false)
147
+ {
148
+ NodeID foDef = getFormalOUTDef(formalOut->getId());
149
+ SVFGEdge* edge = addRetIndirectSVFGEdge(foDef,actualOut->getId(),csId,intersection);
150
+ if (edge != nullptr)
151
+ edges.insert(edge);
152
+ }
153
+ }
154
+ //@}
155
+
156
+ /// Get def-site of actual-in/formal-out.
157
+ //@{
158
+ inline NodeID getActualINDef(NodeID ai) const
159
+ {
160
+ NodeIDToNodeIDMap::const_iterator it = actualInToDefMap.find(ai);
161
+ assert(it != actualInToDefMap.end() && "can not find actual-in's def");
162
+ return it->second;
163
+ }
164
+ inline NodeID getFormalOUTDef(NodeID fo) const
165
+ {
166
+ NodeIDToNodeIDMap::const_iterator it = formalOutToDefMap.find(fo);
167
+ assert(it != formalOutToDefMap.end() && "can not find formal-out's def");
168
+ return it->second;
169
+ }
170
+ //@}
171
+
172
+ private:
173
+ void parseSelfCycleHandleOption();
174
+
175
+ /// Add inter-procedural value flow edge
176
+ //@{
177
+ /// Add indirect call edge from src to dst with one call site ID.
178
+ SVFGEdge* addCallIndirectSVFGEdge(NodeID srcId, NodeID dstId, CallSiteID csid, const NodeBS& cpts);
179
+ /// Add indirect ret edge from src to dst with one call site ID.
180
+ SVFGEdge* addRetIndirectSVFGEdge(NodeID srcId, NodeID dstId, CallSiteID csid, const NodeBS& cpts);
181
+ //@}
182
+
183
+ /// 1. Convert FormalParmSVFGNode into PHISVFGNode and add all ActualParmSVFGNoe which may
184
+ /// propagate pts to it as phi's operands.
185
+ /// 2. Do the same thing for ActualRetSVFGNode and FormalRetSVFGNode.
186
+ /// 3. Record def site of ActualINSVFGNode. Remove all its edges and connect its predecessors
187
+ /// and successors.
188
+ /// 4. Do the same thing for FormalOUTSVFGNode as 3.
189
+ /// 5. Remove ActualINSVFGNode/FormalINSVFGNode/ActualOUTSVFGNode/FormalOUTSVFGNode if they
190
+ /// will not be used when updating call graph.
191
+ void handleInterValueFlow();
192
+
193
+ /// Replace FormalParam/ActualRet node with PHI node.
194
+ //@{
195
+ void replaceFParamARetWithPHI(PHISVFGNode* phi, SVFGNode* svfgNode);
196
+ //@}
197
+
198
+ /// Retarget edges related to actual-in/-out and formal-in/-out.
199
+ //@{
200
+ /// Record def sites of actual-in/formal-out and connect from those def-sites
201
+ /// to formal-in/actual-out directly if they exist.
202
+ void retargetEdgesOfAInFOut(SVFGNode* node);
203
+ /// Connect actual-out/formal-in's predecessors to their successors directly.
204
+ void retargetEdgesOfAOutFIn(SVFGNode* node);
205
+ //@}
206
+
207
+ /// Remove MSSAPHI SVFG nodes.
208
+ void handleIntraValueFlow();
209
+
210
+ /// Initial work list with MSSAPHI nodes which may be removed.
211
+ inline void initialWorkList()
212
+ {
213
+ for (SVFG::const_iterator it = begin(), eit = end(); it != eit; ++it)
214
+ addIntoWorklist(it->second);
215
+ }
216
+
217
+ /// Only MSSAPHI node which satisfy following conditions will be removed:
218
+ /// 1. it's not def-site of actual-in/formal-out;
219
+ /// 2. it doesn't have incoming and outgoing call/ret at the same time.
220
+ inline bool addIntoWorklist(const SVFGNode* node)
221
+ {
222
+ if (const MSSAPHISVFGNode* phi = SVFUtil::dyn_cast<MSSAPHISVFGNode>(node))
223
+ {
224
+ if (isConnectingTwoCallSites(phi) == false && isDefOfAInFOut(phi) == false)
225
+ return worklist.push(phi);
226
+ }
227
+ return false;
228
+ }
229
+
230
+ /// Remove MSSAPHI node if possible
231
+ void bypassMSSAPHINode(const MSSAPHISVFGNode* node);
232
+
233
+ /// Remove self cycle edges if needed. Return TRUE if some self cycle edges remained.
234
+ bool checkSelfCycleEdges(const MSSAPHISVFGNode* node);
235
+
236
+ /// Add new SVFG edge from src to dst.
237
+ bool addNewSVFGEdge(NodeID srcId, NodeID dstId, const SVFGEdge* preEdge, const SVFGEdge* succEdge);
238
+
239
+ /// Return TRUE if both edges are indirect call/ret edges.
240
+ inline bool bothInterEdges(const SVFGEdge* edge1, const SVFGEdge* edge2) const
241
+ {
242
+ bool inter1 = SVFUtil::isa<CallIndSVFGEdge, RetIndSVFGEdge>(edge1);
243
+ bool inter2 = SVFUtil::isa<CallIndSVFGEdge, RetIndSVFGEdge>(edge2);
244
+ return (inter1 && inter2);
245
+ }
246
+
247
+ inline void addInterPHIOperands(PHISVFGNode* phi, const PAGNode* operand)
248
+ {
249
+ phi->setOpVer(phi->getOpVerNum(), operand);
250
+ }
251
+
252
+ /// Add inter PHI SVFG node for formal parameter
253
+ inline InterPHISVFGNode* addInterPHIForFP(const FormalParmSVFGNode* fp)
254
+ {
255
+ InterPHISVFGNode* sNode = new InterPHISVFGNode(totalVFGNode++,fp);
256
+ addSVFGNode(sNode, pag->getICFG()->getFunEntryICFGNode(fp->getFun()));
257
+ resetDef(fp->getParam(),sNode);
258
+ return sNode;
259
+ }
260
+ /// Add inter PHI SVFG node for actual return
261
+ inline InterPHISVFGNode* addInterPHIForAR(const ActualRetSVFGNode* ar)
262
+ {
263
+ InterPHISVFGNode* sNode = new InterPHISVFGNode(totalVFGNode++,ar);
264
+ addSVFGNode(sNode, const_cast<RetICFGNode*>(
265
+ ar->getCallSite()->getRetICFGNode()));
266
+ resetDef(ar->getRev(),sNode);
267
+ return sNode;
268
+ }
269
+
270
+ inline void resetDef(const PAGNode* pagNode, const SVFGNode* node)
271
+ {
272
+ PAGNodeToDefMapTy::iterator it = PAGNodeToDefMap.find(pagNode);
273
+ assert(it != PAGNodeToDefMap.end() && "a SVFIR node doesn't have definition before");
274
+ it->second = node->getId();
275
+ }
276
+
277
+ /// Set def-site of actual-in/formal-out.
278
+ ///@{
279
+ inline void setActualINDef(NodeID ai, NodeID def)
280
+ {
281
+ bool inserted = actualInToDefMap.emplace(ai, def).second;
282
+ (void)inserted; // Suppress warning of unused variable under release build
283
+ assert(inserted && "can not set actual-in's def twice");
284
+ defNodes.set(def);
285
+ }
286
+ inline void setFormalOUTDef(NodeID fo, NodeID def)
287
+ {
288
+ bool inserted = formalOutToDefMap.emplace(fo, def).second;
289
+ (void) inserted;
290
+ assert(inserted && "can not set formal-out's def twice");
291
+ defNodes.set(def);
292
+ }
293
+ ///@}
294
+
295
+ inline bool isDefOfAInFOut(const SVFGNode* node)
296
+ {
297
+ return defNodes.test(node->getId());
298
+ }
299
+
300
+ /// Check if actual-in/actual-out exist at indirect call site.
301
+ //@{
302
+ inline bool actualInOfIndCS(const ActualINSVFGNode* ai) const
303
+ {
304
+ return (SVFIR::getPAG()->isIndirectCallSites(ai->getCallSite()));
305
+ }
306
+ inline bool actualOutOfIndCS(const ActualOUTSVFGNode* ao) const
307
+ {
308
+ return (SVFIR::getPAG()->isIndirectCallSites(ao->getCallSite()));
309
+ }
310
+ //@}
311
+
312
+ /// Check if formal-in/formal-out reside in address-taken function.
313
+ //@{
314
+ inline bool formalInOfAddressTakenFunc(const FormalINSVFGNode* fi) const
315
+ {
316
+ return (fi->getFun()->hasAddressTaken());
317
+ }
318
+ inline bool formalOutOfAddressTakenFunc(const FormalOUTSVFGNode* fo) const
319
+ {
320
+ return (fo->getFun()->hasAddressTaken());
321
+ }
322
+ //@}
323
+
324
+ /// Return TRUE if this node has both incoming call/ret and outgoing call/ret edges.
325
+ bool isConnectingTwoCallSites(const SVFGNode* node) const;
326
+
327
+ /// Return TRUE if this SVFGNode can be removed.
328
+ /// Nodes can be removed if it is:
329
+ /// 1. ActualParam/FormalParam/ActualRet/FormalRet
330
+ /// 2. ActualIN if it doesn't reside at indirect call site
331
+ /// 3. FormalIN if it doesn't reside at the entry of address-taken function and it's not
332
+ /// definition site of ActualIN
333
+ /// 4. ActualOUT if it doesn't reside at indirect call site and it's not definition site
334
+ /// of FormalOUT
335
+ /// 5. FormalOUT if it doesn't reside at the exit of address-taken function
336
+ bool canBeRemoved(const SVFGNode * node);
337
+
338
+ /// Remove edges of a SVFG node
339
+ //@{
340
+ inline void removeAllEdges(const SVFGNode* node)
341
+ {
342
+ removeInEdges(node);
343
+ removeOutEdges(node);
344
+ }
345
+ inline void removeInEdges(const SVFGNode* node)
346
+ {
347
+ /// remove incoming edges
348
+ while (node->hasIncomingEdge())
349
+ removeSVFGEdge(*(node->InEdgeBegin()));
350
+ }
351
+ inline void removeOutEdges(const SVFGNode* node)
352
+ {
353
+ while (node->hasOutgoingEdge())
354
+ removeSVFGEdge(*(node->OutEdgeBegin()));
355
+ }
356
+ //@}
357
+
358
+
359
+ NodeIDToNodeIDMap actualInToDefMap; ///< map actual-in to its def-site node
360
+ NodeIDToNodeIDMap formalOutToDefMap; ///< map formal-out to its def-site node
361
+ NodeBS defNodes; ///< preserved def nodes of formal-in/actual-out
362
+
363
+ WorkList worklist; ///< storing MSSAPHI nodes which may be removed.
364
+
365
+ bool keepActualOutFormalIn;
366
+ bool keepAllSelfCycle;
367
+ bool keepContextSelfCycle;
368
+ };
369
+
370
+ } // End namespace SVF
371
+
372
+ #endif /* SVFGOPT_H_ */
@@ -0,0 +1,273 @@
1
+ //===- SVFGStat.h -- Statistics of SVFG---------------------------------------//
2
+ //
3
+ // SVF: Static Value-Flow Analysis
4
+ //
5
+ // Copyright (C) <2013-2017> <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
+ * @file: SVFGStat.h
25
+ * @author: yesen
26
+ * @date: 10/12/2013
27
+ * @version: 1.0
28
+ *
29
+ * @section LICENSE
30
+ *
31
+ * @section DESCRIPTION
32
+ *
33
+ */
34
+
35
+
36
+ #ifndef SVFGSTAT_H_
37
+ #define SVFGSTAT_H_
38
+
39
+ #include "Graphs/SVFG.h"
40
+ #include "SCC.h"
41
+ #include "Util/PTAStat.h"
42
+
43
+ namespace SVF
44
+ {
45
+
46
+ class MemSSA;
47
+
48
+ class MemSSAStat : public PTAStat
49
+ {
50
+
51
+ public:
52
+ static const char* TotalTimeOfConstructMemSSA; ///< Total time for constructing memory SSA
53
+ static const char* TimeOfGeneratingMemRegions; ///< Time for allocating regions
54
+ static const char* TimeOfCreateMUCHI; ///< Time for generating mu/chi for load/store/calls
55
+ static const char* TimeOfInsertingPHI; ///< Time for inserting phis
56
+ static const char* TimeOfSSARenaming; ///< Time for SSA rename
57
+
58
+ static const char* NumOfMaxRegion; ///< Number of max points-to set in region.
59
+ static const char* NumOfAveragePtsInRegion; ///< Number of average points-to set in region.
60
+ static const char* NumOfMemRegions; ///< Number of memory regions
61
+ static const char* NumOfEntryChi; ///< Number of function entry chi
62
+ static const char* NumOfRetMu; ///< Number of function return mu
63
+ static const char* NumOfCSChi; ///< Number of call site chi
64
+ static const char* NumOfCSMu; ///< Number of call site mu
65
+ static const char* NumOfLoadMu; ///< Number of load mu
66
+ static const char* NumOfStoreChi; ///< Number of store chi
67
+ static const char* NumOfMSSAPhi; ///< Number of mssa phi
68
+
69
+ static const char* NumOfFunHasEntryChi; ///< Number of functions which have entry chi
70
+ static const char* NumOfFunHasRetMu; ///< Number of functions which have return mu
71
+ static const char* NumOfCSHasChi; ///< Number of call sites which have chi
72
+ static const char* NumOfCSHasMu; ///< Number of call sites which have mu
73
+ static const char* NumOfLoadHasMu; ///< Number of loads which have mu
74
+ static const char* NumOfStoreHasChi; ///< Number of stores which have chi
75
+ static const char* NumOfBBHasMSSAPhi; ///< Number of basic blocks which have mssa phi
76
+
77
+ MemSSAStat(MemSSA*);
78
+
79
+ virtual ~MemSSAStat()
80
+ {
81
+
82
+ }
83
+ virtual void performStat() override;
84
+
85
+ virtual void printStat(std::string str = "") override;
86
+
87
+ private:
88
+ MemSSA* mssa;
89
+ };
90
+
91
+
92
+ class SVFGStat : public PTAStat
93
+ {
94
+ public:
95
+ typedef Set<const SVFGNode*> SVFGNodeSet;
96
+ typedef OrderedSet<const SVFGEdge*> SVFGEdgeSet;
97
+ typedef SCCDetection<SVFG*> SVFGSCC;
98
+
99
+ SVFGStat(SVFG* g);
100
+
101
+ virtual ~SVFGStat() {}
102
+
103
+ virtual void performStat() override;
104
+
105
+ virtual void printStat(std::string str = "") override;
106
+
107
+ virtual void performSCCStat(SVFGEdgeSet insensitiveCalRetEdges);
108
+
109
+ void dirVFEdgeStart()
110
+ {
111
+ connectDirSVFGEdgeTimeStart = PTAStat::getClk(true);
112
+ }
113
+
114
+ void dirVFEdgeEnd()
115
+ {
116
+ connectDirSVFGEdgeTimeEnd = PTAStat::getClk(true);
117
+ }
118
+
119
+ void indVFEdgeStart()
120
+ {
121
+ connectIndSVFGEdgeTimeStart = PTAStat::getClk(true);
122
+ }
123
+
124
+ void indVFEdgeEnd()
125
+ {
126
+ connectIndSVFGEdgeTimeEnd = PTAStat::getClk(true);
127
+ }
128
+
129
+ void TLVFNodeStart()
130
+ {
131
+ addTopLevelNodeTimeStart = PTAStat::getClk(true);
132
+ }
133
+
134
+ void TLVFNodeEnd()
135
+ {
136
+ addTopLevelNodeTimeEnd = PTAStat::getClk(true);
137
+ }
138
+
139
+ void ATVFNodeStart()
140
+ {
141
+ addAddrTakenNodeTimeStart = PTAStat::getClk(true);
142
+ }
143
+
144
+ void ATVFNodeEnd()
145
+ {
146
+ addAddrTakenNodeTimeEnd = PTAStat::getClk(true);
147
+ }
148
+
149
+ void sfvgOptStart()
150
+ {
151
+ svfgOptTimeStart = PTAStat::getClk(true);
152
+ }
153
+
154
+ void sfvgOptEnd()
155
+ {
156
+ svfgOptTimeEnd = PTAStat::getClk(true);
157
+ }
158
+
159
+ private:
160
+ void clear();
161
+
162
+ void processGraph();
163
+
164
+ void calculateNodeDegrees(SVFGNode* node, NodeSet& nodeHasIndInEdge, NodeSet& nodeHasIndOutEdge);
165
+
166
+ NodeID getSCCRep(SVFGSCC* scc, NodeID id) const;
167
+
168
+ NodeID nodeInCycle(SVFGSCC* scc, NodeID id) const;
169
+
170
+ SVFG* graph;
171
+
172
+ int numOfNodes; ///< number of svfg nodes.
173
+
174
+ int numOfFormalIn; ///< number of formal in svfg nodes.
175
+ int numOfFormalOut; ///< number of formal out svfg nodes.
176
+ int numOfFormalParam;
177
+ int numOfFormalRet;
178
+
179
+ int numOfActualIn; ///< number of actual in svfg nodes.
180
+ int numOfActualOut; ///< number of actual out svfg nodes.
181
+ int numOfActualParam;
182
+ int numOfActualRet;
183
+
184
+ int numOfLoad; ///< number of load svfg nodes.
185
+ int numOfStore; ///< number of store svfg nodes.
186
+ int numOfCopy;
187
+ int numOfGep;
188
+ int numOfAddr;
189
+
190
+ int numOfMSSAPhi; ///< number of mssa phi svfg nodes.
191
+ int numOfPhi;
192
+
193
+ int totalInEdge; ///< Total number of incoming SVFG edges
194
+ int totalOutEdge; ///< Total number of outgoing SVFG edges
195
+ int totalIndInEdge; ///< Total number of indirect SVFG edges
196
+ int totalIndOutEdge;
197
+ int totalIndEdgeLabels; ///< Total number of l --o--> lp
198
+
199
+ int totalIndCallEdge;
200
+ int totalIndRetEdge;
201
+ int totalDirCallEdge;
202
+ int totalDirRetEdge;
203
+
204
+ int avgWeight; ///< average weight.
205
+
206
+ int avgInDegree; ///< average in degrees of SVFG nodes.
207
+ int avgOutDegree; ///< average out degrees of SVFG nodes.
208
+ u32_t maxInDegree; ///< max in degrees of SVFG nodes.
209
+ u32_t maxOutDegree; ///< max out degrees of SVFG nodes.
210
+
211
+ int avgIndInDegree; ///< average indirect in degrees of SVFG nodes.
212
+ int avgIndOutDegree; ///< average indirect out degrees of SVFG nodes.
213
+ u32_t maxIndInDegree; ///< max indirect in degrees of SVFG nodes.
214
+ u32_t maxIndOutDegree; ///< max indirect out degrees of SVFG nodes.
215
+
216
+ double addTopLevelNodeTimeStart;
217
+ double addTopLevelNodeTimeEnd;
218
+
219
+ double addAddrTakenNodeTimeStart;
220
+ double addAddrTakenNodeTimeEnd;
221
+
222
+ double connectDirSVFGEdgeTimeStart;
223
+ double connectDirSVFGEdgeTimeEnd;
224
+
225
+ double connectIndSVFGEdgeTimeStart;
226
+ double connectIndSVFGEdgeTimeEnd;
227
+
228
+ double svfgOptTimeStart;
229
+ double svfgOptTimeEnd;
230
+
231
+ SVFGNodeSet forwardSlice;
232
+ SVFGNodeSet backwardSlice;
233
+ SVFGNodeSet sources;
234
+ SVFGNodeSet sinks;
235
+
236
+ public:
237
+ inline void addToSources(const SVFGNode* node)
238
+ {
239
+ sources.insert(node);
240
+ }
241
+ inline void addToSinks(const SVFGNode* node)
242
+ {
243
+ sinks.insert(node);
244
+ }
245
+ inline void addToForwardSlice(const SVFGNode* node)
246
+ {
247
+ forwardSlice.insert(node);
248
+ }
249
+ inline void addToBackwardSlice(const SVFGNode* node)
250
+ {
251
+ backwardSlice.insert(node);
252
+ }
253
+ inline bool inForwardSlice(const SVFGNode* node) const
254
+ {
255
+ return forwardSlice.find(node)!=forwardSlice.end();
256
+ }
257
+ inline bool inBackwardSlice(const SVFGNode* node) const
258
+ {
259
+ return backwardSlice.find(node)!=backwardSlice.end();
260
+ }
261
+ inline bool isSource(const SVFGNode* node) const
262
+ {
263
+ return sources.find(node)!=sources.end();
264
+ }
265
+ inline bool isSink(const SVFGNode* node) const
266
+ {
267
+ return sinks.find(node)!=sinks.end();
268
+ }
269
+ };
270
+
271
+ } // End namespace SVF
272
+
273
+ #endif /* SVFGSTAT_H_ */