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,439 @@
1
+ //===- AEDetector.h -- Vulnerability Detectors---------------------------------//
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 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
+ //
25
+ // Created by Jiawei Wang on 2024/8/20.
26
+ //
27
+ #pragma once
28
+ #include <SVFIR/SVFIR.h>
29
+ #include <AE/Core/AbstractState.h>
30
+ #include "Util/SVFBugReport.h"
31
+
32
+ namespace SVF
33
+ {
34
+ /**
35
+ * @class AEDetector
36
+ * @brief Base class for all detectors.
37
+ */
38
+ class AEDetector
39
+ {
40
+ public:
41
+ /**
42
+ * @enum DetectorKind
43
+ * @brief Enumerates the types of detectors available.
44
+ */
45
+ enum DetectorKind
46
+ {
47
+ BUF_OVERFLOW, ///< Detector for buffer overflow issues.
48
+ NULL_DEREF, ///< Detector for nullptr dereference issues.
49
+ UNKNOWN, ///< Default type if the kind is not specified.
50
+ };
51
+
52
+ /**
53
+ * @brief Constructor initializes the detector kind to UNKNOWN.
54
+ */
55
+ AEDetector(): kind(UNKNOWN) {}
56
+
57
+ /**
58
+ * @brief Virtual destructor for safe polymorphic use.
59
+ */
60
+ virtual ~AEDetector() = default;
61
+
62
+ /**
63
+ * @brief Check if the detector is of the UNKNOWN kind.
64
+ * @param detector Pointer to the detector.
65
+ * @return True if the detector is of type UNKNOWN, false otherwise.
66
+ */
67
+ static bool classof(const AEDetector* detector)
68
+ {
69
+ return detector->getKind() == AEDetector::UNKNOWN;
70
+ }
71
+
72
+ /**
73
+ * @brief Pure virtual function for detecting issues within a node.
74
+ * @param as Reference to the abstract state.
75
+ * @param node Pointer to the ICFG node.
76
+ */
77
+ virtual void detect(AbstractState& as, const ICFGNode* node) = 0;
78
+
79
+ /**
80
+ * @brief Pure virtual function for handling stub external API calls. (e.g. UNSAFE_BUFACCESS)
81
+ * @param call Pointer to the ext call ICFG node.
82
+ */
83
+ virtual void handleStubFunctions(const CallICFGNode* call) = 0;
84
+
85
+ /**
86
+ * @brief Pure virtual function to report detected bugs.
87
+ */
88
+ virtual void reportBug() = 0;
89
+
90
+ /**
91
+ * @brief Get the kind of the detector.
92
+ * @return The kind of the detector.
93
+ */
94
+ DetectorKind getKind() const
95
+ {
96
+ return kind;
97
+ }
98
+
99
+ protected:
100
+ DetectorKind kind; ///< The kind of the detector.
101
+ };
102
+
103
+ /**
104
+ * @class AEException
105
+ * @brief Exception class for handling errors in Abstract Execution.
106
+ */
107
+ class AEException : public std::exception
108
+ {
109
+ public:
110
+ /**
111
+ * @brief Constructor initializes the exception with a message.
112
+ * @param message The error message.
113
+ */
114
+ AEException(const std::string& message)
115
+ : msg_(message) {}
116
+
117
+ /**
118
+ * @brief Provides the error message.
119
+ * @return The error message as a C-string.
120
+ */
121
+ virtual const char* what() const throw()
122
+ {
123
+ return msg_.c_str();
124
+ }
125
+
126
+ private:
127
+ std::string msg_; ///< The error message.
128
+ };
129
+
130
+ /**
131
+ * @class BufOverflowDetector
132
+ * @brief Detector for identifying buffer overflow issues.
133
+ */
134
+ class BufOverflowDetector : public AEDetector
135
+ {
136
+ friend class AbstractInterpretation;
137
+ public:
138
+ /**
139
+ * @brief Constructor initializes the detector kind to BUF_OVERFLOW and sets up external API buffer overflow rules.
140
+ */
141
+ BufOverflowDetector()
142
+ {
143
+ kind = BUF_OVERFLOW;
144
+ initExtAPIBufOverflowCheckRules();
145
+ }
146
+
147
+ /**
148
+ * @brief Destructor.
149
+ */
150
+ ~BufOverflowDetector() = default;
151
+
152
+ /**
153
+ * @brief Check if the detector is of the BUF_OVERFLOW kind.
154
+ * @param detector Pointer to the detector.
155
+ * @return True if the detector is of type BUF_OVERFLOW, false otherwise.
156
+ */
157
+ static bool classof(const AEDetector* detector)
158
+ {
159
+ return detector->getKind() == AEDetector::BUF_OVERFLOW;
160
+ }
161
+
162
+ /**
163
+ * @brief Updates the offset of a GEP object from its base.
164
+ * @param as Reference to the abstract state.
165
+ * @param gepAddrs Address value for GEP.
166
+ * @param objAddrs Address value for the object.
167
+ * @param offset The interval value of the offset.
168
+ */
169
+ void updateGepObjOffsetFromBase(AbstractState& as,
170
+ AddressValue gepAddrs,
171
+ AddressValue objAddrs,
172
+ IntervalValue offset);
173
+
174
+ /**
175
+ * @brief Detect buffer overflow issues within a node.
176
+ * @param as Reference to the abstract state.
177
+ * @param node Pointer to the ICFG node.
178
+ */
179
+ void detect(AbstractState& as, const ICFGNode*);
180
+
181
+
182
+ /**
183
+ * @brief Handles external API calls related to buffer overflow detection.
184
+ * @param call Pointer to the call ICFG node.
185
+ */
186
+ void handleStubFunctions(const CallICFGNode*);
187
+
188
+ /**
189
+ * @brief Adds an offset to a GEP object.
190
+ * @param obj Pointer to the GEP object.
191
+ * @param offset The interval value of the offset.
192
+ */
193
+ void addToGepObjOffsetFromBase(const GepObjVar* obj, const IntervalValue& offset)
194
+ {
195
+ gepObjOffsetFromBase[obj] = offset;
196
+ }
197
+
198
+ /**
199
+ * @brief Checks if a GEP object has an associated offset.
200
+ * @param obj Pointer to the GEP object.
201
+ * @return True if the GEP object has an offset, false otherwise.
202
+ */
203
+ bool hasGepObjOffsetFromBase(const GepObjVar* obj) const
204
+ {
205
+ return gepObjOffsetFromBase.find(obj) != gepObjOffsetFromBase.end();
206
+ }
207
+
208
+ /**
209
+ * @brief Retrieves the offset of a GEP object from its base.
210
+ * @param obj Pointer to the GEP object.
211
+ * @return The interval value of the offset.
212
+ */
213
+ IntervalValue getGepObjOffsetFromBase(const GepObjVar* obj) const
214
+ {
215
+ if (hasGepObjOffsetFromBase(obj))
216
+ return gepObjOffsetFromBase.at(obj);
217
+ else
218
+ assert(false && "GepObjVar not found in gepObjOffsetFromBase");
219
+ }
220
+
221
+ /**
222
+ * @brief Retrieves the access offset for a given object and GEP statement.
223
+ * @param as Reference to the abstract state.
224
+ * @param objId The ID of the object.
225
+ * @param gep Pointer to the GEP statement.
226
+ * @return The interval value of the access offset.
227
+ */
228
+ IntervalValue getAccessOffset(AbstractState& as, NodeID objId, const GepStmt* gep);
229
+
230
+ /**
231
+ * @brief Adds a bug to the reporter based on an exception.
232
+ * @param e The exception that was thrown.
233
+ * @param node Pointer to the ICFG node where the bug was detected.
234
+ */
235
+ void addBugToReporter(const AEException& e, const ICFGNode* node)
236
+ {
237
+
238
+ GenericBug::EventStack eventStack;
239
+ SVFBugEvent sourceInstEvent(SVFBugEvent::EventType::SourceInst, node);
240
+ eventStack.push_back(sourceInstEvent); // Add the source instruction event to the event stack
241
+
242
+ if (eventStack.empty())
243
+ {
244
+ return; // If the event stack is empty, return early
245
+ }
246
+
247
+ std::string loc = eventStack.back().getEventLoc(); // Get the location of the last event in the stack
248
+
249
+ // Check if the bug at this location has already been reported
250
+ if (bugLoc.find(loc) != bugLoc.end())
251
+ {
252
+ return; // If the bug location is already reported, return early
253
+ }
254
+ else
255
+ {
256
+ bugLoc.insert(loc); // Otherwise, mark this location as reported
257
+ }
258
+
259
+ // Add the bug to the recorder with details from the event stack
260
+ recoder.addAbsExecBug(GenericBug::FULLBUFOVERFLOW, eventStack, 0, 0, 0, 0);
261
+ nodeToBugInfo[node] = e.what(); // Record the exception information for the node
262
+ }
263
+
264
+ /**
265
+ * @brief Reports all detected buffer overflow bugs.
266
+ */
267
+ void reportBug()
268
+ {
269
+ if (!nodeToBugInfo.empty())
270
+ {
271
+ std::cerr << "######################Buffer Overflow (" + std::to_string(nodeToBugInfo.size())
272
+ + " found)######################\n";
273
+ std::cerr << "---------------------------------------------\n";
274
+ for (const auto& it : nodeToBugInfo)
275
+ {
276
+ std::cerr << it.second << "\n---------------------------------------------\n";
277
+ }
278
+ }
279
+ }
280
+
281
+ /**
282
+ * @brief Initializes external API buffer overflow check rules.
283
+ */
284
+ void initExtAPIBufOverflowCheckRules();
285
+
286
+ /**
287
+ * @brief Handles external API calls related to buffer overflow detection.
288
+ * @param as Reference to the abstract state.
289
+ * @param call Pointer to the call ICFG node.
290
+ */
291
+ void detectExtAPI(AbstractState& as, const CallICFGNode *call);
292
+
293
+ /**
294
+ * @brief Checks if memory can be safely accessed.
295
+ * @param as Reference to the abstract state.
296
+ * @param value Pointer to the SVF var.
297
+ * @param len The interval value representing the length of the memory access.
298
+ * @return True if the memory access is safe, false otherwise.
299
+ */
300
+ bool canSafelyAccessMemory(AbstractState& as, const SVFVar *value, const IntervalValue &len);
301
+
302
+ private:
303
+ /**
304
+ * @brief Detects buffer overflow in 'strcat' function calls.
305
+ * @param as Reference to the abstract state.
306
+ * @param call Pointer to the call ICFG node.
307
+ * @return True if a buffer overflow is detected, false otherwise.
308
+ */
309
+ bool detectStrcat(AbstractState& as, const CallICFGNode *call);
310
+
311
+ /**
312
+ * @brief Detects buffer overflow in 'strcpy' function calls.
313
+ * @param as Reference to the abstract state.
314
+ * @param call Pointer to the call ICFG node.
315
+ * @return True if a buffer overflow is detected, false otherwise.
316
+ */
317
+ bool detectStrcpy(AbstractState& as, const CallICFGNode *call);
318
+
319
+ private:
320
+ Map<const GepObjVar*, IntervalValue> gepObjOffsetFromBase; ///< Maps GEP objects to their offsets from the base.
321
+ Map<std::string, std::vector<std::pair<u32_t, u32_t>>> extAPIBufOverflowCheckRules; ///< Rules for checking buffer overflows in external APIs.
322
+ Set<std::string> bugLoc; ///< Set of locations where bugs have been reported.
323
+ SVFBugReport recoder; ///< Recorder for abstract execution bugs.
324
+ Map<const ICFGNode*, std::string> nodeToBugInfo; ///< Maps ICFG nodes to bug information.
325
+ };
326
+ class NullptrDerefDetector : public AEDetector
327
+ {
328
+ friend class AbstractInterpretation;
329
+ public:
330
+ NullptrDerefDetector()
331
+ {
332
+ kind = NULL_DEREF;
333
+ }
334
+
335
+ ~NullptrDerefDetector() = default;
336
+
337
+ static bool classof(const AEDetector* detector)
338
+ {
339
+ return detector->getKind() == AEDetector::NULL_DEREF;
340
+ }
341
+
342
+ /**
343
+ * @brief Detects nullptr dereferences issues within a node.
344
+ * @param as Reference to the abstract state.
345
+ * @param node Pointer to the ICFG node.
346
+ */
347
+ void detect(AbstractState& as, const ICFGNode* node);
348
+
349
+ /**
350
+ * @brief Handles external API calls related to nullptr dereferences.
351
+ * @param call Pointer to the call ICFG node.
352
+ */
353
+ void handleStubFunctions(const CallICFGNode* call);
354
+
355
+ /**
356
+ * @brief Checks if an Abstract Value is uninitialized.
357
+ * @param v The Abstract Value to check.
358
+ * @return True if the value is uninitialized, false otherwise.
359
+ */
360
+ bool isUninit(AbstractValue v)
361
+ {
362
+ // uninitialized value has neither interval value nor address value
363
+ bool is = v.getAddrs().isBottom() && v.getInterval().isBottom();
364
+ return is;
365
+ }
366
+
367
+ /**
368
+ * @brief Adds a bug to the reporter based on an exception.
369
+ * @param e The exception that was thrown.
370
+ * @param node Pointer to the ICFG node where the bug was detected.
371
+ */
372
+ void addBugToReporter(const AEException& e, const ICFGNode* node)
373
+ {
374
+ GenericBug::EventStack eventStack;
375
+ SVFBugEvent sourceInstEvent(SVFBugEvent::EventType::SourceInst, node);
376
+ eventStack.push_back(sourceInstEvent); // Add the source instruction event to the event stack
377
+
378
+ if (eventStack.empty())
379
+ {
380
+ return; // If the event stack is empty, return early
381
+ }
382
+ std::string loc = eventStack.back().getEventLoc(); // Get the location of the last event in the stack
383
+
384
+ // Check if the bug at this location has already been reported
385
+ if (bugLoc.find(loc) != bugLoc.end())
386
+ {
387
+ return; // If the bug location is already reported, return early
388
+ }
389
+ else
390
+ {
391
+ bugLoc.insert(loc); // Otherwise, mark this location as reported
392
+ }
393
+ recoder.addAbsExecBug(GenericBug::FULLNULLPTRDEREFERENCE, eventStack, 0, 0, 0, 0);
394
+ nodeToBugInfo[node] = e.what(); // Record the exception information for the node
395
+ }
396
+
397
+ /**
398
+ * @brief Reports all detected nullptr dereference bugs.
399
+ */
400
+ void reportBug()
401
+ {
402
+ if (!nodeToBugInfo.empty())
403
+ {
404
+ std::cerr << "###################### Nullptr Dereference (" + std::to_string(nodeToBugInfo.size())
405
+ + " found)######################\n";
406
+ std::cerr << "---------------------------------------------\n";
407
+ for (const auto& it : nodeToBugInfo)
408
+ {
409
+ std::cerr << it.second << "\n---------------------------------------------\n";
410
+ }
411
+ }
412
+ }
413
+
414
+ /**
415
+ * @brief Handle external API calls related to nullptr dereferences.
416
+ * @param as Reference to the abstract state.
417
+ * @param call Pointer to the call ICFG node.
418
+ */
419
+ void detectExtAPI(AbstractState& as, const CallICFGNode* call);
420
+
421
+
422
+ /**
423
+ * @brief Check if an Abstract Value is NULL (or uninitialized).
424
+ *
425
+ * @param v An Abstract Value of loaded from an address in an Abstract State.
426
+ */
427
+ bool isNull(AbstractValue v)
428
+ {
429
+ return !v.isAddr() && !v.isInterval();
430
+ }
431
+
432
+ bool canSafelyDerefPtr(AbstractState& as, const SVFVar* ptr);
433
+
434
+ private:
435
+ Set<std::string> bugLoc; ///< Set of locations where bugs have been reported.
436
+ SVFBugReport recoder; ///< Recorder for abstract execution bugs.
437
+ Map<const ICFGNode*, std::string> nodeToBugInfo; ///< Maps ICFG nodes to bug information.
438
+ };
439
+ }
@@ -0,0 +1,138 @@
1
+ //===- AbsExtAPI.h -- Abstract Interpretation External API handler-----//
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 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
+ //
25
+ // Created by Jiawei Wang on 2024/9/9.
26
+ //
27
+ #pragma once
28
+ #include "AE/Core/AbstractState.h"
29
+ #include "AE/Core/ICFGWTO.h"
30
+ #include "AE/Svfexe/AEDetector.h"
31
+ #include "Util/SVFBugReport.h"
32
+
33
+ namespace SVF
34
+ {
35
+
36
+ // Forward declaration of AbstractInterpretation class
37
+ class AbstractInterpretation;
38
+
39
+ /**
40
+ * @class AbsExtAPI
41
+ * @brief Handles external API calls and manages abstract states.
42
+ */
43
+ class AbsExtAPI
44
+ {
45
+ public:
46
+ /**
47
+ * @enum ExtAPIType
48
+ * @brief Enumeration of external API types.
49
+ */
50
+ enum ExtAPIType { UNCLASSIFIED, MEMCPY, MEMSET, STRCPY, STRCAT };
51
+
52
+ /**
53
+ * @brief Constructor for AbsExtAPI.
54
+ * @param abstractTrace Reference to a map of ICFG nodes to abstract states.
55
+ */
56
+ AbsExtAPI(Map<const ICFGNode*, AbstractState>& traces);
57
+
58
+ /**
59
+ * @brief Initializes the external function map.
60
+ */
61
+ void initExtFunMap();
62
+
63
+ /**
64
+ * @brief Reads a string from the abstract state.
65
+ * @param as Reference to the abstract state.
66
+ * @param rhs Pointer to the SVF variable representing the string.
67
+ * @return The string value.
68
+ */
69
+ std::string strRead(AbstractState& as, const SVFVar* rhs);
70
+
71
+ /**
72
+ * @brief Handles an external API call.
73
+ * @param call Pointer to the call ICFG node.
74
+ */
75
+ void handleExtAPI(const CallICFGNode *call);
76
+
77
+ /**
78
+ * @brief Handles the strcpy API call.
79
+ * @param call Pointer to the call ICFG node.
80
+ */
81
+ void handleStrcpy(const CallICFGNode *call);
82
+
83
+ /**
84
+ * @brief Calculates the length of a string.
85
+ * @param as Reference to the abstract state.
86
+ * @param strValue Pointer to the SVF variable representing the string.
87
+ * @return The interval value representing the string length.
88
+ */
89
+ IntervalValue getStrlen(AbstractState& as, const SVF::SVFVar *strValue);
90
+
91
+ /**
92
+ * @brief Handles the strcat API call.
93
+ * @param call Pointer to the call ICFG node.
94
+ */
95
+ void handleStrcat(const SVF::CallICFGNode *call);
96
+
97
+ /**
98
+ * @brief Handles the memcpy API call.
99
+ * @param as Reference to the abstract state.
100
+ * @param dst Pointer to the destination SVF variable.
101
+ * @param src Pointer to the source SVF variable.
102
+ * @param len The interval value representing the length to copy.
103
+ * @param start_idx The starting index for copying.
104
+ */
105
+ void handleMemcpy(AbstractState& as, const SVF::SVFVar *dst, const SVF::SVFVar *src, IntervalValue len, u32_t start_idx);
106
+
107
+ /**
108
+ * @brief Handles the memset API call.
109
+ * @param as Reference to the abstract state.
110
+ * @param dst Pointer to the destination SVF variable.
111
+ * @param elem The interval value representing the element to set.
112
+ * @param len The interval value representing the length to set.
113
+ */
114
+ void handleMemset(AbstractState& as, const SVFVar* dst, IntervalValue elem, IntervalValue len);
115
+
116
+ /**
117
+ * @brief Gets the range limit from a type.
118
+ * @param type Pointer to the SVF type.
119
+ * @return The interval value representing the range limit.
120
+ */
121
+ IntervalValue getRangeLimitFromType(const SVFType* type);
122
+
123
+ /**
124
+ * @brief Retrieves the abstract state from the trace for a given ICFG node.
125
+ * @param node Pointer to the ICFG node.
126
+ * @return Reference to the abstract state.
127
+ * @throws Assertion if no trace exists for the node.
128
+ */
129
+ AbstractState& getAbsStateFromTrace(const ICFGNode* node);
130
+
131
+ protected:
132
+ SVFIR* svfir; ///< Pointer to the SVF intermediate representation.
133
+ ICFG* icfg; ///< Pointer to the interprocedural control flow graph.
134
+ Map<const ICFGNode*, AbstractState>& abstractTrace; ///< Map of ICFG nodes to abstract states.
135
+ Map<std::string, std::function<void(const CallICFGNode*)>> func_map; ///< Map of function names to handlers.
136
+ };
137
+
138
+ } // namespace SVF