svf-tools 1.0.328 → 1.0.332

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 (281) hide show
  1. package/SVF-doxygen/html/html/AndersenHCD_8cpp_source.html +1 -1
  2. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +1 -1
  3. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +7 -7
  4. package/SVF-doxygen/html/html/AndersenSFR_8h_source.html +4 -4
  5. package/SVF-doxygen/html/html/AndersenWaveDiff_8cpp_source.html +1 -1
  6. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +38 -38
  7. package/SVF-doxygen/html/html/Andersen_8h_source.html +6 -6
  8. package/SVF-doxygen/html/html/CSC_8cpp_source.html +2 -3
  9. package/SVF-doxygen/html/html/ConsGEdge_8h_source.html +3 -3
  10. package/SVF-doxygen/html/html/ConsGNode_8h_source.html +5 -5
  11. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +2 -2
  12. package/SVF-doxygen/html/html/ConsG_8h_source.html +4 -4
  13. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +6 -6
  14. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
  15. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +1 -1
  16. package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
  17. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +6 -6
  18. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
  19. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +2 -2
  20. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +2 -2
  21. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +3 -3
  22. package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +3 -3
  23. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
  24. package/SVF-doxygen/html/html/ICFGNode_8h_source.html +3 -3
  25. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +6 -7
  26. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +1 -1
  27. package/SVF-doxygen/html/html/IRGraph_8h_source.html +1 -1
  28. package/SVF-doxygen/html/html/LocationSet_8cpp.html +1 -0
  29. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +12 -15
  30. package/SVF-doxygen/html/html/LocationSet_8h.html +1 -1
  31. package/SVF-doxygen/html/html/LocationSet_8h_source.html +26 -40
  32. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +5 -5
  33. package/SVF-doxygen/html/html/OfflineConsG_8cpp_source.html +1 -1
  34. package/SVF-doxygen/html/html/PAGBuilderFromFile_8cpp_source.html +2 -2
  35. package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +15 -15
  36. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +10 -10
  37. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
  38. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +28 -29
  39. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +29 -29
  40. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +12 -4
  41. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +71 -70
  42. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +12 -12
  43. package/SVF-doxygen/html/html/SVFIR_8h_source.html +12 -12
  44. package/SVF-doxygen/html/html/SVFStatements_8h_source.html +3 -3
  45. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +2 -2
  46. package/SVF-doxygen/html/html/SVFVariables_8h.html +1 -1
  47. package/SVF-doxygen/html/html/SVFVariables_8h_source.html +69 -69
  48. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +4 -4
  49. package/SVF-doxygen/html/html/Steensgaard_8h_source.html +1 -1
  50. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +21 -21
  51. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +1 -1
  52. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +52 -63
  53. package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +72 -79
  54. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +3 -3
  55. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +2 -2
  56. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +13 -13
  57. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8h_source.html +2 -2
  58. package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +3 -3
  59. package/SVF-doxygen/html/html/annotated.html +6 -6
  60. package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +1 -1
  61. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +79 -79
  62. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +1 -1
  63. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +23 -24
  64. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +1 -1
  65. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +9 -9
  66. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +1 -1
  67. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +4 -4
  68. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +1 -1
  69. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +11 -11
  70. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +1 -1
  71. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +13 -13
  72. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +1 -1
  73. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +13 -13
  74. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +1 -1
  75. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +11 -11
  76. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +1 -1
  77. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +17 -17
  78. package/SVF-doxygen/html/html/classSVF_1_1CSC.html +2 -3
  79. package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode-members.html +4 -4
  80. package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode.html +4 -4
  81. package/SVF-doxygen/html/html/classSVF_1_1CloneDummyObjVar.html +11 -11
  82. package/SVF-doxygen/html/html/classSVF_1_1CloneFIObjVar.html +11 -11
  83. package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar-members.html +56 -55
  84. package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar.html +44 -41
  85. package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar.png +0 -0
  86. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl-members.html +1 -1
  87. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +7 -7
  88. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +3 -3
  89. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode-members.html +26 -26
  90. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +43 -43
  91. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA-members.html +1 -1
  92. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +9 -9
  93. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +3 -3
  94. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
  95. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +1 -1
  96. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +11 -11
  97. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +11 -11
  98. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +13 -13
  99. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +1 -1
  100. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +4 -4
  101. package/SVF-doxygen/html/html/classSVF_1_1FlattenedFieldInfo-members.html +85 -0
  102. package/SVF-doxygen/html/html/classSVF_1_1FlattenedFieldInfo.html +254 -0
  103. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +1 -1
  104. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +7 -7
  105. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +1 -1
  106. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +9 -9
  107. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +3 -3
  108. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +1 -1
  109. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +10 -10
  110. package/SVF-doxygen/html/html/classSVF_1_1FunEntryBlockNode-members.html +2 -2
  111. package/SVF-doxygen/html/html/classSVF_1_1FunEntryBlockNode.html +4 -4
  112. package/SVF-doxygen/html/html/classSVF_1_1FunExitBlockNode-members.html +2 -2
  113. package/SVF-doxygen/html/html/classSVF_1_1FunExitBlockNode.html +4 -4
  114. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
  115. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +22 -23
  116. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
  117. package/SVF-doxygen/html/html/classSVF_1_1GepObjPN.html +3 -3
  118. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar-members.html +173 -0
  119. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +813 -0
  120. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.png +0 -0
  121. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +2 -2
  122. package/SVF-doxygen/html/html/classSVF_1_1GlobalBlockNode-members.html +2 -2
  123. package/SVF-doxygen/html/html/classSVF_1_1GlobalBlockNode.html +4 -4
  124. package/SVF-doxygen/html/html/classSVF_1_1ICFGNode-members.html +2 -2
  125. package/SVF-doxygen/html/html/classSVF_1_1ICFGNode.html +10 -10
  126. package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator-members.html +1 -1
  127. package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +8 -8
  128. package/SVF-doxygen/html/html/classSVF_1_1InterBlockNode-members.html +2 -2
  129. package/SVF-doxygen/html/html/classSVF_1_1InterBlockNode.html +4 -4
  130. package/SVF-doxygen/html/html/classSVF_1_1IntraBlockNode-members.html +2 -2
  131. package/SVF-doxygen/html/html/classSVF_1_1IntraBlockNode.html +4 -4
  132. package/SVF-doxygen/html/html/classSVF_1_1LocationSet-members.html +17 -21
  133. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +150 -326
  134. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +6 -6
  135. package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +84 -84
  136. package/SVF-doxygen/html/html/classSVF_1_1NormalGepCGEdge.html +2 -2
  137. package/SVF-doxygen/html/html/classSVF_1_1NormalGepStmt.html +2 -2
  138. package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +96 -96
  139. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +5 -5
  140. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.png +0 -0
  141. package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +2 -2
  142. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +15 -15
  143. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis-members.html +1 -1
  144. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +75 -73
  145. package/SVF-doxygen/html/html/classSVF_1_1RetBlockNode-members.html +2 -2
  146. package/SVF-doxygen/html/html/classSVF_1_1RetBlockNode.html +4 -4
  147. package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +11 -11
  148. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +26 -26
  149. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder-members.html +57 -56
  150. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +302 -230
  151. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +4 -4
  152. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.png +0 -0
  153. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +4 -4
  154. package/SVF-doxygen/html/html/classSVF_1_1StInfo-members.html +11 -14
  155. package/SVF-doxygen/html/html/classSVF_1_1StInfo.html +70 -168
  156. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +1 -1
  157. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +4 -4
  158. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +30 -30
  159. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo-members.html +20 -24
  160. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +109 -291
  161. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +3 -3
  162. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +1 -1
  163. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +9 -9
  164. package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +18 -18
  165. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +11 -11
  166. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +1 -1
  167. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +3 -3
  168. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +3 -3
  169. package/SVF-doxygen/html/html/classes.html +6 -6
  170. package/SVF-doxygen/html/html/functions_a.html +15 -12
  171. package/SVF-doxygen/html/html/functions_b.html +1 -5
  172. package/SVF-doxygen/html/html/functions_c.html +19 -20
  173. package/SVF-doxygen/html/html/functions_d.html +1 -1
  174. package/SVF-doxygen/html/html/functions_e.html +0 -16
  175. package/SVF-doxygen/html/html/functions_f.html +21 -19
  176. package/SVF-doxygen/html/html/functions_func.html +14 -11
  177. package/SVF-doxygen/html/html/functions_func_c.html +16 -17
  178. package/SVF-doxygen/html/html/functions_func_d.html +1 -1
  179. package/SVF-doxygen/html/html/functions_func_e.html +2 -8
  180. package/SVF-doxygen/html/html/functions_func_f.html +4 -4
  181. package/SVF-doxygen/html/html/functions_func_g.html +43 -65
  182. package/SVF-doxygen/html/html/functions_func_i.html +11 -14
  183. package/SVF-doxygen/html/html/functions_func_s.html +6 -9
  184. package/SVF-doxygen/html/html/functions_func_t.html +1 -1
  185. package/SVF-doxygen/html/html/functions_func_w.html +1 -1
  186. package/SVF-doxygen/html/html/functions_g.html +44 -66
  187. package/SVF-doxygen/html/html/functions_i.html +6 -9
  188. package/SVF-doxygen/html/html/functions_l.html +4 -4
  189. package/SVF-doxygen/html/html/functions_n.html +4 -7
  190. package/SVF-doxygen/html/html/functions_o.html +25 -20
  191. package/SVF-doxygen/html/html/functions_p.html +12 -16
  192. package/SVF-doxygen/html/html/functions_s.html +17 -20
  193. package/SVF-doxygen/html/html/functions_t.html +6 -8
  194. package/SVF-doxygen/html/html/functions_type_e.html +0 -4
  195. package/SVF-doxygen/html/html/functions_type_o.html +3 -0
  196. package/SVF-doxygen/html/html/functions_vars_b.html +1 -5
  197. package/SVF-doxygen/html/html/functions_vars_c.html +1 -1
  198. package/SVF-doxygen/html/html/functions_vars_e.html +0 -6
  199. package/SVF-doxygen/html/html/functions_vars_f.html +9 -7
  200. package/SVF-doxygen/html/html/functions_vars_l.html +1 -1
  201. package/SVF-doxygen/html/html/functions_vars_n.html +0 -3
  202. package/SVF-doxygen/html/html/functions_vars_o.html +2 -2
  203. package/SVF-doxygen/html/html/functions_w.html +6 -10
  204. package/SVF-doxygen/html/html/hierarchy.html +64 -64
  205. package/SVF-doxygen/html/html/namespaceSVF.html +3 -3
  206. package/SVF-doxygen/html/html/search/all_1.js +4 -3
  207. package/SVF-doxygen/html/html/search/all_10.js +6 -6
  208. package/SVF-doxygen/html/html/search/all_12.js +1 -1
  209. package/SVF-doxygen/html/html/search/all_13.js +4 -5
  210. package/SVF-doxygen/html/html/search/all_14.js +6 -6
  211. package/SVF-doxygen/html/html/search/all_15.js +1 -1
  212. package/SVF-doxygen/html/html/search/all_17.js +2 -2
  213. package/SVF-doxygen/html/html/search/all_2.js +2 -3
  214. package/SVF-doxygen/html/html/search/all_3.js +5 -5
  215. package/SVF-doxygen/html/html/search/all_4.js +1 -1
  216. package/SVF-doxygen/html/html/search/all_5.js +0 -5
  217. package/SVF-doxygen/html/html/search/all_6.js +6 -5
  218. package/SVF-doxygen/html/html/search/all_7.js +16 -24
  219. package/SVF-doxygen/html/html/search/all_9.js +2 -3
  220. package/SVF-doxygen/html/html/search/all_c.js +4 -4
  221. package/SVF-doxygen/html/html/search/all_e.js +1 -2
  222. package/SVF-doxygen/html/html/search/all_f.js +5 -4
  223. package/SVF-doxygen/html/html/search/classes_5.js +1 -1
  224. package/SVF-doxygen/html/html/search/classes_6.js +1 -1
  225. package/SVF-doxygen/html/html/search/functions_0.js +4 -3
  226. package/SVF-doxygen/html/html/search/functions_10.js +2 -3
  227. package/SVF-doxygen/html/html/search/functions_11.js +1 -1
  228. package/SVF-doxygen/html/html/search/functions_14.js +1 -1
  229. package/SVF-doxygen/html/html/search/functions_2.js +3 -3
  230. package/SVF-doxygen/html/html/search/functions_3.js +1 -1
  231. package/SVF-doxygen/html/html/search/functions_4.js +0 -2
  232. package/SVF-doxygen/html/html/search/functions_5.js +1 -1
  233. package/SVF-doxygen/html/html/search/functions_6.js +16 -24
  234. package/SVF-doxygen/html/html/search/functions_8.js +1 -2
  235. package/SVF-doxygen/html/html/search/functions_a.js +1 -1
  236. package/SVF-doxygen/html/html/search/functions_e.js +1 -1
  237. package/SVF-doxygen/html/html/search/typedefs_4.js +0 -1
  238. package/SVF-doxygen/html/html/search/typedefs_e.js +1 -0
  239. package/SVF-doxygen/html/html/search/variables_14.js +2 -2
  240. package/SVF-doxygen/html/html/search/variables_15.js +1 -1
  241. package/SVF-doxygen/html/html/search/variables_2.js +2 -3
  242. package/SVF-doxygen/html/html/search/variables_3.js +1 -1
  243. package/SVF-doxygen/html/html/search/variables_5.js +0 -2
  244. package/SVF-doxygen/html/html/search/variables_6.js +5 -4
  245. package/SVF-doxygen/html/html/search/variables_c.js +1 -1
  246. package/SVF-doxygen/html/html/search/variables_e.js +0 -1
  247. package/SVF-doxygen/html/html/search/variables_f.js +1 -1
  248. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
  249. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +1 -1
  250. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01OfflineConsG_01_5_01_4.html +1 -1
  251. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1LocationSet_01_4.html +5 -5
  252. package/include/Graphs/ConsG.h +1 -1
  253. package/include/Graphs/ConsGEdge.h +1 -1
  254. package/include/Graphs/ICFGNode.h +2 -2
  255. package/include/MemoryModel/LocationSet.h +39 -126
  256. package/include/MemoryModel/PointerAnalysis.h +1 -1
  257. package/include/MemoryModel/SVFIR.h +1 -1
  258. package/include/MemoryModel/SVFStatements.h +1 -1
  259. package/include/MemoryModel/SVFVariables.h +17 -11
  260. package/include/MemoryModel/SymbolTableInfo.h +27 -31
  261. package/include/SVF-FE/SVFIRBuilder.h +6 -1
  262. package/include/Util/IRAnnotator.h +3 -3
  263. package/lib/DDA/ContextDDA.cpp +1 -1
  264. package/lib/Graphs/ConsG.cpp +1 -1
  265. package/lib/Graphs/IRGraph.cpp +1 -1
  266. package/lib/Graphs/OfflineConsG.cpp +1 -1
  267. package/lib/MemoryModel/LocationSet.cpp +53 -95
  268. package/lib/MemoryModel/PointerAnalysis.cpp +4 -2
  269. package/lib/MemoryModel/PointerAnalysisImpl.cpp +4 -4
  270. package/lib/MemoryModel/SVFIR.cpp +4 -4
  271. package/lib/MemoryModel/SVFVariables.cpp +2 -2
  272. package/lib/MemoryModel/SymbolTableInfo.cpp +36 -210
  273. package/lib/SABER/SaberSVFGBuilder.cpp +1 -1
  274. package/lib/SVF-FE/SVFIRBuilder.cpp +136 -8
  275. package/lib/SVF-FE/SymbolTableBuilder.cpp +4 -4
  276. package/lib/Util/TypeBasedHeapCloning.cpp +10 -10
  277. package/lib/WPA/Andersen.cpp +1 -5
  278. package/lib/WPA/AndersenSFR.cpp +2 -2
  279. package/lib/WPA/CSC.cpp +1 -1
  280. package/lib/WPA/FlowSensitiveTBHC.cpp +6 -6
  281. package/package.json +1 -1
@@ -204,7 +204,69 @@ void SVFIRBuilder::initialiseNodes()
204
204
  */
205
205
  bool SVFIRBuilder::computeGepOffset(const User *V, LocationSet& ls)
206
206
  {
207
- return SymbolTableInfo::SymbolInfo()->computeGepOffset(V,ls);
207
+ assert(V);
208
+
209
+ const llvm::GEPOperator *gepOp = SVFUtil::dyn_cast<const llvm::GEPOperator>(V);
210
+ DataLayout * dataLayout = SymbolTableInfo::getDataLayout(LLVMModuleSet::getLLVMModuleSet()->getMainLLVMModule());
211
+ llvm::APInt byteOffset(dataLayout->getIndexSizeInBits(gepOp->getPointerAddressSpace()),0,true);
212
+ if(gepOp && dataLayout && gepOp->accumulateConstantOffset(*dataLayout,byteOffset))
213
+ {
214
+ Size_t bo = byteOffset.getSExtValue();
215
+ }
216
+
217
+ for (bridge_gep_iterator gi = bridge_gep_begin(*V), ge = bridge_gep_end(*V);
218
+ gi != ge; ++gi)
219
+ {
220
+ ls.addOffsetValue(gi.getOperand());
221
+ // Handling array types, skipe array handling here
222
+ // We treat whole array as one, then we can distinguish different field of an array of struct
223
+ // e.g. s[1].f1 is differet from s[0].f2
224
+ if(SVFUtil::isa<ArrayType>(*gi))
225
+ continue;
226
+
227
+ //The int-value object of the current index operand
228
+ // (may not be constant for arrays).
229
+ ConstantInt *op = SVFUtil::dyn_cast<ConstantInt>(gi.getOperand());
230
+
231
+ /// given a gep edge p = q + i,
232
+ if(!op)
233
+ {
234
+ return false;
235
+ }
236
+ //The actual index
237
+ Size_t idx = op->getSExtValue();
238
+
239
+
240
+ // Handling pointer types
241
+ // These GEP instructions are simply making address computations from the base pointer address
242
+ // e.g. idx = (char*) &p + 4, at this case gep only one offset index (idx)
243
+ // Case 1: This operation is likely accessing an array through pointer p.
244
+ // Case 2: It may also be used to access a field of a struct (which is not ANSI-compliant)
245
+ // Since this is a field-index based memory model,
246
+ // for case 1: we consider the whole array as one element, This can be improved by LocMemModel as it can distinguish different
247
+ // elements of the same array.
248
+ // for case 2: we treat idx the same as &p by ignoring const 4 (This handling is unsound since the program itself is not ANSI-compliant).
249
+ if (SVFUtil::isa<PointerType>(*gi))
250
+ {
251
+ //off += idx;
252
+ }
253
+
254
+
255
+ // Handling struct here
256
+ if (const StructType *ST = SVFUtil::dyn_cast<StructType>(*gi) )
257
+ {
258
+ assert(op && "non-const struct index in GEP");
259
+ const vector<u32_t> &so = SymbolTableInfo::SymbolInfo()->getFlattenedFieldIdxVec(ST);
260
+ if ((unsigned)idx >= so.size())
261
+ {
262
+ outs() << "!! Struct index out of bounds" << idx << "\n";
263
+ assert(0);
264
+ }
265
+ //add the translated offset
266
+ ls.setFldIdx(ls.accumulateConstantOffset() + so[idx]);
267
+ }
268
+ }
269
+ return true;
208
270
  }
209
271
 
210
272
  /*!
@@ -420,7 +482,7 @@ void SVFIRBuilder::InitialGlobal(const GlobalVariable *gvar, Constant *C,
420
482
  {
421
483
  const StructType *sty = SVFUtil::cast<StructType>(C->getType());
422
484
  const std::vector<u32_t>& offsetvect =
423
- SymbolTableInfo::SymbolInfo()->getFattenFieldIdxVec(sty);
485
+ SymbolTableInfo::SymbolInfo()->getFlattenedFieldIdxVec(sty);
424
486
  for (u32_t i = 0, e = C->getNumOperands(); i != e; i++)
425
487
  {
426
488
  u32_t off = offsetvect[i];
@@ -895,9 +957,54 @@ void SVFIRBuilder::handleDirectCall(CallSite cs, const SVFFunction *F)
895
957
  /*!
896
958
  * Find the base type and the max possible offset of an object pointed to by (V).
897
959
  */
898
- const Type *SVFIRBuilder::getBaseTypeAndFlattenedFields(Value *V, std::vector<LocationSet> &fields)
960
+ const Type *SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value *V, std::vector<LocationSet> &fields)
899
961
  {
900
- return SymbolTableInfo::SymbolInfo()->getBaseTypeAndFlattenedFields(V, fields);
962
+ assert(V);
963
+ fields.push_back(LocationSet(0));
964
+
965
+ const Type *T = V->getType();
966
+ // Use the biggest struct type out of all operands.
967
+ if (const User *U = SVFUtil::dyn_cast<User>(V))
968
+ {
969
+ u32_t msz = 1; //the max size seen so far
970
+ // In case of BitCast, try the target type itself
971
+ if (SVFUtil::isa<BitCastInst>(V))
972
+ {
973
+ u32_t sz = getFields(fields, T, msz);
974
+ if (msz < sz)
975
+ {
976
+ msz = sz;
977
+ }
978
+ }
979
+ // Try the types of all operands
980
+ for (User::const_op_iterator it = U->op_begin(), ie = U->op_end();
981
+ it != ie; ++it)
982
+ {
983
+ const Type *operandtype = it->get()->getType();
984
+
985
+ u32_t sz = getFields(fields, operandtype, msz);
986
+ if (msz < sz)
987
+ {
988
+ msz = sz;
989
+ T = operandtype;
990
+ }
991
+ }
992
+ }
993
+ // If V is a CE, the actual pointer type is its operand.
994
+ else if (const ConstantExpr *E = SVFUtil::dyn_cast<ConstantExpr>(V))
995
+ {
996
+ T = E->getOperand(0)->getType();
997
+ getFields(fields, T, 0);
998
+ }
999
+ // Handle Argument case
1000
+ else if (SVFUtil::isa<Argument>(V))
1001
+ {
1002
+ getFields(fields, T, 0);
1003
+ }
1004
+
1005
+ while (const PointerType *ptype = SVFUtil::dyn_cast<PointerType>(T))
1006
+ T = ptype->getElementType();
1007
+ return T;
901
1008
  }
902
1009
 
903
1010
  /*!
@@ -1182,7 +1289,7 @@ void SVFIRBuilder::handleExtCall(CallSite cs, const SVFFunction *callee)
1182
1289
  // We have vArg3 points to the entry of _Rb_tree_node_base { color; parent; left; right; }.
1183
1290
  // Now we calculate the offset from base to vArg3
1184
1291
  NodeID vnArg3 = pag->getValueNode(vArg3);
1185
- Size_t offset = pag->getLocationSetFromBaseNode(vnArg3).getOffset();
1292
+ Size_t offset = pag->getLocationSetFromBaseNode(vnArg3).accumulateConstantOffset();
1186
1293
 
1187
1294
  // We get all flattened fields of base
1188
1295
  vector<LocationSet> fields;
@@ -1206,7 +1313,7 @@ void SVFIRBuilder::handleExtCall(CallSite cs, const SVFFunction *callee)
1206
1313
 
1207
1314
  Value *vArg = cs.getArgument(0);
1208
1315
  NodeID vnArg = pag->getValueNode(vArg);
1209
- Size_t offset = pag->getLocationSetFromBaseNode(vnArg).getOffset();
1316
+ Size_t offset = pag->getLocationSetFromBaseNode(vnArg).accumulateConstantOffset();
1210
1317
 
1211
1318
  // We get all fields
1212
1319
  vector<LocationSet> fields;
@@ -1415,7 +1522,7 @@ NodeID SVFIRBuilder::getGepValVar(const Value* val, const LocationSet& ls, const
1415
1522
  * 2. GlobalVariable
1416
1523
  */
1417
1524
  assert((SVFUtil::isa<Instruction>(curVal) || SVFUtil::isa<GlobalVariable>(curVal)) && "curVal not an instruction or a globalvariable?");
1418
- const std::vector<FieldInfo> &fieldinfo = SymbolTableInfo::SymbolInfo()->getFlattenFieldInfoVec(baseType);
1525
+ const std::vector<FlattenedFieldInfo> &fieldinfo = SymbolTableInfo::SymbolInfo()->getFlattenedFieldInfoVec(baseType);
1419
1526
  const Type *type = fieldinfo[fieldidx].getFlattenElemTy();
1420
1527
 
1421
1528
  // We assume every GepValNode and its GepEdge to the baseNode are unique across the whole program
@@ -1506,7 +1613,28 @@ void SVFIRBuilder::setCurrentBBAndValueForPAGEdge(PAGEdge* edge)
1506
1613
  }
1507
1614
 
1508
1615
  pag->addToSVFStmtList(icfgNode,edge);
1509
- icfgNode->addPAGEdge(edge);
1616
+ icfgNode->addSVFStmt(edge);
1510
1617
  }
1511
1618
 
1512
1619
 
1620
+ /*!
1621
+ * Replace fields with flatten fields of T if the number of its fields is larger than msz.
1622
+ */
1623
+ u32_t SVFIRBuilder::getFields(std::vector<LocationSet>& fields, const Type* T, u32_t msz)
1624
+ {
1625
+ if (!SVFUtil::isa<PointerType>(T))
1626
+ return 0;
1627
+
1628
+ T = T->getContainedType(0);
1629
+ const std::vector<FlattenedFieldInfo>& stVec = SymbolTableInfo::SymbolInfo()->getFlattenedFieldInfoVec(T);
1630
+ u32_t sz = stVec.size();
1631
+ if (msz < sz)
1632
+ {
1633
+ /// Replace fields with T's flatten fields.
1634
+ fields.clear();
1635
+ for(std::vector<FlattenedFieldInfo>::const_iterator it = stVec.begin(), eit = stVec.end(); it!=eit; ++it)
1636
+ fields.push_back(LocationSet(*it));
1637
+ }
1638
+
1639
+ return sz;
1640
+ }
@@ -444,7 +444,7 @@ void SymbolTableBuilder::handleGlobalInitializerCE(const Constant *C,
444
444
  {
445
445
  const StructType *sty = SVFUtil::cast<StructType>(C->getType());
446
446
  const std::vector<u32_t>& offsetvect =
447
- SymbolTableInfo::SymbolInfo()->getFattenFieldIdxVec(sty);
447
+ SymbolTableInfo::SymbolInfo()->getFlattenedFieldIdxVec(sty);
448
448
  for (u32_t i = 0, e = C->getNumOperands(); i != e; i++)
449
449
  {
450
450
  u32_t off = offsetvect[i];
@@ -515,8 +515,8 @@ void SymbolTableBuilder::analyzeGlobalStackObjType(ObjTypeInfo* typeinfo, const
515
515
  }
516
516
  if (const StructType *ST= SVFUtil::dyn_cast<StructType>(elemTy))
517
517
  {
518
- const std::vector<FieldInfo>& flattenFields = SymbolTableInfo::SymbolInfo()->getFlattenFieldInfoVec(ST);
519
- for(std::vector<FieldInfo>::const_iterator it = flattenFields.begin(), eit = flattenFields.end();
518
+ const std::vector<FlattenedFieldInfo>& flattenFields = SymbolTableInfo::SymbolInfo()->getFlattenedFieldInfoVec(ST);
519
+ for(std::vector<FlattenedFieldInfo>::const_iterator it = flattenFields.begin(), eit = flattenFields.end();
520
520
  it!=eit; ++it)
521
521
  {
522
522
  if((*it).getFlattenElemTy()->isPointerTy())
@@ -600,7 +600,7 @@ u32_t SymbolTableBuilder::getObjSize(const Value* val)
600
600
  u32_t numOfFields = 1;
601
601
  if (SVFUtil::isa<StructType>(ety) || SVFUtil::isa<ArrayType>(ety))
602
602
  {
603
- numOfFields = SymbolTableInfo::SymbolInfo()->getFlattenFieldInfoVec(ety).size();
603
+ numOfFields = SymbolTableInfo::SymbolInfo()->getFlattenedFieldInfoVec(ety).size();
604
604
  }
605
605
  return numOfFields;
606
606
  }
@@ -153,9 +153,9 @@ const NodeBS TypeBasedHeapCloning::getGepObjClones(NodeID base, unsigned offset)
153
153
  // totalOffset is the offset from the real base (i.e. base of base),
154
154
  // offset is the offset into base, whether it is a field itself or not.
155
155
  unsigned totalOffset = offset;
156
- if (const GepObjPN *baseGep = SVFUtil::dyn_cast<GepObjPN>(baseNode))
156
+ if (const GepObjVar *baseGep = SVFUtil::dyn_cast<GepObjVar>(baseNode))
157
157
  {
158
- totalOffset += baseGep->getLocationSet().getOffset();
158
+ totalOffset += baseGep->getOffset();
159
159
  }
160
160
 
161
161
  const DIType *baseType = getType(base);
@@ -184,12 +184,12 @@ const NodeBS TypeBasedHeapCloning::getGepObjClones(NodeID base, unsigned offset)
184
184
  {
185
185
  PAGNode *node = ppag->getGNode(gep);
186
186
  assert(node && "TBHC: expected gep node doesn't exist.");
187
- assert((SVFUtil::isa<GepObjPN>(node) || SVFUtil::isa<FIObjVar>(node))
187
+ assert((SVFUtil::isa<GepObjVar>(node) || SVFUtil::isa<FIObjVar>(node))
188
188
  && "TBHC: expected a GEP or FI object.");
189
189
 
190
- if (GepObjPN *gepNode = SVFUtil::dyn_cast<GepObjPN>(node))
190
+ if (GepObjVar *gepNode = SVFUtil::dyn_cast<GepObjVar>(node))
191
191
  {
192
- if (gepNode->getLocationSet().getOffset() == totalOffset)
192
+ if (gepNode->getOffset() == totalOffset)
193
193
  {
194
194
  geps.set(gep);
195
195
  }
@@ -225,7 +225,7 @@ const NodeBS TypeBasedHeapCloning::getGepObjClones(NodeID base, unsigned offset)
225
225
  newGep = ppag->getGepObjVar(base, newLS);
226
226
  }
227
227
 
228
- if (GepObjPN *gep = SVFUtil::dyn_cast<GepObjPN>(ppag->getGNode(newGep)))
228
+ if (GepObjVar *gep = SVFUtil::dyn_cast<GepObjVar>(ppag->getGNode(newGep)))
229
229
  {
230
230
  gep->setBaseNode(base);
231
231
  }
@@ -412,9 +412,9 @@ NodeID TypeBasedHeapCloning::cloneObject(NodeID o, const DIType *type, bool)
412
412
  {
413
413
  NodeID clone;
414
414
  const PAGNode *obj = ppag->getGNode(o);
415
- if (const GepObjPN *gepObj = SVFUtil::dyn_cast<GepObjPN>(obj))
415
+ if (const GepObjVar *gepObj = SVFUtil::dyn_cast<GepObjVar>(obj))
416
416
  {
417
- const NodeBS &clones = getGepObjClones(gepObj->getBaseNode(), gepObj->getLocationSet().getOffset());
417
+ const NodeBS &clones = getGepObjClones(gepObj->getBaseNode(), gepObj->getOffset());
418
418
  // TODO: a bit of repetition.
419
419
  for (NodeID clone : clones)
420
420
  {
@@ -427,7 +427,7 @@ NodeID TypeBasedHeapCloning::cloneObject(NodeID o, const DIType *type, bool)
427
427
  clone = addCloneGepObjNode(gepObj->getMemObj(), gepObj->getLocationSet());
428
428
 
429
429
  // The base needs to know about the new clone.
430
- addGepToObj(clone, gepObj->getBaseNode(), gepObj->getLocationSet().getOffset());
430
+ addGepToObj(clone, gepObj->getBaseNode(), gepObj->getOffset());
431
431
 
432
432
  addClone(o, clone);
433
433
  addClone(getOriginalObj(o), clone);
@@ -539,7 +539,7 @@ const DIType *TypeBasedHeapCloning::getTypeFromCTirMetadata(const Value *v)
539
539
  bool TypeBasedHeapCloning::isGep(const PAGNode *n) const
540
540
  {
541
541
  assert(n != nullptr && "TBHC: testing if null is a GEP object!");
542
- return SVFUtil::isa<GepObjPN>(n);
542
+ return SVFUtil::isa<GepObjVar>(n);
543
543
  }
544
544
 
545
545
  /// Returns true if the function name matches MAYALIAS, NOALIAS, etc.
@@ -64,10 +64,6 @@ AndersenBase::~AndersenBase()
64
64
  {
65
65
  delete consCG;
66
66
  consCG = nullptr;
67
-
68
- auto * chg = getCHGraph();
69
- delete chg;
70
- chg = nullptr;
71
67
  }
72
68
 
73
69
  /*!
@@ -170,7 +166,7 @@ void AndersenBase::normalizePointsTo()
170
166
  // for redundant gepnodes and remove those nodes from pag
171
167
  for (NodeID n: redundantGepNodes) {
172
168
  NodeID base = pag->getBaseObjVar(n);
173
- GepObjPN *gepNode = SVFUtil::dyn_cast<GepObjPN>(pag->getGNode(n));
169
+ GepObjVar *gepNode = SVFUtil::dyn_cast<GepObjVar>(pag->getGNode(n));
174
170
  assert(gepNode && "Not a gep node in redundantGepNodes set");
175
171
  const LocationSet ls = gepNode->getLocationSet();
176
172
  GepObjVarMap.erase(std::make_pair(base, ls));
@@ -133,8 +133,8 @@ void AndersenSFR::fieldExpand(NodeSet& initials, Size_t offset, NodeBS& strides,
133
133
  const MemObj* obj = pag->getBaseObj(init);
134
134
  const Size_t maxLimit = obj->getMaxFieldOffsetLimit();
135
135
  Size_t initOffset;
136
- if (GepObjPN *gepNode = SVFUtil::dyn_cast<GepObjPN>(initPN))
137
- initOffset = gepNode->getLocationSet().getOffset();
136
+ if (GepObjVar *gepNode = SVFUtil::dyn_cast<GepObjVar>(initPN))
137
+ initOffset = gepNode->getOffset();
138
138
  else if (SVFUtil::isa<FIObjVar>(initPN) || SVFUtil::isa<DummyObjVar>(initPN))
139
139
  initOffset = 0;
140
140
  else
package/lib/WPA/CSC.cpp CHANGED
@@ -107,7 +107,7 @@ void CSC::visit(NodeID nodeId, Size_t _w)
107
107
  if (_consG->hasEdge(node, backNode, ConstraintEdge::NormalGep))
108
108
  {
109
109
  NormalGepCGEdge* normalGep = SVFUtil::dyn_cast<NormalGepCGEdge>(_consG->getEdge(node, backNode, ConstraintEdge::NormalGep));
110
- Size_t _w = normalGep->getLocationSet().getOffset();
110
+ Size_t _w = normalGep->getOffset();
111
111
  Size_t _l = _D[nodeId] +_w - _D[backNodeId];
112
112
  backNode->strides.set(_l);
113
113
  for (auto cNodeId : _C)
@@ -69,7 +69,7 @@ void FlowSensitiveTBHC::backPropagate(NodeID clone)
69
69
  assert(cloneObj && "FSTBHC: original object does not exist in SVFIR?");
70
70
  // Check the original object too because when reuse of a gep occurs, the new object
71
71
  // is an FI object.
72
- if (SVFUtil::isa<CloneGepObjVar>(cloneObj) || SVFUtil::isa<GepObjPN>(originalObj))
72
+ if (SVFUtil::isa<CloneGepObjVar>(cloneObj) || SVFUtil::isa<GepObjVar>(originalObj))
73
73
  {
74
74
  // Since getGepObjClones is updated, some GEP nodes need to be redone.
75
75
  const NodeBS &retrievers = gepToSVFGRetrievers[getOriginalObj(clone)];
@@ -143,10 +143,10 @@ bool FlowSensitiveTBHC::propAlongIndirectEdge(const IndirectSVFGEdge* edge)
143
143
  }
144
144
  }
145
145
 
146
- if (GepObjPN *gep = SVFUtil::dyn_cast<GepObjPN>(pag->getGNode(o)))
146
+ if (GepObjVar *gep = SVFUtil::dyn_cast<GepObjVar>(pag->getGNode(o)))
147
147
  {
148
148
  // Want the geps which are at the same "level" as this one (same mem obj, same offset).
149
- const NodeBS &geps = getGepObjsFromMemObj(gep->getMemObj(), gep->getLocationSet().getOffset());
149
+ const NodeBS &geps = getGepObjsFromMemObj(gep->getMemObj(), gep->getOffset());
150
150
  for (NodeID g : geps)
151
151
  {
152
152
  const DIType *gepType = getType(g);
@@ -328,7 +328,7 @@ bool FlowSensitiveTBHC::processGep(const GepSVFGNode* gep)
328
328
  }
329
329
 
330
330
  if (DCHGraph::isAgg(baseType) && baseType->getTag() != dwarf::DW_TAG_array_type
331
- && normalGep->getLocationSet().getOffset() >= dchg->getNumFields(baseType))
331
+ && normalGep->getOffset() >= dchg->getNumFields(baseType))
332
332
  {
333
333
  // If the field offset is too high for this object, it is killed. It seems that a
334
334
  // clone was made on this GEP but this is not the base (e.g. base->f1->f2), and SVF
@@ -342,7 +342,7 @@ bool FlowSensitiveTBHC::processGep(const GepSVFGNode* gep)
342
342
  else
343
343
  {
344
344
  // Operate on the field and all its clones.
345
- const NodeBS fieldClones = getGepObjClones(oq, normalGep->getLocationSet().getOffset());
345
+ const NodeBS fieldClones = getGepObjClones(oq, normalGep->getOffset());
346
346
  for (NodeID fc : fieldClones)
347
347
  {
348
348
  gepToSVFGRetrievers[getOriginalObj(fc)].set(gep->getId());
@@ -648,7 +648,7 @@ void FlowSensitiveTBHC::expandFIObjs(const PointsTo& pts, PointsTo& expandedPts)
648
648
  for (NodeID o : pts)
649
649
  {
650
650
  expandedPts |= getAllFieldsObjVars(o);
651
- while (const GepObjPN *gepObj = SVFUtil::dyn_cast<GepObjPN>(pag->getGNode(o)))
651
+ while (const GepObjVar *gepObj = SVFUtil::dyn_cast<GepObjVar>(pag->getGNode(o)))
652
652
  {
653
653
  expandedPts |= getAllFieldsObjVars(o);
654
654
  o = gepObj->getBaseNode();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svf-tools",
3
- "version": "1.0.328",
3
+ "version": "1.0.332",
4
4
  "description": "* <b>[TypeClone](https://github.com/SVF-tools/SVF/wiki/TypeClone) published in our [ECOOP paper](https://yuleisui.github.io/publications/ecoop20.pdf) is now available in SVF </b> * <b>SVF now uses a single script for its build. Just type [`source ./build.sh`](https://github.com/SVF-tools/SVF/blob/master/build.sh) in your terminal, that's it!</b> * <b>SVF now supports LLVM-10.0.0! </b> * <b>We thank [bsauce](https://github.com/bsauce) for writing a user manual of SVF ([link1](https://www.jianshu.com/p/068a08ec749c) and [link2](https://www.jianshu.com/p/777c30d4240e)) in Chinese </b> * <b>SVF now supports LLVM-9.0.0 (Thank [Byoungyoung Lee](https://github.com/SVF-tools/SVF/issues/142) for his help!). </b> * <b>SVF now supports a set of [field-sensitive pointer analyses](https://yuleisui.github.io/publications/sas2019a.pdf). </b> * <b>[Use SVF as an external lib](https://github.com/SVF-tools/SVF/wiki/Using-SVF-as-a-lib-in-your-own-tool) for your own project (Contributed by [Hongxu Chen](https://github.com/HongxuChen)). </b> * <b>SVF now supports LLVM-7.0.0. </b> * <b>SVF now supports Docker. [Try SVF in Docker](https://github.com/SVF-tools/SVF/wiki/Try-SVF-in-Docker)! </b> * <b>SVF now supports [LLVM-6.0.0](https://github.com/svf-tools/SVF/pull/38) (Contributed by [Jack Anthony](https://github.com/jackanth)). </b> * <b>SVF now supports [LLVM-4.0.0](https://github.com/svf-tools/SVF/pull/23) (Contributed by Jared Carlson. Thank [Jared](https://github.com/jcarlson23) and [Will](https://github.com/dtzWill) for their in-depth [discussions](https://github.com/svf-tools/SVF/pull/18) about updating SVF!) </b> * <b>SVF now supports analysis for C++ programs.</b> <br />",
5
5
  "main": "index.js",
6
6
  "scripts": {