svf-tools 1.0.372 → 1.0.376

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 (254) hide show
  1. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +3 -3
  2. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +5 -6
  3. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +10 -10
  4. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +1 -1
  5. package/SVF-doxygen/html/html/Conditions_8cpp_source.html +1 -1
  6. package/SVF-doxygen/html/html/ConsGEdge_8h_source.html +1 -1
  7. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +3 -3
  8. package/SVF-doxygen/html/html/ConsG_8h_source.html +7 -7
  9. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +6 -6
  10. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
  11. package/SVF-doxygen/html/html/DDAClient_8h_source.html +1 -1
  12. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +1 -1
  13. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +15 -15
  14. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +2 -2
  15. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +7 -7
  16. package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +7 -7
  17. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
  18. package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
  19. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +4 -10
  20. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +3 -3
  21. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +6 -6
  22. package/SVF-doxygen/html/html/IRGraph_8h_source.html +2 -2
  23. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
  24. package/SVF-doxygen/html/html/LLVMUtil_8h.html +3 -3
  25. package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +2 -2
  26. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +1 -1
  27. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +11 -11
  28. package/SVF-doxygen/html/html/LocationSet_8h_source.html +10 -11
  29. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +10 -10
  30. package/SVF-doxygen/html/html/OfflineConsG_8cpp_source.html +1 -1
  31. package/SVF-doxygen/html/html/Options_8cpp_source.html +22 -21
  32. package/SVF-doxygen/html/html/Options_8h_source.html +22 -21
  33. package/SVF-doxygen/html/html/PAGBuilderFromFile_8cpp_source.html +1 -1
  34. package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +17 -17
  35. package/SVF-doxygen/html/html/PathCondAllocator_8cpp_source.html +1 -1
  36. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +8 -8
  37. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
  38. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +11 -11
  39. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +14 -14
  40. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +2 -2
  41. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +8 -10
  42. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +72 -73
  43. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +37 -35
  44. package/SVF-doxygen/html/html/SVFIR_8h_source.html +66 -68
  45. package/SVF-doxygen/html/html/SVFModule_8cpp_source.html +1 -1
  46. package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +1 -1
  47. package/SVF-doxygen/html/html/SVFStatements_8h_source.html +5 -5
  48. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +1 -1
  49. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +18 -19
  50. package/SVF-doxygen/html/html/SVFVariables_8h_source.html +121 -127
  51. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +6 -6
  52. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
  53. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +39 -30
  54. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +10 -7
  55. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +93 -53
  56. package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +82 -85
  57. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +5 -5
  58. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +1 -1
  59. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +17 -16
  60. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8h_source.html +1 -1
  61. package/SVF-doxygen/html/html/VFGNode_8h_source.html +2 -2
  62. package/SVF-doxygen/html/html/VFG_8cpp_source.html +7 -7
  63. package/SVF-doxygen/html/html/VFG_8h_source.html +2 -2
  64. package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +4 -4
  65. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +4 -4
  66. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +5 -5
  67. package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +1 -1
  68. package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +1 -1
  69. package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +2 -2
  70. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +8 -8
  71. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +8 -8
  72. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +4 -4
  73. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +5 -6
  74. package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +3 -3
  75. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +12 -13
  76. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -3
  77. package/SVF-doxygen/html/html/classSVF_1_1BranchCondManager.html +2 -2
  78. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +2 -2
  79. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +1 -1
  80. package/SVF-doxygen/html/html/classSVF_1_1CloneDummyObjVar-members.html +22 -25
  81. package/SVF-doxygen/html/html/classSVF_1_1CloneDummyObjVar.html +16 -25
  82. package/SVF-doxygen/html/html/classSVF_1_1CloneFIObjVar-members.html +22 -25
  83. package/SVF-doxygen/html/html/classSVF_1_1CloneFIObjVar.html +17 -26
  84. package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar-members.html +23 -26
  85. package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar.html +17 -26
  86. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -3
  87. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +1 -1
  88. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +5 -5
  89. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +6 -6
  90. package/SVF-doxygen/html/html/classSVF_1_1DDAClient.html +2 -2
  91. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +2 -2
  92. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +12 -12
  93. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar-members.html +22 -25
  94. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +18 -27
  95. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar-members.html +21 -24
  96. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +18 -27
  97. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar-members.html +22 -25
  98. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +19 -28
  99. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +3 -3
  100. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +10 -10
  101. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +8 -8
  102. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +17 -17
  103. package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +1 -1
  104. package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +1 -1
  105. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
  106. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar-members.html +24 -27
  107. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +42 -51
  108. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +12 -12
  109. package/SVF-doxygen/html/html/classSVF_1_1GepValVar-members.html +30 -35
  110. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +34 -106
  111. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
  112. package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +3 -3
  113. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
  114. package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +2 -2
  115. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +1 -1
  116. package/SVF-doxygen/html/html/classSVF_1_1LocationSet-members.html +15 -16
  117. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +47 -81
  118. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +12 -12
  119. package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +87 -87
  120. package/SVF-doxygen/html/html/classSVF_1_1NormalGepCGEdge.html +1 -1
  121. package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +1 -1
  122. package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo-members.html +7 -8
  123. package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +162 -211
  124. package/SVF-doxygen/html/html/classSVF_1_1ObjVar-members.html +22 -25
  125. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +23 -32
  126. package/SVF-doxygen/html/html/classSVF_1_1OfflineConsG.html +1 -1
  127. package/SVF-doxygen/html/html/classSVF_1_1Options-members.html +55 -54
  128. package/SVF-doxygen/html/html/classSVF_1_1Options.html +47 -21
  129. package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +3 -3
  130. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +4 -4
  131. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +18 -18
  132. package/SVF-doxygen/html/html/classSVF_1_1PathCondAllocator.html +1 -1
  133. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +30 -30
  134. package/SVF-doxygen/html/html/classSVF_1_1RetPN-members.html +22 -25
  135. package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +18 -27
  136. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +1 -1
  137. package/SVF-doxygen/html/html/classSVF_1_1SVFIR-members.html +4 -4
  138. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +214 -227
  139. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder-members.html +82 -83
  140. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +582 -529
  141. package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
  142. package/SVF-doxygen/html/html/classSVF_1_1SVFVar-members.html +23 -26
  143. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +54 -151
  144. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +6 -6
  145. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +1 -1
  146. package/SVF-doxygen/html/html/classSVF_1_1StInfo.html +43 -43
  147. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder-members.html +10 -7
  148. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +182 -72
  149. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo-members.html +9 -11
  150. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +131 -162
  151. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +5 -5
  152. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +1 -1
  153. package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +26 -25
  154. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +2 -2
  155. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +8 -8
  156. package/SVF-doxygen/html/html/classSVF_1_1ValVar-members.html +21 -24
  157. package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +16 -25
  158. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN-members.html +22 -25
  159. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +18 -27
  160. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +7 -7
  161. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +5 -5
  162. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +12 -12
  163. package/SVF-doxygen/html/html/functions_a.html +24 -24
  164. package/SVF-doxygen/html/html/functions_c.html +1 -1
  165. package/SVF-doxygen/html/html/functions_f.html +19 -22
  166. package/SVF-doxygen/html/html/functions_func.html +24 -24
  167. package/SVF-doxygen/html/html/functions_func_c.html +1 -1
  168. package/SVF-doxygen/html/html/functions_func_g.html +20 -23
  169. package/SVF-doxygen/html/html/functions_func_h.html +1 -1
  170. package/SVF-doxygen/html/html/functions_func_i.html +11 -17
  171. package/SVF-doxygen/html/html/functions_func_l.html +2 -2
  172. package/SVF-doxygen/html/html/functions_func_o.html +4 -4
  173. package/SVF-doxygen/html/html/functions_func_r.html +5 -2
  174. package/SVF-doxygen/html/html/functions_g.html +18 -21
  175. package/SVF-doxygen/html/html/functions_h.html +1 -1
  176. package/SVF-doxygen/html/html/functions_i.html +12 -21
  177. package/SVF-doxygen/html/html/functions_l.html +8 -8
  178. package/SVF-doxygen/html/html/functions_m.html +4 -1
  179. package/SVF-doxygen/html/html/functions_o.html +22 -18
  180. package/SVF-doxygen/html/html/functions_p.html +3 -3
  181. package/SVF-doxygen/html/html/functions_r.html +5 -2
  182. package/SVF-doxygen/html/html/functions_rela.html +2 -1
  183. package/SVF-doxygen/html/html/functions_s.html +6 -5
  184. package/SVF-doxygen/html/html/functions_t.html +4 -4
  185. package/SVF-doxygen/html/html/functions_v.html +3 -3
  186. package/SVF-doxygen/html/html/functions_vars_f.html +0 -3
  187. package/SVF-doxygen/html/html/functions_vars_i.html +3 -6
  188. package/SVF-doxygen/html/html/functions_vars_m.html +3 -0
  189. package/SVF-doxygen/html/html/namespaceSVF.html +1 -1
  190. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +8 -8
  191. package/SVF-doxygen/html/html/namespacemembers_func.html +1 -1
  192. package/SVF-doxygen/html/html/namespacemembers_s.html +1 -1
  193. package/SVF-doxygen/html/html/search/all_1.js +22 -22
  194. package/SVF-doxygen/html/html/search/all_10.js +4 -4
  195. package/SVF-doxygen/html/html/search/all_12.js +5 -4
  196. package/SVF-doxygen/html/html/search/all_13.js +6 -6
  197. package/SVF-doxygen/html/html/search/all_14.js +4 -4
  198. package/SVF-doxygen/html/html/search/all_15.js +1 -1
  199. package/SVF-doxygen/html/html/search/all_16.js +1 -1
  200. package/SVF-doxygen/html/html/search/all_3.js +1 -1
  201. package/SVF-doxygen/html/html/search/all_6.js +0 -1
  202. package/SVF-doxygen/html/html/search/all_7.js +9 -9
  203. package/SVF-doxygen/html/html/search/all_8.js +1 -1
  204. package/SVF-doxygen/html/html/search/all_9.js +2 -5
  205. package/SVF-doxygen/html/html/search/all_c.js +4 -4
  206. package/SVF-doxygen/html/html/search/all_d.js +1 -0
  207. package/SVF-doxygen/html/html/search/all_e.js +3 -3
  208. package/SVF-doxygen/html/html/search/all_f.js +3 -3
  209. package/SVF-doxygen/html/html/search/functions_0.js +22 -22
  210. package/SVF-doxygen/html/html/search/functions_10.js +2 -2
  211. package/SVF-doxygen/html/html/search/functions_2.js +1 -1
  212. package/SVF-doxygen/html/html/search/functions_6.js +9 -9
  213. package/SVF-doxygen/html/html/search/functions_7.js +1 -1
  214. package/SVF-doxygen/html/html/search/functions_8.js +1 -3
  215. package/SVF-doxygen/html/html/search/functions_a.js +1 -1
  216. package/SVF-doxygen/html/html/search/functions_d.js +1 -1
  217. package/SVF-doxygen/html/html/search/functions_e.js +1 -1
  218. package/SVF-doxygen/html/html/search/functions_f.js +1 -0
  219. package/SVF-doxygen/html/html/search/related_9.js +1 -1
  220. package/SVF-doxygen/html/html/search/variables_14.js +2 -2
  221. package/SVF-doxygen/html/html/search/variables_15.js +1 -1
  222. package/SVF-doxygen/html/html/search/variables_6.js +0 -1
  223. package/SVF-doxygen/html/html/search/variables_9.js +1 -2
  224. package/SVF-doxygen/html/html/search/variables_d.js +1 -0
  225. package/SVF-doxygen/html/html/search/variables_e.js +2 -2
  226. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
  227. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +7 -21
  228. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +3 -3
  229. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01OfflineConsG_01_5_01_4.html +1 -1
  230. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1LocationSet_01_4.html +4 -4
  231. package/SVF-doxygen/html/html/svf-ex_8cpp.html +2 -2
  232. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +2 -2
  233. package/include/MemoryModel/LocationSet.h +0 -6
  234. package/include/MemoryModel/SVFIR.h +5 -37
  235. package/include/MemoryModel/SVFStatements.h +1 -1
  236. package/include/MemoryModel/SVFVariables.h +4 -21
  237. package/include/MemoryModel/SymbolTableInfo.h +8 -24
  238. package/include/SVF-FE/LLVMUtil.h +1 -1
  239. package/include/SVF-FE/SVFIRBuilder.h +91 -108
  240. package/include/SVF-FE/SymbolTableBuilder.h +9 -2
  241. package/include/Util/Options.h +1 -0
  242. package/lib/Graphs/ICFG.cpp +1 -47
  243. package/lib/MemoryModel/LocationSet.cpp +7 -3
  244. package/lib/MemoryModel/PointerAnalysisImpl.cpp +1 -1
  245. package/lib/MemoryModel/SVFIR.cpp +61 -19
  246. package/lib/MemoryModel/SVFVariables.cpp +6 -13
  247. package/lib/MemoryModel/SymbolTableInfo.cpp +57 -68
  248. package/lib/SVF-FE/LLVMUtil.cpp +3 -3
  249. package/lib/SVF-FE/SVFIRBuilder.cpp +83 -136
  250. package/lib/SVF-FE/SymbolTableBuilder.cpp +81 -23
  251. package/lib/Util/Options.cpp +6 -0
  252. package/lib/Util/TypeBasedHeapCloning.cpp +1 -1
  253. package/lib/WPA/AndersenStat.cpp +1 -1
  254. package/package.json +1 -1
@@ -53,7 +53,7 @@ AddrStmt* SVFIR::addAddrStmt(NodeID src, NodeID dst)
53
53
  SVFVar* srcNode = getGNode(src);
54
54
  SVFVar* dstNode = getGNode(dst);
55
55
  if(SVFStmt* edge = hasNonlabeledEdge(srcNode,dstNode, SVFStmt::Addr))
56
- return SVFUtil::cast<AddrStmt>(edge);
56
+ return nullptr;
57
57
  else
58
58
  {
59
59
  AddrStmt* addrPE = new AddrStmt(srcNode, dstNode);
@@ -71,7 +71,7 @@ CopyStmt* SVFIR::addCopyStmt(NodeID src, NodeID dst)
71
71
  SVFVar* srcNode = getGNode(src);
72
72
  SVFVar* dstNode = getGNode(dst);
73
73
  if(SVFStmt* edge = hasNonlabeledEdge(srcNode,dstNode, SVFStmt::Copy))
74
- return SVFUtil::cast<CopyStmt>(edge);
74
+ return nullptr;
75
75
  else
76
76
  {
77
77
  CopyStmt* copyPE = new CopyStmt(srcNode, dstNode);
@@ -113,7 +113,7 @@ SelectStmt* SVFIR::addSelectStmt(NodeID res, NodeID op1, NodeID op2, NodeID cond
113
113
  SVFVar* dstNode = getGNode(res);
114
114
  SVFVar* condNode = getGNode(cond);
115
115
  if(SVFStmt* edge = hasLabeledEdge(op1Node, dstNode, SVFStmt::Select, op2Node))
116
- return SVFUtil::cast<SelectStmt>(edge);
116
+ return nullptr;
117
117
  else
118
118
  {
119
119
  std::vector<SVFVar*> opnds = {op1Node, op2Node};
@@ -133,7 +133,7 @@ CmpStmt* SVFIR::addCmpStmt(NodeID op1, NodeID op2, NodeID dst, u32_t predicate)
133
133
  SVFVar* op2Node = getGNode(op2);
134
134
  SVFVar* dstNode = getGNode(dst);
135
135
  if(SVFStmt* edge = hasLabeledEdge(op1Node, dstNode, SVFStmt::Cmp, op2Node))
136
- return SVFUtil::cast<CmpStmt>(edge);
136
+ return nullptr;
137
137
  else
138
138
  {
139
139
  std::vector<SVFVar*> opnds = {op1Node, op2Node};
@@ -154,7 +154,7 @@ BinaryOPStmt* SVFIR::addBinaryOPStmt(NodeID op1, NodeID op2, NodeID dst, u32_t o
154
154
  SVFVar* op2Node = getGNode(op2);
155
155
  SVFVar* dstNode = getGNode(dst);
156
156
  if(SVFStmt* edge = hasLabeledEdge(op1Node, dstNode, SVFStmt::BinaryOp, op2Node))
157
- return SVFUtil::cast<BinaryOPStmt>(edge);
157
+ return nullptr;
158
158
  else
159
159
  {
160
160
  std::vector<SVFVar*> opnds = {op1Node, op2Node};
@@ -173,7 +173,7 @@ UnaryOPStmt* SVFIR::addUnaryOPStmt(NodeID src, NodeID dst, u32_t opcode)
173
173
  SVFVar* srcNode = getGNode(src);
174
174
  SVFVar* dstNode = getGNode(dst);
175
175
  if(SVFStmt* edge = hasNonlabeledEdge(srcNode,dstNode, SVFStmt::UnaryOp))
176
- return SVFUtil::cast<UnaryOPStmt>(edge);
176
+ return nullptr;
177
177
  else
178
178
  {
179
179
  UnaryOPStmt* unaryOP = new UnaryOPStmt(srcNode, dstNode, opcode);
@@ -191,7 +191,7 @@ BranchStmt* SVFIR::addBranchStmt(NodeID br, NodeID cond, const BranchStmt::SuccA
191
191
  SVFVar* brNode = getGNode(br);
192
192
  SVFVar* condNode = getGNode(cond);
193
193
  if(SVFStmt* edge = hasNonlabeledEdge(condNode,brNode, SVFStmt::Branch))
194
- return SVFUtil::cast<BranchStmt>(edge);
194
+ return nullptr;
195
195
  else
196
196
  {
197
197
  BranchStmt* branch = new BranchStmt(brNode, condNode, succs);
@@ -209,7 +209,7 @@ LoadStmt* SVFIR::addLoadStmt(NodeID src, NodeID dst)
209
209
  SVFVar* srcNode = getGNode(src);
210
210
  SVFVar* dstNode = getGNode(dst);
211
211
  if(SVFStmt* edge = hasNonlabeledEdge(srcNode,dstNode, SVFStmt::Load))
212
- return SVFUtil::cast<LoadStmt>(edge);
212
+ return nullptr;
213
213
  else
214
214
  {
215
215
  LoadStmt* loadPE = new LoadStmt(srcNode, dstNode);
@@ -228,7 +228,7 @@ StoreStmt* SVFIR::addStoreStmt(NodeID src, NodeID dst, const IntraICFGNode* curV
228
228
  SVFVar* srcNode = getGNode(src);
229
229
  SVFVar* dstNode = getGNode(dst);
230
230
  if(SVFStmt* edge = hasLabeledEdge(srcNode,dstNode, SVFStmt::Store, curVal))
231
- return SVFUtil::cast<StoreStmt>(edge);
231
+ return nullptr;
232
232
  else
233
233
  {
234
234
  StoreStmt* storePE = new StoreStmt(srcNode, dstNode, curVal);
@@ -246,7 +246,7 @@ CallPE* SVFIR::addCallPE(NodeID src, NodeID dst, const CallICFGNode* cs, const F
246
246
  SVFVar* srcNode = getGNode(src);
247
247
  SVFVar* dstNode = getGNode(dst);
248
248
  if(SVFStmt* edge = hasLabeledEdge(srcNode,dstNode, SVFStmt::Call, cs))
249
- return SVFUtil::cast<CallPE>(edge);
249
+ return nullptr;
250
250
  else
251
251
  {
252
252
  CallPE* callPE = new CallPE(srcNode, dstNode, cs,entry);
@@ -264,7 +264,7 @@ RetPE* SVFIR::addRetPE(NodeID src, NodeID dst, const CallICFGNode* cs, const Fun
264
264
  SVFVar* srcNode = getGNode(src);
265
265
  SVFVar* dstNode = getGNode(dst);
266
266
  if(SVFStmt* edge = hasLabeledEdge(srcNode,dstNode, SVFStmt::Ret, cs))
267
- return SVFUtil::cast<RetPE>(edge);
267
+ return nullptr;
268
268
  else
269
269
  {
270
270
  RetPE* retPE = new RetPE(srcNode, dstNode, cs, exit);
@@ -293,7 +293,7 @@ TDForkPE* SVFIR::addThreadForkPE(NodeID src, NodeID dst, const CallICFGNode* cs,
293
293
  SVFVar* srcNode = getGNode(src);
294
294
  SVFVar* dstNode = getGNode(dst);
295
295
  if(SVFStmt* edge = hasLabeledEdge(srcNode,dstNode, SVFStmt::ThreadFork, cs))
296
- return SVFUtil::cast<TDForkPE>(edge);
296
+ return nullptr;
297
297
  else
298
298
  {
299
299
  TDForkPE* forkPE = new TDForkPE(srcNode, dstNode, cs, entry);
@@ -311,7 +311,7 @@ TDJoinPE* SVFIR::addThreadJoinPE(NodeID src, NodeID dst, const CallICFGNode* cs,
311
311
  SVFVar* srcNode = getGNode(src);
312
312
  SVFVar* dstNode = getGNode(dst);
313
313
  if(SVFStmt* edge = hasLabeledEdge(srcNode,dstNode, SVFStmt::ThreadJoin, cs))
314
- return SVFUtil::cast<TDJoinPE>(edge);
314
+ return nullptr;
315
315
  else
316
316
  {
317
317
  TDJoinPE* joinPE = new TDJoinPE(srcNode, dstNode, cs, exit);
@@ -352,7 +352,7 @@ GepStmt* SVFIR::addNormalGepStmt(NodeID src, NodeID dst, const LocationSet& ls)
352
352
  SVFVar* baseNode = getGNode(getBaseValVar(src));
353
353
  SVFVar* dstNode = getGNode(dst);
354
354
  if(SVFStmt* edge = hasNonlabeledEdge(baseNode, dstNode, SVFStmt::Gep))
355
- return SVFUtil::cast<GepStmt>(edge);
355
+ return nullptr;
356
356
  else
357
357
  {
358
358
  GepStmt* gepPE = new GepStmt(baseNode, dstNode, baseLS+ls);
@@ -372,7 +372,7 @@ GepStmt* SVFIR::addVariantGepStmt(NodeID src, NodeID dst, const LocationSet& ls)
372
372
  SVFVar* baseNode = getGNode(getBaseValVar(src));
373
373
  SVFVar* dstNode = getGNode(dst);
374
374
  if(SVFStmt* edge = hasNonlabeledEdge(baseNode, dstNode, SVFStmt::Gep))
375
- return SVFUtil::cast<GepStmt>(edge);
375
+ return nullptr;
376
376
  else
377
377
  {
378
378
  GepStmt* gepPE = new GepStmt(baseNode, dstNode,baseLS+ls, true);
@@ -388,14 +388,14 @@ GepStmt* SVFIR::addVariantGepStmt(NodeID src, NodeID dst, const LocationSet& ls)
388
388
  * Add a temp field value node, this method can only invoked by getGepValVar
389
389
  * due to constaint expression, curInst is used to distinguish different instructions (e.g., memorycpy) when creating GepValVar.
390
390
  */
391
- NodeID SVFIR::addGepValNode(const Value* curInst,const Value* gepVal, const LocationSet& ls, NodeID i, const Type *type, u32_t fieldidx)
391
+ NodeID SVFIR::addGepValNode(const Value* curInst,const Value* gepVal, const LocationSet& ls, NodeID i, const Type *type)
392
392
  {
393
393
  NodeID base = getBaseValVar(getValueNode(gepVal));
394
394
  //assert(findPAGNode(i) == false && "this node should not be created before");
395
395
  assert(0==GepValObjMap[curInst].count(std::make_pair(base, ls))
396
396
  && "this node should not be created before");
397
397
  GepValObjMap[curInst][std::make_pair(base, ls)] = i;
398
- GepValVar *node = new GepValVar(gepVal, i, ls, type, fieldidx);
398
+ GepValVar *node = new GepValVar(gepVal, i, ls, type);
399
399
  return addValNode(gepVal, node, i);
400
400
  }
401
401
 
@@ -537,6 +537,24 @@ NodeID SVFIR::getBaseValVar(NodeID nodeId)
537
537
  return nodeId;
538
538
  }
539
539
 
540
+ /*!
541
+ * It is used to create a dummy GepValVar during global initiailzation.
542
+ */
543
+ NodeID SVFIR::getGepValVar(const Value* curInst, NodeID base, const LocationSet& ls) const
544
+ {
545
+ GepValueVarMap::const_iterator iter = GepValObjMap.find(curInst);
546
+ if(iter==GepValObjMap.end()){
547
+ return UINT_MAX;
548
+ }
549
+ else{
550
+ NodeLocationSetMap::const_iterator lit = iter->second.find(std::make_pair(base, ls));
551
+ if(lit==iter->second.end())
552
+ return UINT_MAX;
553
+ else
554
+ return lit->second;
555
+ }
556
+ }
557
+
540
558
  /*!
541
559
  * Get a base SVFVar given a pointer
542
560
  * Return the source node of its connected normal gep edge
@@ -669,7 +687,31 @@ void SVFIR::initialiseCandidatePointers()
669
687
  candidatePointers.insert(nodeId);
670
688
  }
671
689
  }
672
-
690
+ /*!
691
+ * Return true if FIObjVar can point to any object
692
+ * Or a field GepObjVar can point to any object.
693
+ */
694
+ bool SVFIR::isNonPointerObj(NodeID id) const
695
+ {
696
+ SVFVar* node = getGNode(id);
697
+ if (const FIObjVar* fiNode = SVFUtil::dyn_cast<FIObjVar>(node))
698
+ {
699
+ return (fiNode->getMemObj()->hasPtrObj()==false);
700
+ }
701
+ else if (const GepObjVar* gepNode = SVFUtil::dyn_cast<GepObjVar>(node))
702
+ {
703
+ return (gepNode->getMemObj()->isNonPtrFieldObj(gepNode->getLocationSet()));
704
+ }
705
+ else if (const DummyObjVar* dummyNode = SVFUtil::dyn_cast<DummyObjVar>(node))
706
+ {
707
+ return (dummyNode->getMemObj()->hasPtrObj()==false);
708
+ }
709
+ else
710
+ {
711
+ assert(false && "expecting a object node");
712
+ abort();
713
+ }
714
+ }
673
715
  /*
674
716
  * If this is a dummy node or node does not have incoming edges we assume it is not a pointer here
675
717
  */
@@ -683,7 +725,7 @@ bool SVFIR::isValidPointer(NodeID nodeId) const
683
725
 
684
726
  bool SVFIR::isValidTopLevelPtr(const SVFVar* node)
685
727
  {
686
- if (node->isTopLevelPtr())
728
+ if (SVFUtil::isa<ValVar>(node))
687
729
  {
688
730
  if (isValidPointer(node->getId()) && node->hasValue())
689
731
  {
@@ -40,36 +40,28 @@ using namespace SVFUtil;
40
40
  SVFVar::SVFVar(const Value* val, NodeID i, PNODEK k) :
41
41
  GenericPAGNodeTy(i,k), value(val)
42
42
  {
43
-
44
43
  assert( ValNode <= k && k <= CloneDummyObjNode && "new SVFIR node kind?");
45
-
46
44
  switch (k)
47
45
  {
48
46
  case ValNode:
49
47
  case GepValNode:
50
48
  {
51
49
  assert(val != nullptr && "value is nullptr for ValVar or GepValNode");
52
- isTLPointer = val->getType()->isPointerTy();
53
- isATPointer = false;
50
+ isPtr = val->getType()->isPointerTy();
54
51
  break;
55
52
  }
56
-
57
53
  case RetNode:
58
54
  {
59
55
  assert(val != nullptr && "value is nullptr for RetNode");
60
- isTLPointer = SVFUtil::cast<Function>(val)->getReturnType()->isPointerTy();
61
- isATPointer = false;
56
+ isPtr = SVFUtil::cast<Function>(val)->getReturnType()->isPointerTy();
62
57
  break;
63
58
  }
64
-
65
59
  case VarargNode:
66
60
  case DummyValNode:
67
61
  {
68
- isTLPointer = true;
69
- isATPointer = false;
62
+ isPtr = true;
70
63
  break;
71
64
  }
72
-
73
65
  case ObjNode:
74
66
  case GepObjNode:
75
67
  case FIObjNode:
@@ -78,8 +70,9 @@ SVFVar::SVFVar(const Value* val, NodeID i, PNODEK k) :
78
70
  case CloneFIObjNode:
79
71
  case CloneDummyObjNode:
80
72
  {
81
- isTLPointer = false;
82
- isATPointer = true;
73
+ isPtr = true;
74
+ if(val)
75
+ isPtr = val->getType()->isPointerTy();
83
76
  break;
84
77
  }
85
78
  }
@@ -44,6 +44,17 @@ SymbolTableInfo* SymbolTableInfo::symInfo = nullptr;
44
44
  u32_t StInfo::maxFieldLimit = 0;
45
45
 
46
46
 
47
+ ObjTypeInfo::ObjTypeInfo(const Type* t, u32_t max) : type(t), flags(0), maxOffsetLimit(max)
48
+ {
49
+ assert(t && "no type information for this object?");
50
+ }
51
+
52
+
53
+ void ObjTypeInfo::resetTypeForHeapStaticObj(const Type* t){
54
+ assert((isStaticObj() || isHeap()) && "can only reset the inferred type for heap and static objects!");
55
+ type = t;
56
+ }
57
+
47
58
  /// Add field (index and offset) with its corresponding type
48
59
  void StInfo::addFldWithType(u32_t fldIdx, const Type* type, u32_t elemIdx)
49
60
  {
@@ -90,8 +101,11 @@ SymbolTableInfo::TypeToFieldInfoMap::iterator SymbolTableInfo::getStructInfoIter
90
101
  */
91
102
  ObjTypeInfo* SymbolTableInfo::createObjTypeInfo(const Type* type)
92
103
  {
93
- ObjTypeInfo* typeInfo = new ObjTypeInfo(StInfo::getMaxFieldLimit(),type);
94
- typeInfo->analyzeHeapObjType(type);
104
+ ObjTypeInfo* typeInfo = new ObjTypeInfo(type, StInfo::getMaxFieldLimit());
105
+ if(type && type->isPointerTy()){
106
+ typeInfo->setFlag(ObjTypeInfo::HEAP_OBJ);
107
+ typeInfo->setFlag(ObjTypeInfo::HASPTR_OBJ);
108
+ }
95
109
  return typeInfo;
96
110
  }
97
111
 
@@ -140,10 +154,19 @@ void SymbolTableInfo::collectArrayInfo(const ArrayType* ty)
140
154
  StInfo* stinfo = new StInfo(totalElemNum);
141
155
  typeToFieldInfo[ty] = stinfo;
142
156
 
157
+ /// array without any element (this is not true in C/C++ arrays) we assume there is an empty dummy element
158
+ if(totalElemNum==0){
159
+ stinfo->addFldWithType(0, elemTy, 0);
160
+ stinfo->setNumOfFieldsAndElems(1, 1);
161
+ FlattenedFieldInfo field(0, elemTy);
162
+ stinfo->getFlattenedFieldInfoVec().push_back(field);
163
+ return;
164
+ }
165
+
143
166
  /// Array's flatten field infor is the same as its element's
144
167
  /// flatten infor.
145
168
  StInfo* elemStInfo = getStructInfo(elemTy);
146
- u32_t nfE = elemStInfo->getFlattenedFieldInfoVec().size();
169
+ u32_t nfE = elemStInfo->getNumOfFlattenFields();
147
170
  for (u32_t j = 0; j < nfE; j++)
148
171
  {
149
172
  u32_t idx = elemStInfo->getFlattenedFieldInfoVec()[j].getFlattenFldIdx();
@@ -186,7 +209,7 @@ void SymbolTableInfo::collectStructInfo(const StructType *sty)
186
209
  if (SVFUtil::isa<StructType>(et) || SVFUtil::isa<ArrayType>(et))
187
210
  {
188
211
  StInfo * subStinfo = getStructInfo(et);
189
- u32_t nfE = subStinfo->getFlattenedFieldInfoVec().size();
212
+ u32_t nfE = subStinfo->getNumOfFlattenFields();
190
213
  //Copy ST's info, whose element 0 is the size of ST itself.
191
214
  for (u32_t j = 0; j < nfE; j++)
192
215
  {
@@ -351,7 +374,7 @@ MemObj* SymbolTableInfo::createBlkObj(SymID symId)
351
374
  {
352
375
  assert(isBlkObj(symId));
353
376
  assert(objMap.find(symId)==objMap.end());
354
- MemObj* obj = new MemObj(symId, createObjTypeInfo());
377
+ MemObj* obj = new MemObj(symId, createObjTypeInfo(IntegerType::get(LLVMModuleSet::getLLVMModuleSet()->getContext(), 32)));
355
378
  objMap[symId] = obj;
356
379
  return obj;
357
380
  }
@@ -360,7 +383,7 @@ MemObj* SymbolTableInfo::createConstantObj(SymID symId)
360
383
  {
361
384
  assert(isConstantObj(symId));
362
385
  assert(objMap.find(symId)==objMap.end());
363
- MemObj* obj = new MemObj(symId, createObjTypeInfo());
386
+ MemObj* obj = new MemObj(symId, createObjTypeInfo(IntegerType::get(LLVMModuleSet::getLLVMModuleSet()->getContext(), 32)));
364
387
  objMap[symId] = obj;
365
388
  return obj;
366
389
  }
@@ -374,27 +397,34 @@ const MemObj* SymbolTableInfo::createDummyObj(SymID symId, const Type* type)
374
397
  }
375
398
 
376
399
  /// Number of flattenned elements of an array or struct
377
- const u32_t SymbolTableInfo::getNumOfFlattenElements(const Type *T)
400
+ u32_t SymbolTableInfo::getNumOfFlattenElements(const Type *T)
378
401
  {
379
- return getStructInfoIter(T)->second->getNumOfFlattenElements();
380
- }
381
-
382
- /// Number of flattenned fields of a struct
383
- const u32_t SymbolTableInfo::getNumOfFlattenFields(const StructType *T)
384
- {
385
- return getStructInfoIter(T)->second->getNumOfFlattenFields();
386
- }
387
-
388
- /// Flatterned full offset information of a struct including its array fields
389
- const std::vector<u32_t>& SymbolTableInfo::getFlattenedElemIdxVec(const Type *T)
390
- {
391
- return getStructInfoIter(T)->second->getFlattenedElemIdxVec();
402
+ if(Options::ModelArrays)
403
+ return getStructInfoIter(T)->second->getNumOfFlattenElements();
404
+ else
405
+ return getStructInfoIter(T)->second->getNumOfFlattenFields();
392
406
  }
393
407
 
394
- /// Flatterned field index information of a struct ignoring any array field
395
- const std::vector<u32_t>& SymbolTableInfo::getFlattenedFieldIdxVec(const StructType *T)
408
+ /// Flatterned offset information of a struct or an array including its array fields
409
+ u32_t SymbolTableInfo::getFlattenedElemIdx(const Type *T, s64_t origId)
396
410
  {
397
- return getStructInfoIter(T)->second->getFlattenedFieldIdxVec();
411
+ if(Options::ModelArrays){
412
+ std::vector<u32_t>& so = getStructInfoIter(T)->second->getFlattenedElemIdxVec();
413
+ assert ((unsigned)origId <= so.size() && !so.empty() && "Array index out of bounds, can't get flattened index!");
414
+ return so[origId];
415
+ }
416
+ else{
417
+ if(SVFUtil::isa<StructType>(T)){
418
+ std::vector<u32_t>& so = getStructInfoIter(T)->second->getFlattenedFieldIdxVec();
419
+ assert ((unsigned)origId <= so.size() && !so.empty() && "Struct index out of bounds, can't get flattened index!");
420
+ return so[origId];
421
+ }
422
+ else{
423
+ /// When Options::ModelArrays is disabled, any element index Array is modeled as the base
424
+ assert(SVFUtil::isa<ArrayType>(T) && "Only accept struct or array type if Options::ModelArrays is disabled!");
425
+ return 0;
426
+ }
427
+ }
398
428
  }
399
429
 
400
430
  const std::vector<FlattenedFieldInfo>& SymbolTableInfo::getFlattenedFieldInfoVec(const Type *T)
@@ -579,36 +609,13 @@ u32_t SymbolTableInfo::getTypeSizeInBytes(const StructType *sty, u32_t field_idx
579
609
  }
580
610
 
581
611
 
582
-
583
- /*!
584
- * Analyse types of heap and static objects
585
- */
586
- void ObjTypeInfo::analyzeHeapObjType(const Type*)
587
- {
588
- // TODO: Heap and static objects are considered as pointers right now.
589
- // Refine this function to get more details about heap and static objects.
590
- setFlag(HEAP_OBJ);
591
- setFlag(HASPTR_OBJ);
592
- }
593
-
594
- /*!
595
- * Analyse types of heap and static objects
596
- */
597
- void ObjTypeInfo::analyzeStaticObjType(const Type*)
598
- {
599
- // TODO: Heap and static objects are considered as pointers right now.
600
- // Refine this function to get more details about heap and static objects.
601
- setFlag(STATIC_OBJ);
602
- setFlag(HASPTR_OBJ);
603
- }
604
-
605
612
  /*!
606
613
  * Whether a location set is a pointer type or not
607
614
  */
608
615
  bool ObjTypeInfo::isNonPtrFieldObj(const LocationSet& ls)
609
616
  {
610
- if (isHeap() || isStaticObj())
611
- return false;
617
+ if (hasPtrObj() == false)
618
+ return true;
612
619
 
613
620
  const Type* ety = getType();
614
621
  while (const ArrayType *AT= SVFUtil::dyn_cast<ArrayType>(ety))
@@ -625,7 +632,7 @@ bool ObjTypeInfo::isNonPtrFieldObj(const LocationSet& ls)
625
632
  for (; it != eit; ++it)
626
633
  {
627
634
  const FlattenedFieldInfo& fieldLS = *it;
628
- if (ls.intersects(LocationSet(fieldLS)))
635
+ if (ls.intersects(LocationSet(fieldLS.getFlattenFldIdx())))
629
636
  {
630
637
  hasIntersection = true;
631
638
  if (fieldLS.getFlattenElemTy()->isPointerTy())
@@ -637,28 +644,10 @@ bool ObjTypeInfo::isNonPtrFieldObj(const LocationSet& ls)
637
644
  }
638
645
  else
639
646
  {
640
- if (isStaticObj() || isHeap())
641
- {
642
- // TODO: Objects which cannot find proper field for a certain offset including
643
- // arguments in main(), static objects allocated before main and heap
644
- // objects. Right now they're considered to have infinite fields and we
645
- // treat each field as pointers conservatively.
646
- // Try to model static and heap objects more accurately in the future.
647
- return false;
648
- }
649
- else
650
- {
651
- // TODO: Using new memory model (locMM) may create objects with spurious offset
652
- // as we simply return new offset by mod operation without checking its
653
- // correctness in LocSymTableInfo::getModulusOffset(). So the following
654
- // assertion may fail. Try to refine the new memory model.
655
- //assert(ls.getConstantFieldIdx() == 0 && "cannot get a field from a non-struct type");
656
- return (hasPtrObj() == false);
657
- }
647
+ return (hasPtrObj() == false);
658
648
  }
659
649
  }
660
650
 
661
-
662
651
  /*!
663
652
  * Set mem object to be field sensitive (up to maximum field limit)
664
653
  */
@@ -188,15 +188,15 @@ const Value * SVFUtil::stripConstantCasts(const Value *val)
188
188
  /*!
189
189
  * Strip all casts
190
190
  */
191
- Value * SVFUtil::stripAllCasts(Value *val)
191
+ const Value * SVFUtil::stripAllCasts(const Value *val)
192
192
  {
193
193
  while (true)
194
194
  {
195
- if (CastInst *ci = SVFUtil::dyn_cast<CastInst>(val))
195
+ if (const CastInst *ci = SVFUtil::dyn_cast<CastInst>(val))
196
196
  {
197
197
  val = ci->getOperand(0);
198
198
  }
199
- else if (ConstantExpr *ce = SVFUtil::dyn_cast<ConstantExpr>(val))
199
+ else if (const ConstantExpr *ce = SVFUtil::dyn_cast<ConstantExpr>(val))
200
200
  {
201
201
  if(ce->isCast())
202
202
  val = ce->getOperand(0);