svf-tools 1.0.758 → 1.0.760

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 (666) hide show
  1. package/CMakeLists.txt +7 -0
  2. package/SVF-doxygen/html/html/AccessPath_8cpp_source.html +2 -2
  3. package/SVF-doxygen/html/html/AddressValue_8h_source.html +1 -1
  4. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +1 -1
  5. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +5 -5
  6. package/SVF-doxygen/html/html/Andersen_8h_source.html +2 -2
  7. package/SVF-doxygen/html/html/CFBasicBlockG_8cpp_source.html +4 -4
  8. package/SVF-doxygen/html/html/CFBasicBlockG_8h_source.html +2 -2
  9. package/SVF-doxygen/html/html/CFGrammar_8cpp_source.html +11 -8
  10. package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +7 -7
  11. package/SVF-doxygen/html/html/CFLAlias_8h_source.html +1 -1
  12. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +17 -17
  13. package/SVF-doxygen/html/html/CHG_8cpp.html +2 -2
  14. package/SVF-doxygen/html/html/CHG_8cpp_source.html +7 -7
  15. package/SVF-doxygen/html/html/CHG_8h_source.html +3 -3
  16. package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +6 -6
  17. package/SVF-doxygen/html/html/CallGraphBuilder_8h_source.html +1 -1
  18. package/SVF-doxygen/html/html/CommandLine_8h_source.html +2 -1
  19. package/SVF-doxygen/html/html/ConsExeState_8cpp_source.html +1 -1
  20. package/SVF-doxygen/html/html/ConsExeState_8h_source.html +1 -1
  21. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +2 -2
  22. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +1 -1
  23. package/SVF-doxygen/html/html/CoreBitVector_8cpp_source.html +1 -1
  24. package/SVF-doxygen/html/html/CxtStmt_8h_source.html +2 -2
  25. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +11 -11
  26. package/SVF-doxygen/html/html/DCHG_8h_source.html +3 -3
  27. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
  28. package/SVF-doxygen/html/html/DDAClient_8h_source.html +1 -1
  29. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +1 -1
  30. package/SVF-doxygen/html/html/DDAPass_8h_source.html +1 -1
  31. package/SVF-doxygen/html/html/DPItem_8h_source.html +1 -1
  32. package/SVF-doxygen/html/html/ExeState_8h_source.html +1 -1
  33. package/SVF-doxygen/html/html/ExtAPI_8cpp.html +0 -196
  34. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +121 -786
  35. package/SVF-doxygen/html/html/ExtAPI_8h.html +2 -67
  36. package/SVF-doxygen/html/html/ExtAPI_8h_source.html +69 -654
  37. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +2 -2
  38. package/SVF-doxygen/html/html/FSMPTA_8h_source.html +1 -1
  39. package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +1 -1
  40. package/SVF-doxygen/html/html/GenericGraph_8h_source.html +1 -1
  41. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +11 -11
  42. package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +2 -2
  43. package/SVF-doxygen/html/html/ICFGEdge_8h_source.html +1 -1
  44. package/SVF-doxygen/html/html/ICFGNode_8h_source.html +4 -4
  45. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +7 -7
  46. package/SVF-doxygen/html/html/ICFG_8h_source.html +1 -1
  47. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +1 -1
  48. package/SVF-doxygen/html/html/IntervalExeState_8h_source.html +1 -1
  49. package/SVF-doxygen/html/html/IntervalValue_8h_source.html +1 -1
  50. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +6 -6
  51. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8h_source.html +1 -1
  52. package/SVF-doxygen/html/html/LLVMModule_8cpp.html +3 -4
  53. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +1408 -1289
  54. package/SVF-doxygen/html/html/LLVMModule_8h.html +1 -0
  55. package/SVF-doxygen/html/html/LLVMModule_8h_source.html +418 -400
  56. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +744 -616
  57. package/SVF-doxygen/html/html/LLVMUtil_8h.html +9 -1
  58. package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +485 -472
  59. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +2 -2
  60. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +14 -14
  61. package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +2 -2
  62. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +8 -8
  63. package/SVF-doxygen/html/html/LockResultValidator_8h_source.html +5 -5
  64. package/SVF-doxygen/html/html/MHP_8cpp_source.html +14 -14
  65. package/SVF-doxygen/html/html/MHP_8h_source.html +3 -3
  66. package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +2 -2
  67. package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +5 -5
  68. package/SVF-doxygen/html/html/MTAAnnotator_8h_source.html +4 -4
  69. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +5 -5
  70. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +7 -7
  71. package/SVF-doxygen/html/html/MTA_8cpp_source.html +4 -4
  72. package/SVF-doxygen/html/html/MTA_8h_source.html +1 -1
  73. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +13 -13
  74. package/SVF-doxygen/html/html/MemRegion_8h_source.html +1 -1
  75. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +20 -20
  76. package/SVF-doxygen/html/html/MemSSA_8h_source.html +1 -1
  77. package/SVF-doxygen/html/html/NumericLiteral_8h_source.html +1 -1
  78. package/SVF-doxygen/html/html/Options_8cpp_source.html +2 -1
  79. package/SVF-doxygen/html/html/PCG_8cpp_source.html +13 -13
  80. package/SVF-doxygen/html/html/PCG_8h_source.html +3 -3
  81. package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +2 -2
  82. package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +1 -1
  83. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +3 -3
  84. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +12 -12
  85. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +1 -1
  86. package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +1 -1
  87. package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +2 -2
  88. package/SVF-doxygen/html/html/ProgSlice_8h_source.html +1 -1
  89. package/SVF-doxygen/html/html/RelExeState_8h_source.html +1 -1
  90. package/SVF-doxygen/html/html/SVFBugReport_8cpp_source.html +362 -365
  91. package/SVF-doxygen/html/html/SVFBugReport_8h_source.html +24 -24
  92. package/SVF-doxygen/html/html/SVFFileSystem_8cpp_source.html +2087 -2084
  93. package/SVF-doxygen/html/html/SVFFileSystem_8h.html +1 -1
  94. package/SVF-doxygen/html/html/SVFFileSystem_8h_source.html +60 -60
  95. package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +5 -5
  96. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +2 -2
  97. package/SVF-doxygen/html/html/SVFGReadWrite_8cpp_source.html +1 -1
  98. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +5 -5
  99. package/SVF-doxygen/html/html/SVFIR2ConsExeState_8cpp_source.html +4 -4
  100. package/SVF-doxygen/html/html/SVFIR2ItvExeState_8cpp_source.html +4 -4
  101. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +454 -527
  102. package/SVF-doxygen/html/html/SVFIRBuilder_8h.html +1 -1
  103. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +211 -233
  104. package/SVF-doxygen/html/html/SVFIRExtAPI_8cpp.html +2 -0
  105. package/SVF-doxygen/html/html/SVFIRExtAPI_8cpp_source.html +286 -682
  106. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +2 -2
  107. package/SVF-doxygen/html/html/SVFIR_8h_source.html +1 -1
  108. package/SVF-doxygen/html/html/SVFModule_8cpp_source.html +9 -9
  109. package/SVF-doxygen/html/html/SVFModule_8h.html +0 -1
  110. package/SVF-doxygen/html/html/SVFModule_8h_source.html +258 -260
  111. package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +8 -8
  112. package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +1 -1
  113. package/SVF-doxygen/html/html/SVFStatements_8h_source.html +2 -2
  114. package/SVF-doxygen/html/html/SVFType_8h_source.html +1 -1
  115. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +7 -6
  116. package/SVF-doxygen/html/html/SVFUtil_8h.html +4 -9
  117. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +392 -405
  118. package/SVF-doxygen/html/html/SVFValue_8cpp_source.html +11 -10
  119. package/SVF-doxygen/html/html/SVFValue_8h_source.html +1038 -1030
  120. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +1 -1
  121. package/SVF-doxygen/html/html/SaberCheckerAPI_8h_source.html +1 -1
  122. package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +14 -14
  123. package/SVF-doxygen/html/html/SaberCondAllocator_8h_source.html +6 -6
  124. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +1 -1
  125. package/SVF-doxygen/html/html/SparseBitVector_8h_source.html +1 -1
  126. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
  127. package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +1 -1
  128. package/SVF-doxygen/html/html/Steensgaard_8cpp_source.html +5 -5
  129. package/SVF-doxygen/html/html/Steensgaard_8h_source.html +1 -1
  130. package/SVF-doxygen/html/html/SymState_8cpp_source.html +1 -1
  131. package/SVF-doxygen/html/html/SymState_8h_source.html +1 -1
  132. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +28 -28
  133. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +1 -1
  134. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +1 -1
  135. package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +2 -2
  136. package/SVF-doxygen/html/html/TCT_8cpp_source.html +15 -15
  137. package/SVF-doxygen/html/html/TCT_8h_source.html +7 -7
  138. package/SVF-doxygen/html/html/ThreadAPI_8cpp_source.html +14 -14
  139. package/SVF-doxygen/html/html/ThreadAPI_8h_source.html +5 -5
  140. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +1 -1
  141. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +3 -3
  142. package/SVF-doxygen/html/html/VFGNode_8h_source.html +1 -1
  143. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +2 -2
  144. package/SVF-doxygen/html/html/WPAPass_8h_source.html +1 -1
  145. package/SVF-doxygen/html/html/WTO_8h_source.html +1 -1
  146. package/SVF-doxygen/html/html/annotated.html +1 -4
  147. package/SVF-doxygen/html/html/cJSON_8cpp.html +2 -1
  148. package/SVF-doxygen/html/html/cJSON_8cpp_source.html +2 -1
  149. package/SVF-doxygen/html/html/cfl_8cpp.html +2 -2
  150. package/SVF-doxygen/html/html/cfl_8cpp_source.html +2 -2
  151. package/SVF-doxygen/html/html/classOption.html +2 -1
  152. package/SVF-doxygen/html/html/classSVF_1_1AccessPath.html +2 -2
  153. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +1 -1
  154. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +1 -1
  155. package/SVF-doxygen/html/html/classSVF_1_1AddrCGEdge.html +1 -1
  156. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +1 -1
  157. package/SVF-doxygen/html/html/classSVF_1_1AddressValue.html +1 -1
  158. package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +1 -1
  159. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +5 -5
  160. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +1 -1
  161. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +3 -3
  162. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +1 -1
  163. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +1 -1
  164. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +1 -1
  165. package/SVF-doxygen/html/html/classSVF_1_1BufferOverflowBug.html +50 -50
  166. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTO.html +1 -1
  167. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTOCycle.html +1 -1
  168. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockNode.html +1 -1
  169. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +7 -7
  170. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +18 -18
  171. package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +5 -5
  172. package/SVF-doxygen/html/html/classSVF_1_1CallCFGEdge.html +1 -1
  173. package/SVF-doxygen/html/html/classSVF_1_1CallCHI.html +1 -1
  174. package/SVF-doxygen/html/html/classSVF_1_1CallGraphBuilder.html +6 -6
  175. package/SVF-doxygen/html/html/classSVF_1_1CallICFGNode.html +2 -2
  176. package/SVF-doxygen/html/html/classSVF_1_1CallMU.html +1 -1
  177. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +1 -1
  178. package/SVF-doxygen/html/html/classSVF_1_1CallSite.html +95 -95
  179. package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +1 -1
  180. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +1 -1
  181. package/SVF-doxygen/html/html/classSVF_1_1ConsExeState.html +1 -1
  182. package/SVF-doxygen/html/html/classSVF_1_1ContextCond.html +1 -1
  183. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +1 -1
  184. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +1 -1
  185. package/SVF-doxygen/html/html/classSVF_1_1CoreBitVector.html +1 -1
  186. package/SVF-doxygen/html/html/classSVF_1_1CxtDPItem.html +1 -1
  187. package/SVF-doxygen/html/html/classSVF_1_1CxtStmt.html +1 -1
  188. package/SVF-doxygen/html/html/classSVF_1_1CxtThread.html +1 -1
  189. package/SVF-doxygen/html/html/classSVF_1_1CxtThreadStmt.html +1 -1
  190. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +9 -9
  191. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeBug.html +35 -35
  192. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +2 -2
  193. package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +1 -1
  194. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +8 -77
  195. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +130 -1337
  196. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +1 -1
  197. package/SVF-doxygen/html/html/classSVF_1_1FileNeverCloseBug.html +10 -10
  198. package/SVF-doxygen/html/html/classSVF_1_1FilePartialCloseBug.html +35 -35
  199. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +12 -12
  200. package/SVF-doxygen/html/html/classSVF_1_1FullNullPtrDereferenceBug.html +10 -10
  201. package/SVF-doxygen/html/html/classSVF_1_1FunEntryICFGNode.html +3 -3
  202. package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +4 -4
  203. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +2 -2
  204. package/SVF-doxygen/html/html/classSVF_1_1GenericBug.html +9 -13
  205. package/SVF-doxygen/html/html/classSVF_1_1GenericGraphReader.html +1 -1
  206. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +1 -1
  207. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +1 -1
  208. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +1 -1
  209. package/SVF-doxygen/html/html/classSVF_1_1GrammarBase.html +11 -8
  210. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +2 -2
  211. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +11 -11
  212. package/SVF-doxygen/html/html/classSVF_1_1ICFGWriter.html +11 -11
  213. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +1 -1
  214. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
  215. package/SVF-doxygen/html/html/classSVF_1_1IntervalExeState.html +1 -1
  216. package/SVF-doxygen/html/html/classSVF_1_1IntervalValue.html +1 -1
  217. package/SVF-doxygen/html/html/classSVF_1_1IntraCFGEdge.html +1 -1
  218. package/SVF-doxygen/html/html/classSVF_1_1IntraICFGNode.html +3 -3
  219. package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +1 -1
  220. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +5 -5
  221. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet-members.html +42 -40
  222. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +1583 -1452
  223. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +4 -4
  224. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +1 -1
  225. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +14 -14
  226. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +8 -8
  227. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +14 -14
  228. package/SVF-doxygen/html/html/classSVF_1_1MHPValidator.html +3 -3
  229. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +13 -13
  230. package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode.html +1 -1
  231. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +4 -4
  232. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +6 -6
  233. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +1 -1
  234. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +7 -7
  235. package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +1 -1
  236. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +21 -21
  237. package/SVF-doxygen/html/html/classSVF_1_1NeverFreeBug.html +10 -10
  238. package/SVF-doxygen/html/html/classSVF_1_1NumericLiteral.html +1 -1
  239. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
  240. package/SVF-doxygen/html/html/classSVF_1_1PCG.html +14 -14
  241. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +1 -1
  242. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge.html +1 -1
  243. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphNode.html +1 -1
  244. package/SVF-doxygen/html/html/classSVF_1_1PartialLeakBug.html +34 -34
  245. package/SVF-doxygen/html/html/classSVF_1_1PartialNullPtrDereferenceBug.html +10 -10
  246. package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +1 -1
  247. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +11 -11
  248. package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +1 -1
  249. package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator.html +1 -1
  250. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +2 -2
  251. package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +7 -7
  252. package/SVF-doxygen/html/html/classSVF_1_1RaceValidator.html +3 -3
  253. package/SVF-doxygen/html/html/classSVF_1_1ReaderIDToObjMap.html +2 -2
  254. package/SVF-doxygen/html/html/classSVF_1_1ReaderPtrPool.html +2 -2
  255. package/SVF-doxygen/html/html/classSVF_1_1RelExeState.html +1 -1
  256. package/SVF-doxygen/html/html/classSVF_1_1RetCFGEdge.html +1 -1
  257. package/SVF-doxygen/html/html/classSVF_1_1RetICFGNode.html +2 -2
  258. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +1 -1
  259. package/SVF-doxygen/html/html/classSVF_1_1SVFArgument.html +30 -30
  260. package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock.html +73 -73
  261. package/SVF-doxygen/html/html/classSVF_1_1SVFBlackHoleValue.html +15 -15
  262. package/SVF-doxygen/html/html/classSVF_1_1SVFBugEvent.html +50 -50
  263. package/SVF-doxygen/html/html/classSVF_1_1SVFBugReport.html +87 -87
  264. package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +67 -67
  265. package/SVF-doxygen/html/html/classSVF_1_1SVFConstant.html +17 -17
  266. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantData.html +23 -23
  267. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantFP.html +21 -21
  268. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantInt.html +27 -27
  269. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantNullPtr.html +15 -15
  270. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction-members.html +15 -13
  271. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +222 -153
  272. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +5 -5
  273. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +5 -5
  274. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +1 -1
  275. package/SVF-doxygen/html/html/classSVF_1_1SVFGlobalValue.html +34 -34
  276. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +2 -2
  277. package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ConsExeState.html +3 -3
  278. package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState.html +4 -4
  279. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder-members.html +64 -73
  280. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +905 -1767
  281. package/SVF-doxygen/html/html/classSVF_1_1SVFIRReader.html +1126 -1124
  282. package/SVF-doxygen/html/html/classSVF_1_1SVFIRWriter.html +547 -546
  283. package/SVF-doxygen/html/html/classSVF_1_1SVFInstruction.html +53 -53
  284. package/SVF-doxygen/html/html/classSVF_1_1SVFLoopAndDomInfo.html +2 -2
  285. package/SVF-doxygen/html/html/classSVF_1_1SVFMetadataAsValue.html +15 -15
  286. package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +173 -173
  287. package/SVF-doxygen/html/html/classSVF_1_1SVFModuleReader.html +1 -1
  288. package/SVF-doxygen/html/html/classSVF_1_1SVFModuleWriter.html +23 -23
  289. package/SVF-doxygen/html/html/classSVF_1_1SVFOtherType.html +1 -1
  290. package/SVF-doxygen/html/html/classSVF_1_1SVFOtherValue.html +11 -11
  291. package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +8 -8
  292. package/SVF-doxygen/html/html/classSVF_1_1SVFStructType.html +1 -1
  293. package/SVF-doxygen/html/html/classSVF_1_1SVFValue.html +27 -27
  294. package/SVF-doxygen/html/html/classSVF_1_1SVFVirtualCallInst.html +53 -53
  295. package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +13 -13
  296. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +1 -1
  297. package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +1 -1
  298. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector.html +1 -1
  299. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +5 -5
  300. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +1 -1
  301. package/SVF-doxygen/html/html/classSVF_1_1SymState.html +1 -1
  302. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +27 -27
  303. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfoReader.html +1 -1
  304. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +15 -15
  305. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +1 -1
  306. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +1 -1
  307. package/SVF-doxygen/html/html/classSVF_1_1ThreadAPI.html +8 -8
  308. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +1 -1
  309. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +5 -5
  310. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +3 -3
  311. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +1 -1
  312. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +1 -1
  313. package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +1 -1
  314. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +1 -1
  315. package/SVF-doxygen/html/html/classSVF_1_1iter__adaptor__base.html +1 -1
  316. package/SVF-doxygen/html/html/classSVF_1_1iter__facade__base_1_1ReferenceProxy.html +1 -1
  317. package/SVF-doxygen/html/html/classSVF_1_1iter__range.html +1 -1
  318. package/SVF-doxygen/html/html/classSVF_1_1mapped__iter.html +1 -1
  319. package/SVF-doxygen/html/html/classSVF_1_1pointer__iterator.html +1 -1
  320. package/SVF-doxygen/html/html/classes.html +335 -338
  321. package/SVF-doxygen/html/html/dda_8cpp.html +1 -1
  322. package/SVF-doxygen/html/html/dda_8cpp_source.html +1 -1
  323. package/SVF-doxygen/html/html/dir_3bbf4ce25bc1411b817b5643b794c8fb.html +2 -0
  324. package/SVF-doxygen/html/html/extapi_8c.html +1950 -0
  325. package/SVF-doxygen/html/html/extapi_8c_source.html +1488 -0
  326. package/SVF-doxygen/html/html/files.html +29 -28
  327. package/SVF-doxygen/html/html/functions_a.html +17 -27
  328. package/SVF-doxygen/html/html/functions_b.html +9 -12
  329. package/SVF-doxygen/html/html/functions_c.html +26 -70
  330. package/SVF-doxygen/html/html/functions_d.html +3 -7
  331. package/SVF-doxygen/html/html/functions_e.html +4 -121
  332. package/SVF-doxygen/html/html/functions_enum.html +0 -6
  333. package/SVF-doxygen/html/html/functions_eval.html +0 -1
  334. package/SVF-doxygen/html/html/functions_eval_c.html +1 -15
  335. package/SVF-doxygen/html/html/functions_eval_e.html +0 -96
  336. package/SVF-doxygen/html/html/functions_eval_g.html +1 -2
  337. package/SVF-doxygen/html/html/functions_eval_l.html +0 -1
  338. package/SVF-doxygen/html/html/functions_eval_m.html +0 -6
  339. package/SVF-doxygen/html/html/functions_eval_o.html +0 -3
  340. package/SVF-doxygen/html/html/functions_eval_r.html +0 -6
  341. package/SVF-doxygen/html/html/functions_eval_s.html +0 -1
  342. package/SVF-doxygen/html/html/functions_f.html +16 -19
  343. package/SVF-doxygen/html/html/functions_func.html +6 -18
  344. package/SVF-doxygen/html/html/functions_func_e.html +1 -13
  345. package/SVF-doxygen/html/html/functions_func_g.html +24 -91
  346. package/SVF-doxygen/html/html/functions_func_h.html +9 -12
  347. package/SVF-doxygen/html/html/functions_func_i.html +16 -28
  348. package/SVF-doxygen/html/html/functions_func_n.html +0 -3
  349. package/SVF-doxygen/html/html/functions_func_p.html +3 -12
  350. package/SVF-doxygen/html/html/functions_func_s.html +20 -83
  351. package/SVF-doxygen/html/html/functions_g.html +32 -100
  352. package/SVF-doxygen/html/html/functions_h.html +6 -9
  353. package/SVF-doxygen/html/html/functions_i.html +16 -28
  354. package/SVF-doxygen/html/html/functions_l.html +0 -1
  355. package/SVF-doxygen/html/html/functions_m.html +1 -7
  356. package/SVF-doxygen/html/html/functions_n.html +4 -7
  357. package/SVF-doxygen/html/html/functions_o.html +31 -44
  358. package/SVF-doxygen/html/html/functions_p.html +18 -29
  359. package/SVF-doxygen/html/html/functions_r.html +9 -16
  360. package/SVF-doxygen/html/html/functions_s.html +16 -84
  361. package/SVF-doxygen/html/html/functions_t.html +4 -10
  362. package/SVF-doxygen/html/html/functions_v.html +3 -3
  363. package/SVF-doxygen/html/html/functions_vars_a.html +3 -0
  364. package/SVF-doxygen/html/html/functions_vars_b.html +0 -3
  365. package/SVF-doxygen/html/html/functions_vars_c.html +1 -23
  366. package/SVF-doxygen/html/html/functions_vars_d.html +1 -5
  367. package/SVF-doxygen/html/html/functions_vars_e.html +2 -8
  368. package/SVF-doxygen/html/html/functions_vars_f.html +0 -3
  369. package/SVF-doxygen/html/html/functions_vars_o.html +0 -9
  370. package/SVF-doxygen/html/html/functions_vars_r.html +1 -2
  371. package/SVF-doxygen/html/html/functions_vars_s.html +1 -5
  372. package/SVF-doxygen/html/html/functions_vars_t.html +0 -6
  373. package/SVF-doxygen/html/html/globals.html +22 -4
  374. package/SVF-doxygen/html/html/globals_a.html +3 -0
  375. package/SVF-doxygen/html/html/globals_b.html +3 -0
  376. package/SVF-doxygen/html/html/globals_defs.html +3 -9
  377. package/SVF-doxygen/html/html/globals_e.html +0 -3
  378. package/SVF-doxygen/html/html/globals_f.html +11 -2
  379. package/SVF-doxygen/html/html/globals_func.html +159 -15
  380. package/SVF-doxygen/html/html/globals_g.html +13 -4
  381. package/SVF-doxygen/html/html/globals_i.html +41 -2
  382. package/SVF-doxygen/html/html/globals_j.html +3 -6
  383. package/SVF-doxygen/html/html/globals_l.html +3 -0
  384. package/SVF-doxygen/html/html/globals_m.html +8 -2
  385. package/SVF-doxygen/html/html/globals_n.html +2 -1
  386. package/SVF-doxygen/html/html/globals_p.html +1 -4
  387. package/SVF-doxygen/html/html/globals_r.html +12 -6
  388. package/SVF-doxygen/html/html/globals_s.html +33 -0
  389. package/SVF-doxygen/html/html/globals_t.html +3 -0
  390. package/SVF-doxygen/html/html/hierarchy.html +526 -529
  391. package/SVF-doxygen/html/html/iterator_8h_source.html +1 -1
  392. package/SVF-doxygen/html/html/iterator__range_8h_source.html +1 -1
  393. package/SVF-doxygen/html/html/llvm2svf_8cpp.html +1 -1
  394. package/SVF-doxygen/html/html/llvm2svf_8cpp_source.html +1 -1
  395. package/SVF-doxygen/html/html/menudata.js +3 -0
  396. package/SVF-doxygen/html/html/mta_8cpp.html +1 -1
  397. package/SVF-doxygen/html/html/mta_8cpp_source.html +1 -1
  398. package/SVF-doxygen/html/html/namespaceSVF.html +152 -151
  399. package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +1003 -776
  400. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +298 -368
  401. package/SVF-doxygen/html/html/namespacemembers_func_g.html +11 -5
  402. package/SVF-doxygen/html/html/namespacemembers_func_i.html +11 -14
  403. package/SVF-doxygen/html/html/namespacemembers_func_r.html +6 -0
  404. package/SVF-doxygen/html/html/namespacemembers_g.html +11 -5
  405. package/SVF-doxygen/html/html/namespacemembers_i.html +8 -11
  406. package/SVF-doxygen/html/html/namespacemembers_r.html +6 -0
  407. package/SVF-doxygen/html/html/saber_8cpp.html +1 -1
  408. package/SVF-doxygen/html/html/saber_8cpp_source.html +1 -1
  409. package/SVF-doxygen/html/html/search/all_0.js +153 -147
  410. package/SVF-doxygen/html/html/search/all_1.js +476 -478
  411. package/SVF-doxygen/html/html/search/all_10.js +323 -327
  412. package/SVF-doxygen/html/html/search/all_11.js +212 -209
  413. package/SVF-doxygen/html/html/search/all_12.js +536 -547
  414. package/SVF-doxygen/html/html/search/all_13.js +188 -189
  415. package/SVF-doxygen/html/html/search/all_14.js +66 -66
  416. package/SVF-doxygen/html/html/search/all_15.js +170 -170
  417. package/SVF-doxygen/html/html/search/all_16.js +60 -60
  418. package/SVF-doxygen/html/html/search/all_17.js +1 -1
  419. package/SVF-doxygen/html/html/search/all_18.js +1 -1
  420. package/SVF-doxygen/html/html/search/all_19.js +10 -10
  421. package/SVF-doxygen/html/html/search/all_1a.js +169 -169
  422. package/SVF-doxygen/html/html/search/all_2.js +159 -159
  423. package/SVF-doxygen/html/html/search/all_3.js +597 -608
  424. package/SVF-doxygen/html/html/search/all_4.js +226 -227
  425. package/SVF-doxygen/html/html/search/all_5.js +116 -156
  426. package/SVF-doxygen/html/html/search/all_6.js +225 -223
  427. package/SVF-doxygen/html/html/search/all_7.js +996 -1012
  428. package/SVF-doxygen/html/html/search/all_8.js +191 -192
  429. package/SVF-doxygen/html/html/search/all_9.js +605 -597
  430. package/SVF-doxygen/html/html/search/all_a.js +46 -47
  431. package/SVF-doxygen/html/html/search/all_b.js +26 -26
  432. package/SVF-doxygen/html/html/search/all_c.js +114 -113
  433. package/SVF-doxygen/html/html/search/all_d.js +196 -196
  434. package/SVF-doxygen/html/html/search/all_e.js +205 -206
  435. package/SVF-doxygen/html/html/search/all_f.js +116 -122
  436. package/SVF-doxygen/html/html/search/classes_0.js +26 -26
  437. package/SVF-doxygen/html/html/search/classes_1.js +9 -9
  438. package/SVF-doxygen/html/html/search/classes_10.js +73 -73
  439. package/SVF-doxygen/html/html/search/classes_11.js +15 -15
  440. package/SVF-doxygen/html/html/search/classes_12.js +2 -2
  441. package/SVF-doxygen/html/html/search/classes_13.js +10 -10
  442. package/SVF-doxygen/html/html/search/classes_14.js +14 -14
  443. package/SVF-doxygen/html/html/search/classes_15.js +1 -1
  444. package/SVF-doxygen/html/html/search/classes_2.js +76 -76
  445. package/SVF-doxygen/html/html/search/classes_3.js +35 -35
  446. package/SVF-doxygen/html/html/search/classes_4.js +8 -10
  447. package/SVF-doxygen/html/html/search/classes_5.js +28 -28
  448. package/SVF-doxygen/html/html/search/classes_6.js +98 -98
  449. package/SVF-doxygen/html/html/search/classes_7.js +33 -33
  450. package/SVF-doxygen/html/html/search/classes_8.js +56 -56
  451. package/SVF-doxygen/html/html/search/classes_9.js +1 -1
  452. package/SVF-doxygen/html/html/search/classes_a.js +12 -12
  453. package/SVF-doxygen/html/html/search/classes_b.js +29 -29
  454. package/SVF-doxygen/html/html/search/classes_c.js +6 -6
  455. package/SVF-doxygen/html/html/search/classes_d.js +18 -19
  456. package/SVF-doxygen/html/html/search/classes_e.js +36 -36
  457. package/SVF-doxygen/html/html/search/classes_f.js +25 -25
  458. package/SVF-doxygen/html/html/search/defines_0.js +3 -3
  459. package/SVF-doxygen/html/html/search/defines_1.js +2 -2
  460. package/SVF-doxygen/html/html/search/defines_2.js +30 -30
  461. package/SVF-doxygen/html/html/search/defines_3.js +20 -20
  462. package/SVF-doxygen/html/html/search/defines_4.js +2 -3
  463. package/SVF-doxygen/html/html/search/defines_5.js +4 -4
  464. package/SVF-doxygen/html/html/search/defines_6.js +2 -2
  465. package/SVF-doxygen/html/html/search/defines_7.js +5 -5
  466. package/SVF-doxygen/html/html/search/defines_8.js +11 -13
  467. package/SVF-doxygen/html/html/search/defines_9.js +9 -9
  468. package/SVF-doxygen/html/html/search/defines_a.js +2 -2
  469. package/SVF-doxygen/html/html/search/defines_b.js +1 -1
  470. package/SVF-doxygen/html/html/search/defines_c.js +3 -2
  471. package/SVF-doxygen/html/html/search/defines_d.js +2 -2
  472. package/SVF-doxygen/html/html/search/defines_e.js +6 -6
  473. package/SVF-doxygen/html/html/search/defines_f.js +3 -3
  474. package/SVF-doxygen/html/html/search/enums_0.js +3 -3
  475. package/SVF-doxygen/html/html/search/enums_1.js +2 -2
  476. package/SVF-doxygen/html/html/search/enums_10.js +1 -1
  477. package/SVF-doxygen/html/html/search/enums_11.js +1 -1
  478. package/SVF-doxygen/html/html/search/enums_2.js +8 -8
  479. package/SVF-doxygen/html/html/search/enums_3.js +1 -1
  480. package/SVF-doxygen/html/html/search/enums_4.js +3 -4
  481. package/SVF-doxygen/html/html/search/enums_5.js +1 -1
  482. package/SVF-doxygen/html/html/search/enums_6.js +2 -2
  483. package/SVF-doxygen/html/html/search/enums_7.js +2 -2
  484. package/SVF-doxygen/html/html/search/enums_8.js +4 -4
  485. package/SVF-doxygen/html/html/search/enums_9.js +1 -1
  486. package/SVF-doxygen/html/html/search/enums_a.js +1 -2
  487. package/SVF-doxygen/html/html/search/enums_b.js +7 -7
  488. package/SVF-doxygen/html/html/search/enums_c.js +1 -1
  489. package/SVF-doxygen/html/html/search/enums_d.js +4 -4
  490. package/SVF-doxygen/html/html/search/enums_e.js +2 -2
  491. package/SVF-doxygen/html/html/search/enums_f.js +4 -4
  492. package/SVF-doxygen/html/html/search/enumvalues_0.js +14 -14
  493. package/SVF-doxygen/html/html/search/enumvalues_1.js +14 -14
  494. package/SVF-doxygen/html/html/search/enumvalues_10.js +35 -35
  495. package/SVF-doxygen/html/html/search/enumvalues_11.js +3 -3
  496. package/SVF-doxygen/html/html/search/enumvalues_12.js +10 -10
  497. package/SVF-doxygen/html/html/search/enumvalues_13.js +1 -1
  498. package/SVF-doxygen/html/html/search/enumvalues_14.js +1 -1
  499. package/SVF-doxygen/html/html/search/enumvalues_15.js +3 -3
  500. package/SVF-doxygen/html/html/search/enumvalues_2.js +36 -40
  501. package/SVF-doxygen/html/html/search/enumvalues_3.js +13 -13
  502. package/SVF-doxygen/html/html/search/enumvalues_4.js +2 -34
  503. package/SVF-doxygen/html/html/search/enumvalues_5.js +48 -48
  504. package/SVF-doxygen/html/html/search/enumvalues_6.js +6 -6
  505. package/SVF-doxygen/html/html/search/enumvalues_7.js +9 -9
  506. package/SVF-doxygen/html/html/search/enumvalues_8.js +23 -23
  507. package/SVF-doxygen/html/html/search/enumvalues_9.js +6 -6
  508. package/SVF-doxygen/html/html/search/enumvalues_a.js +15 -17
  509. package/SVF-doxygen/html/html/search/enumvalues_b.js +11 -11
  510. package/SVF-doxygen/html/html/search/enumvalues_c.js +5 -6
  511. package/SVF-doxygen/html/html/search/enumvalues_d.js +18 -18
  512. package/SVF-doxygen/html/html/search/enumvalues_e.js +9 -11
  513. package/SVF-doxygen/html/html/search/enumvalues_f.js +45 -45
  514. package/SVF-doxygen/html/html/search/files_0.js +13 -13
  515. package/SVF-doxygen/html/html/search/files_1.js +7 -7
  516. package/SVF-doxygen/html/html/search/files_10.js +8 -8
  517. package/SVF-doxygen/html/html/search/files_11.js +8 -8
  518. package/SVF-doxygen/html/html/search/files_12.js +2 -2
  519. package/SVF-doxygen/html/html/search/files_2.js +49 -49
  520. package/SVF-doxygen/html/html/search/files_3.js +14 -14
  521. package/SVF-doxygen/html/html/search/files_4.js +5 -4
  522. package/SVF-doxygen/html/html/search/files_5.js +13 -13
  523. package/SVF-doxygen/html/html/search/files_6.js +9 -9
  524. package/SVF-doxygen/html/html/search/files_7.js +14 -14
  525. package/SVF-doxygen/html/html/search/files_8.js +13 -13
  526. package/SVF-doxygen/html/html/search/files_9.js +18 -18
  527. package/SVF-doxygen/html/html/search/files_a.js +3 -3
  528. package/SVF-doxygen/html/html/search/files_b.js +2 -2
  529. package/SVF-doxygen/html/html/search/files_c.js +20 -20
  530. package/SVF-doxygen/html/html/search/files_d.js +4 -4
  531. package/SVF-doxygen/html/html/search/files_e.js +62 -62
  532. package/SVF-doxygen/html/html/search/files_f.js +8 -8
  533. package/SVF-doxygen/html/html/search/functions_0.js +6 -351
  534. package/SVF-doxygen/html/html/search/functions_1.js +348 -81
  535. package/SVF-doxygen/html/html/search/functions_10.js +139 -122
  536. package/SVF-doxygen/html/html/search/functions_11.js +126 -283
  537. package/SVF-doxygen/html/html/search/functions_12.js +273 -55
  538. package/SVF-doxygen/html/html/search/functions_13.js +56 -38
  539. package/SVF-doxygen/html/html/search/functions_14.js +38 -71
  540. package/SVF-doxygen/html/html/search/functions_15.js +71 -29
  541. package/SVF-doxygen/html/html/search/functions_16.js +29 -2
  542. package/SVF-doxygen/html/html/search/functions_17.js +2 -169
  543. package/SVF-doxygen/html/html/search/functions_18.html +30 -0
  544. package/SVF-doxygen/html/html/search/functions_18.js +172 -0
  545. package/SVF-doxygen/html/html/search/functions_2.js +82 -251
  546. package/SVF-doxygen/html/html/search/functions_3.js +251 -71
  547. package/SVF-doxygen/html/html/search/functions_4.js +71 -55
  548. package/SVF-doxygen/html/html/search/functions_5.js +51 -55
  549. package/SVF-doxygen/html/html/search/functions_6.js +58 -832
  550. package/SVF-doxygen/html/html/search/functions_7.js +816 -144
  551. package/SVF-doxygen/html/html/search/functions_8.js +143 -417
  552. package/SVF-doxygen/html/html/search/functions_9.js +425 -29
  553. package/SVF-doxygen/html/html/search/functions_a.js +30 -2
  554. package/SVF-doxygen/html/html/search/functions_b.js +2 -23
  555. package/SVF-doxygen/html/html/search/functions_c.js +24 -75
  556. package/SVF-doxygen/html/html/search/functions_d.js +77 -35
  557. package/SVF-doxygen/html/html/search/functions_e.js +34 -56
  558. package/SVF-doxygen/html/html/search/functions_f.js +56 -143
  559. package/SVF-doxygen/html/html/search/namespaces_0.js +1 -1
  560. package/SVF-doxygen/html/html/search/namespaces_1.js +7 -7
  561. package/SVF-doxygen/html/html/search/related_0.js +2 -2
  562. package/SVF-doxygen/html/html/search/related_1.js +1 -1
  563. package/SVF-doxygen/html/html/search/related_2.js +2 -2
  564. package/SVF-doxygen/html/html/search/related_3.js +2 -2
  565. package/SVF-doxygen/html/html/search/related_4.js +2 -2
  566. package/SVF-doxygen/html/html/search/related_5.js +1 -1
  567. package/SVF-doxygen/html/html/search/related_6.js +2 -2
  568. package/SVF-doxygen/html/html/search/related_7.js +4 -4
  569. package/SVF-doxygen/html/html/search/related_8.js +2 -2
  570. package/SVF-doxygen/html/html/search/related_9.js +4 -4
  571. package/SVF-doxygen/html/html/search/related_a.js +19 -19
  572. package/SVF-doxygen/html/html/search/related_b.js +4 -4
  573. package/SVF-doxygen/html/html/search/related_c.js +1 -1
  574. package/SVF-doxygen/html/html/search/related_d.js +11 -11
  575. package/SVF-doxygen/html/html/search/related_e.js +2 -2
  576. package/SVF-doxygen/html/html/search/related_f.js +2 -2
  577. package/SVF-doxygen/html/html/search/searchdata.js +1 -1
  578. package/SVF-doxygen/html/html/search/typedefs_0.js +18 -18
  579. package/SVF-doxygen/html/html/search/typedefs_1.js +25 -25
  580. package/SVF-doxygen/html/html/search/typedefs_10.js +60 -60
  581. package/SVF-doxygen/html/html/search/typedefs_11.js +13 -13
  582. package/SVF-doxygen/html/html/search/typedefs_12.js +11 -11
  583. package/SVF-doxygen/html/html/search/typedefs_13.js +35 -35
  584. package/SVF-doxygen/html/html/search/typedefs_14.js +8 -8
  585. package/SVF-doxygen/html/html/search/typedefs_2.js +126 -126
  586. package/SVF-doxygen/html/html/search/typedefs_3.js +39 -39
  587. package/SVF-doxygen/html/html/search/typedefs_4.js +16 -16
  588. package/SVF-doxygen/html/html/search/typedefs_5.js +41 -41
  589. package/SVF-doxygen/html/html/search/typedefs_6.js +52 -52
  590. package/SVF-doxygen/html/html/search/typedefs_7.js +40 -40
  591. package/SVF-doxygen/html/html/search/typedefs_8.js +1 -1
  592. package/SVF-doxygen/html/html/search/typedefs_9.js +6 -6
  593. package/SVF-doxygen/html/html/search/typedefs_a.js +29 -29
  594. package/SVF-doxygen/html/html/search/typedefs_b.js +29 -29
  595. package/SVF-doxygen/html/html/search/typedefs_c.js +40 -40
  596. package/SVF-doxygen/html/html/search/typedefs_d.js +15 -15
  597. package/SVF-doxygen/html/html/search/typedefs_e.js +52 -52
  598. package/SVF-doxygen/html/html/search/typedefs_f.js +14 -14
  599. package/SVF-doxygen/html/html/search/variables_0.js +147 -147
  600. package/SVF-doxygen/html/html/search/variables_1.js +75 -74
  601. package/SVF-doxygen/html/html/search/variables_10.js +97 -97
  602. package/SVF-doxygen/html/html/search/variables_11.js +46 -46
  603. package/SVF-doxygen/html/html/search/variables_12.js +92 -93
  604. package/SVF-doxygen/html/html/search/variables_13.js +75 -77
  605. package/SVF-doxygen/html/html/search/variables_14.js +14 -14
  606. package/SVF-doxygen/html/html/search/variables_15.js +48 -48
  607. package/SVF-doxygen/html/html/search/variables_16.js +9 -9
  608. package/SVF-doxygen/html/html/search/variables_17.js +1 -1
  609. package/SVF-doxygen/html/html/search/variables_18.js +2 -2
  610. package/SVF-doxygen/html/html/search/variables_2.js +34 -35
  611. package/SVF-doxygen/html/html/search/variables_3.js +141 -148
  612. package/SVF-doxygen/html/html/search/variables_4.js +55 -56
  613. package/SVF-doxygen/html/html/search/variables_5.js +38 -40
  614. package/SVF-doxygen/html/html/search/variables_6.js +66 -67
  615. package/SVF-doxygen/html/html/search/variables_7.js +33 -33
  616. package/SVF-doxygen/html/html/search/variables_8.js +7 -7
  617. package/SVF-doxygen/html/html/search/variables_9.js +77 -77
  618. package/SVF-doxygen/html/html/search/variables_a.js +4 -4
  619. package/SVF-doxygen/html/html/search/variables_b.js +10 -10
  620. package/SVF-doxygen/html/html/search/variables_c.js +45 -45
  621. package/SVF-doxygen/html/html/search/variables_d.js +56 -56
  622. package/SVF-doxygen/html/html/search/variables_e.js +123 -123
  623. package/SVF-doxygen/html/html/search/variables_f.js +30 -33
  624. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
  625. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +1 -1
  626. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__iterable.html +1 -1
  627. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__iterable_3_01T_00_01void__t_3_01decltype_07std_1_1begin_07std_1_1dec794949348c8e1e00603fd8633b6dd1f3.html +1 -1
  628. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__map.html +1 -1
  629. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__map_3_01std_1_1map_3_01Ts_8_8_8_01_4_01_4.html +1 -1
  630. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__map_3_01std_1_1unordered__map_3_01Ts_8_8_8_01_4_01_4.html +1 -1
  631. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__sequence__container.html +1 -1
  632. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__sequence__container_3_01std_1_1deque_3_01Ts_8_8_8_01_4_01_4.html +1 -1
  633. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__sequence__container_3_01std_1_1list_3_01Ts_8_8_8_01_4_01_4.html +1 -1
  634. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__sequence__container_3_01std_1_1vector_3_01Ts_8_8_8_01_4_01_4.html +1 -1
  635. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__set.html +1 -1
  636. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__set_3_01std_1_1set_3_01Ts_8_8_8_01_4_01_4.html +1 -1
  637. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__set_3_01std_1_1unordered__set_3_01Ts_8_8_8_01_4_01_4.html +1 -1
  638. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1make__void.html +2 -2
  639. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CallSite_01_4.html +7 -7
  640. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CxtStmt_01_4.html +1 -1
  641. package/SVF-doxygen/html/html/svf-ex_8cpp.html +3 -3
  642. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +4 -4
  643. package/SVF-doxygen/html/html/svf-llvm_2tools_2MTA_2MTAResultValidator_8h_source.html +9 -9
  644. package/SVF-doxygen/html/html/svf_2include_2MTA_2MTAResultValidator_8h_source.html +9 -9
  645. package/SVF-doxygen/html/html/wpa_8cpp.html +1 -1
  646. package/SVF-doxygen/html/html/wpa_8cpp_source.html +1 -1
  647. package/build.sh +1 -1
  648. package/package.json +1 -1
  649. package/svf/include/SVFIR/SVFModule.h +0 -1
  650. package/svf/include/SVFIR/SVFValue.h +7 -1
  651. package/svf/include/Util/ExtAPI.h +11 -457
  652. package/svf/include/Util/SVFUtil.h +7 -22
  653. package/svf/lib/SVFIR/SVFFileSystem.cpp +3 -1
  654. package/svf/lib/SVFIR/SVFValue.cpp +2 -2
  655. package/svf/lib/Util/ExtAPI.cpp +36 -595
  656. package/svf/lib/Util/Options.cpp +1 -1
  657. package/svf/lib/Util/SVFBugReport.cpp +0 -2
  658. package/svf-llvm/include/SVF-LLVM/LLVMModule.h +17 -0
  659. package/svf-llvm/include/SVF-LLVM/LLVMUtil.h +14 -1
  660. package/svf-llvm/include/SVF-LLVM/SVFIRBuilder.h +5 -14
  661. package/svf-llvm/lib/LLVMModule.cpp +157 -43
  662. package/svf-llvm/lib/LLVMUtil.cpp +121 -0
  663. package/svf-llvm/lib/SVFIRBuilder.cpp +7 -76
  664. package/svf-llvm/lib/SVFIRExtAPI.cpp +161 -536
  665. package/svf-llvm/lib/extapi.c +1348 -0
  666. package/svf/include/Util/ExtAPI.json +0 -5853
@@ -1,4 +1,4 @@
1
- //===- SVFIR.cpp -- External function IR of SVF ---------------------------------------------//
1
+ //===- SVFIRExtAPI.cpp -- External function IR of SVF ---------------------------------------------//
2
2
  //
3
3
  // SVF: Static Value-Flow Analysis
4
4
  //
@@ -28,31 +28,69 @@
28
28
  */
29
29
 
30
30
  #include "SVF-LLVM/SVFIRBuilder.h"
31
+ #include "Util/SVFUtil.h"
32
+ #include "SVF-LLVM/SymbolTableBuilder.h"
31
33
 
32
34
  using namespace std;
33
35
  using namespace SVF;
34
36
  using namespace SVFUtil;
37
+ using namespace LLVMUtil;
35
38
 
39
+ /*!
40
+ * Find the base type and the max possible offset of an object pointed to by (V).
41
+ */
42
+ const Type* SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value* V, std::vector<AccessPath> &fields, const Value* szValue)
43
+ {
44
+ assert(V);
45
+ const Value* value = getBaseValueForExtArg(V);
46
+ const Type* T = value->getType();
47
+ while (const PointerType *ptype = SVFUtil::dyn_cast<PointerType>(T))
48
+ T = getPtrElementType(ptype);
49
+
50
+ u32_t numOfElems = pag->getSymbolInfo()->getNumOfFlattenElements(LLVMModuleSet::getLLVMModuleSet()->getSVFType(T));
51
+ /// use user-specified size for this copy operation if the size is a constaint int
52
+ if(szValue && SVFUtil::isa<ConstantInt>(szValue))
53
+ {
54
+ numOfElems = (numOfElems > SVFUtil::cast<ConstantInt>(szValue)->getSExtValue()) ? SVFUtil::cast<ConstantInt>(szValue)->getSExtValue() : numOfElems;
55
+ }
56
+
57
+ LLVMContext& context = LLVMModuleSet::getLLVMModuleSet()->getContext();
58
+ for(u32_t ei = 0; ei < numOfElems; ei++)
59
+ {
60
+ AccessPath ls(ei);
61
+ // make a ConstantInt and create char for the content type due to byte-wise copy
62
+ const ConstantInt* offset = ConstantInt::get(context, llvm::APInt(32, ei));
63
+ const SVFValue* svfOffset = LLVMModuleSet::getLLVMModuleSet()->getSVFValue(offset);
64
+ if (!pag->getSymbolInfo()->hasValSym(svfOffset))
65
+ {
66
+ SymbolTableBuilder builder(pag->getSymbolInfo());
67
+ builder.collectSym(offset);
68
+ pag->addValNode(svfOffset, pag->getSymbolInfo()->getValSym(svfOffset));
69
+ }
70
+ ls.addOffsetVarAndGepTypePair(getPAG()->getGNode(getPAG()->getValueNode(svfOffset)), nullptr);
71
+ fields.push_back(ls);
72
+ }
73
+ return T;
74
+ }
36
75
 
37
76
  /*!
38
77
  * Add the load/store constraints and temp. nodes for the complex constraint
39
78
  * *D = *S (where D/S may point to structs).
40
79
  */
41
- void SVFIRBuilder::addComplexConsForExt(const SVFValue* D, const SVFValue* S, const SVFValue* szValue)
80
+ void SVFIRBuilder::addComplexConsForExt(Value *D, Value *S, const Value* szValue)
42
81
  {
43
82
  assert(D && S);
44
- NodeID vnD= pag->getValueNode(D), vnS= pag->getValueNode(S);
83
+ NodeID vnD= getValueNode(D), vnS= getValueNode(S);
45
84
  if(!vnD || !vnS)
46
85
  return;
47
86
 
48
87
  std::vector<AccessPath> fields;
49
88
 
50
89
  //Get the max possible size of the copy, unless it was provided.
51
- const SVFType* stype = pag->getTypeLocSetsMap(vnS).first;
52
- const SVFType* dtype = pag->getTypeLocSetsMap(vnD).first;
53
- std::vector<AccessPath> srcFields = pag->getTypeLocSetsMap(vnS).second;
54
- std::vector<AccessPath> dstFields = pag->getTypeLocSetsMap(vnD).second;
55
-
90
+ std::vector<AccessPath> srcFields;
91
+ std::vector<AccessPath> dstFields;
92
+ const Type* stype = getBaseTypeAndFlattenedFields(S, srcFields, szValue);
93
+ const Type* dtype = getBaseTypeAndFlattenedFields(D, dstFields, szValue);
56
94
  if(srcFields.size() > dstFields.size())
57
95
  fields = dstFields;
58
96
  else
@@ -60,13 +98,8 @@ void SVFIRBuilder::addComplexConsForExt(const SVFValue* D, const SVFValue* S, co
60
98
 
61
99
  /// If sz is 0, we will add edges for all fields.
62
100
  u32_t sz = fields.size();
63
- if (szValue && SVFUtil::dyn_cast<SVFConstantInt>(szValue))
64
- {
65
- const SVFConstantInt* arg2 = SVFUtil::dyn_cast<SVFConstantInt>(szValue);
66
- sz = (fields.size() > static_cast<u32_t>(arg2->getSExtValue())) ? arg2->getSExtValue() : fields.size();
67
- }
68
101
 
69
- if (fields.size() == 1 && (SVFUtil::isa<SVFConstantData>(D) || SVFUtil::isa<SVFConstantData>(S)))
102
+ if (fields.size() == 1 && (LLVMUtil::isConstDataOrAggData(D) || LLVMUtil::isConstDataOrAggData(S)))
70
103
  {
71
104
  NodeID dummy = pag->addDummyValNode();
72
105
  addLoadEdge(vnD,dummy);
@@ -77,9 +110,10 @@ void SVFIRBuilder::addComplexConsForExt(const SVFValue* D, const SVFValue* S, co
77
110
  //For each field (i), add (Ti = *S + i) and (*D + i = Ti).
78
111
  for (u32_t index = 0; index < sz; index++)
79
112
  {
80
- const SVFType* dElementType = pag->getSymbolInfo()->getFlatternedElemType(dtype,
113
+ LLVMModuleSet* llvmmodule = LLVMModuleSet::getLLVMModuleSet();
114
+ const SVFType* dElementType = pag->getSymbolInfo()->getFlatternedElemType(llvmmodule->getSVFType(dtype),
81
115
  fields[index].getConstantFieldIdx());
82
- const SVFType* sElementType = pag->getSymbolInfo()->getFlatternedElemType(stype,
116
+ const SVFType* sElementType = pag->getSymbolInfo()->getFlatternedElemType(llvmmodule->getSVFType(stype),
83
117
  fields[index].getConstantFieldIdx());
84
118
  NodeID dField = getGepValVar(D,fields[index],dElementType);
85
119
  NodeID sField = getGepValVar(S,fields[index],sElementType);
@@ -89,427 +123,102 @@ void SVFIRBuilder::addComplexConsForExt(const SVFValue* D, const SVFValue* S, co
89
123
  }
90
124
  }
91
125
 
92
- NodeID SVFIRBuilder::getExtID(ExtAPI::OperationType operationType, const std::string &s, const SVFCallInst* svfCall)
126
+ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCallee)
93
127
  {
94
- s32_t nodeIDType = ExtAPI::getExtAPI()->getNodeIDType(s);
128
+ const SVFInstruction* svfInst = LLVMModuleSet::getLLVMModuleSet()->getSVFInstruction(cs);
129
+ const SVFCallInst* svfCall = SVFUtil::cast<SVFCallInst>(svfInst);
95
130
 
96
- // return value >= 0 is an argument node
97
- if (nodeIDType >= 0)
98
- {
99
- assert(svfCall->arg_size() > (u32_t) nodeIDType && "Argument out of bounds!");
100
- if (operationType == ExtAPI::OperationType::Memcpy_like || operationType == ExtAPI::OperationType::Memset_like)
101
- return nodeIDType;
102
- else
103
- return pag->getValueNode(svfCall->getArgOperand(nodeIDType));
104
- }
105
- // return value = -1 is an inst node
106
- else if (nodeIDType == -1)
107
- return pag->getValueNode(svfCall);
108
- // return value = -2 is a Dummy node
109
- else if (nodeIDType == -2)
110
- return pag->addDummyValNode();
111
- // return value = -3 is an object node
112
- else if (nodeIDType == -3)
113
- {
114
- assert(svfCall->getType()->isPointerTy() && "The operand should be a pointer type!");
115
- NodeID objId;
116
- // Indirect call
117
- if (getCallee(svfCall) == nullptr)
118
- objId = pag->addDummyObjNode(svfCall->getType());
119
- else // Direct call
120
- objId = pag->getObjectNode(svfCall);
121
- return objId;
122
- }
123
- // return value = -4 is a nullptr node
124
- else if (nodeIDType == -4)
125
- return pag->getNullPtr();
126
- // return value = -5 is an offset
127
- else if (nodeIDType == -5)
128
- {
129
- for (char const &c : s)
130
- {
131
- if (std::isdigit(c) == 0)
132
- assert(false && "Invalid offset!");
133
- }
134
- return atoi(s.c_str());
135
- }
136
- // return value = -6 is an illegal operand format
137
- else
131
+ if (isHeapAllocExtCallViaRet(svfCall) || isStaticExtCall(svfCall))
138
132
  {
139
- assert(false && "The operand format of function operation is illegal!");
140
- abort();
133
+ NodeID val = pag->getValueNode(svfInst);
134
+ NodeID obj = pag->getObjectNode(svfInst);
135
+ addAddrEdge(obj, val);
141
136
  }
142
- }
143
-
144
- void SVFIRBuilder::parseAtomaticOp(SVF::ExtAPI::Operand &atomaticOp, const SVFCallInst* svfCall, std::map<std::string, NodeID> &nodeIDMap)
145
- {
146
- // Skip Rb_tree operation, which is handled in extFuncAtomaticOperation()
147
- if (atomaticOp.getType() == ExtAPI::OperationType::Rb_tree_ops)
148
- return;
149
- // Get src and dst node ID
150
- if (!atomaticOp.getSrcValue().empty())
137
+ else if (isHeapAllocExtCallViaArg(svfCall))
151
138
  {
152
- const std::string s = atomaticOp.getSrcValue();
153
- if (nodeIDMap.find(s) != nodeIDMap.end())
154
- atomaticOp.setSrcID(nodeIDMap[s]);
155
- else
139
+ u32_t arg_pos = getHeapAllocHoldingArgPosition(svfCallee);
140
+ const SVFValue* arg = svfCall->getArgOperand(arg_pos);
141
+ if (arg->getType()->isPointerTy())
156
142
  {
157
- NodeID srcId = getExtID(atomaticOp.getType(), atomaticOp.getSrcValue(), svfCall);
158
- atomaticOp.setSrcID(srcId);
159
- nodeIDMap[s] = srcId;
143
+ NodeID vnArg = pag->getValueNode(arg);
144
+ NodeID dummy = pag->addDummyValNode();
145
+ NodeID obj = pag->addDummyObjNode(arg->getType());
146
+ if (vnArg && dummy && obj)
147
+ {
148
+ addAddrEdge(obj, dummy);
149
+ addStoreEdge(dummy, vnArg);
150
+ }
160
151
  }
161
- }
162
- else
163
- assert(false && "The 'src' operand cannot be empty.");
164
-
165
- if (!atomaticOp.getDstValue().empty())
166
- {
167
- const std::string s = atomaticOp.getDstValue();
168
- if (nodeIDMap.find(s) != nodeIDMap.end())
169
- atomaticOp.setDstID(nodeIDMap[s]);
170
152
  else
171
153
  {
172
- NodeID dstId = getExtID(atomaticOp.getType(), atomaticOp.getDstValue(), svfCall);
173
- atomaticOp.setDstID(dstId);
174
- nodeIDMap[s] = dstId;
154
+ writeWrnMsg("Arg receiving new object must be pointer type");
175
155
  }
176
156
  }
177
- else
178
- assert(false && "The 'dst' operand cannot be empty.");
179
-
180
- // Get offset or size
181
- if (!atomaticOp.getOffsetOrSizeStr().empty())
157
+ else if (isMemcpyExtFun(svfCallee))
182
158
  {
183
- std::string s = atomaticOp.getOffsetOrSizeStr();
184
- if (nodeIDMap.find(s) != nodeIDMap.end())
185
- atomaticOp.setOffsetOrSize(nodeIDMap[s]);
159
+ if(svfCallee->getName().find("iconv") != std::string::npos)
160
+ addComplexConsForExt(cs->getArgOperand(3), cs->getArgOperand(1), nullptr);
161
+ else if(svfCallee->getName().find("bcopy") != std::string::npos)
162
+ addComplexConsForExt(cs->getArgOperand(1), cs->getArgOperand(0), cs->getArgOperand(2));
163
+ if(svfCall->arg_size() == 3)
164
+ addComplexConsForExt(cs->getArgOperand(0), cs->getArgOperand(1), cs->getArgOperand(2));
186
165
  else
187
- {
188
- NodeID offsetOrSize = getExtID(atomaticOp.getType(), atomaticOp.getOffsetOrSizeStr(), svfCall);
189
- atomaticOp.setOffsetOrSize(offsetOrSize);
190
- nodeIDMap[s] = offsetOrSize;
191
- }
192
- }
193
- }
194
-
195
- void SVFIRBuilder::parseExtFunctionOps(ExtAPI::ExtFunctionOps &extFunctionOps, const SVFCallInst* svfCall)
196
- {
197
- // CallStmt operation
198
- if (extFunctionOps.getCallStmtNum() != 0)
199
- handleExtCallStat(extFunctionOps, svfCall);
200
- // Record all dummy nodes
201
- std::map<std::string, NodeID> nodeIDMap;
202
- for (ExtAPI::ExtOperation& extOperation : extFunctionOps.getOperations())
203
- {
204
- // CondStmt operation
205
- if(extOperation.isConOp())
206
- {
207
- for (ExtAPI::Operand &atomaticOp : extOperation.getTrueBranchOperands())
208
- parseAtomaticOp(atomaticOp, svfCall, nodeIDMap);
209
- for (ExtAPI::Operand &atomaticOp : extOperation.getFalseBranchOperands())
210
- parseAtomaticOp(atomaticOp, svfCall, nodeIDMap);
211
- }
212
- // General operation, e.g., "AddrStmt", "CopyStmt", ....
213
- else if (!extOperation.isCallOp())
214
- parseAtomaticOp(extOperation.getBasicOp(), svfCall, nodeIDMap);
215
- }
216
- }
217
-
218
- SVFCallInst* SVFIRBuilder::addSVFExtCallInst(const SVFCallInst* svfInst, SVFBasicBlock* svfBB, const SVFFunction* svfCaller, const SVFFunction* svfCallee)
219
- {
220
- SVFCallInst* svfCall = new SVFCallInst(svfCallee->getFunctionType(), svfBB, false, false);
221
- svfCall->setName("ext_inst");
222
- LLVMModuleSet::getLLVMModuleSet()->SVFValue2LLVMValue[svfCall] = nullptr;
223
- svfCall->setCalledOperand(svfCallee);
224
- setCurrentLocation(svfCall, svfBB);
225
- SymbolTableInfo::ValueToIDMapTy::iterator iter = pag->getSymbolInfo()->valSyms().find(svfCall);
226
- if (iter == pag->getSymbolInfo()->valSyms().end())
227
- {
228
- SymID id = NodeIDAllocator::get()->allocateValueId();
229
- pag->getSymbolInfo()->valSyms().insert(std::make_pair(svfCall, id));
230
- DBOUT(DMemModel, outs() << "create a new value sym " << id << "\n");
231
- pag->addValNode(svfCall, id);
232
- }
233
- svfCall->setName(svfCall->getName() + "_" + std::to_string(pag->getValueNode(svfCall)));
234
-
235
- for(u32_t i = 0; i < svfCallee->arg_size(); i++)
236
- {
237
- SVFInstruction* svfArg = addSVFExtInst("ext_inst", svfInst, svfBB, ExtAPI::OperationType::Other, svfCallee->getArg(i)->getType());
238
- svfArg->setName(svfArg->getName() + "_" + std::to_string(pag->getValueNode(svfArg)));
239
- svfCall->addArgument(svfArg);
166
+ addComplexConsForExt(cs->getArgOperand(0), cs->getArgOperand(1), nullptr);
167
+ if(SVFUtil::isa<PointerType>(cs->getType()))
168
+ addCopyEdge(getValueNode(cs->getArgOperand(0)), getValueNode(cs));
240
169
  }
241
-
242
- svfBB->addInstruction(svfCall);
243
-
244
- CallICFGNode* callBlockNode = pag->getICFG()->getCallICFGNode(svfCall);
245
- pag->addCallSite(callBlockNode);
246
-
247
- if (!svfCallee->isNotRetFunction() && !isExtCall(svfCallee))
248
- {
249
- NodeID srcret = getReturnNode(svfCallee);
250
- NodeID dstrec = pag->getValueNode(svfCall);
251
- CallICFGNode* callICFGNode = pag->getICFG()->getCallICFGNode(svfCall);
252
- FunExitICFGNode* exitICFGNode = pag->getICFG()->getFunExitICFGNode(svfCallee);
253
- RetICFGNode* retBlockNode = pag->getICFG()->getRetICFGNode(svfCall);
254
- addRetEdge(srcret, dstrec,callICFGNode, exitICFGNode);
255
- pag->addCallSiteRets(retBlockNode,pag->getGNode(pag->getValueNode(svfCall)));
256
- }
257
-
258
- return svfCall;
259
- }
260
-
261
- void SVFIRBuilder::addSVFExtRetInst(SVFCallInst* svfCall, SVFBasicBlock* svfBB, SVFFunction* svfCaller)
262
- {
263
- SVFInstruction* retInst = addSVFExtInst("ext_inst", svfCall, svfBB, ExtAPI::OperationType::Return, nullptr);
264
- retInst->setName(retInst->getName() + "_" + std::to_string(pag->getValueNode(retInst)));
265
- setCurrentLocation(retInst, svfBB);
266
-
267
- NodeID rnF = getReturnNode(svfCaller);
268
- NodeID vnS = pag->getValueNode(svfCall);
269
- const ICFGNode* icfgNode = pag->getICFG()->getICFGNode(retInst);
270
- //vnS may be null if src is a null ptr
271
- addPhiStmt(rnF,vnS,icfgNode);
272
- }
273
-
274
- SVFInstruction* SVFIRBuilder::addSVFExtInst(const std::string& instName, const SVFCallInst* svfInst, SVFBasicBlock* svfBB, SVF::ExtAPI::OperationType opType, const SVFType* svfType)
275
- {
276
- // Get new SVFInstruction type;
277
- const SVFType* ptType = nullptr;
278
- if (svfType != nullptr)
279
- ptType = svfType;
280
- else
170
+ else if(isMemsetExtFun(svfCallee))
281
171
  {
282
- if (opType == ExtAPI::OperationType::Addr
283
- || opType == ExtAPI::OperationType::Copy
284
- || opType == ExtAPI::OperationType::Load
285
- || opType == ExtAPI::OperationType::Gep)
172
+ // this is for memset(void *str, int c, size_t n)
173
+ // which copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str
174
+ std::vector<AccessPath> dstFields;
175
+ const Type *dtype = getBaseTypeAndFlattenedFields(cs->getArgOperand(0), dstFields, cs->getArgOperand(2));
176
+ u32_t sz = dstFields.size();
177
+ //For each field (i), add store edge *(arg0 + i) = arg1
178
+ for (u32_t index = 0; index < sz; index++)
286
179
  {
287
- for (u32_t i = 0; i < svfInst->arg_size(); ++i)
288
- if (svfInst->getArgOperand(i)->getType()->isPointerTy())
289
- {
290
- ptType = svfInst->getArgOperand(i)->getType();
291
- break;
292
- }
180
+ LLVMModuleSet* llvmmodule = LLVMModuleSet::getLLVMModuleSet();
181
+ const SVFType* dElementType = pag->getSymbolInfo()->getFlatternedElemType(llvmmodule->getSVFType(dtype), dstFields[index].getConstantFieldIdx());
182
+ NodeID dField = getGepValVar(cs->getArgOperand(0), dstFields[index], dElementType);
183
+ addStoreEdge(getValueNode(cs->getArgOperand(1)),dField);
293
184
  }
294
- else
295
- ptType = svfInst->getParent()->getType();
185
+ if(SVFUtil::isa<PointerType>(cs->getType()))
186
+ addCopyEdge(getValueNode(cs->getArgOperand(0)), getValueNode(cs));
296
187
  }
297
-
298
- assert(ptType != nullptr && "At least one argument of an external call is of pointer type!");
299
- SVFInstruction* inst = new SVFInstruction(ptType, svfBB, false, false);
300
- inst->setName(instName);
301
- LLVMModuleSet::getLLVMModuleSet()->SVFValue2LLVMValue[inst] = nullptr;
302
- svfBB->addInstruction(inst);
303
- SymbolTableInfo::ValueToIDMapTy::iterator iter = pag->getSymbolInfo()->valSyms().find(inst);
304
- if (iter == pag->getSymbolInfo()->valSyms().end())
188
+ else if (svfCallee->getName().find("_ZNSt5arrayIPK1ALm2EE4backEv") != std::string::npos)
305
189
  {
306
- SymID id = NodeIDAllocator::get()->allocateValueId();
307
- pag->getSymbolInfo()->valSyms().insert(std::make_pair(inst, id));
308
- DBOUT(DMemModel, outs() << "create a new value sym " << id << "\n");
309
- pag->addValNode(inst, id);
310
- }
311
- inst->setName(inst->getName() + "_" + std::to_string(pag->getValueNode(inst)));
312
- return inst;
313
- }
314
-
315
- SVFBasicBlock* SVFIRBuilder::extFuncInitialization(const SVFCallInst* svfInst, SVFFunction* svfCaller)
316
- {
317
- // Initialization, linking actual parameters with formal parameters,
318
- // adding basic blocks for external functions,
319
- // and creating return edges (if the external function has a return value)
320
- CallICFGNode* callSiteICFGNode = pag->getICFG()->getCallICFGNode(svfInst);
321
- FunEntryICFGNode* funEntryICFGNode = pag->getICFG()->getFunEntryICFGNode(svfCaller);
322
- FunExitICFGNode* funExitICFGNode = pag->getICFG()->getFunExitICFGNode(svfCaller);
323
- for(u32_t i = 0; i < svfCaller->arg_size(); i++)
324
- {
325
- const SVFValue *AA = svfInst->getArgOperand(i);
326
- const SVFValue *FA = svfCaller->getArg(i);
327
- NodeID srcAA = pag->getValueNode(AA);
328
- NodeID dstFA = pag->getValueNode(FA);
329
- addCallEdge(srcAA, dstFA, callSiteICFGNode, funEntryICFGNode);
330
- pag->addFunArgs(svfCaller,pag->getGNode(dstFA));
190
+ NodeID dummy = pag->addDummyValNode();
191
+ AccessPath ap1(0);
192
+ addNormalGepEdge(getValueNode(cs->getArgOperand(0)), dummy, ap1);
193
+ AccessPath ap2(0);
194
+ addNormalGepEdge(dummy, getValueNode(cs), ap2);
331
195
  }
332
-
333
- SVFBasicBlock* svfBB = new SVFBasicBlock(svfInst->getParent()->getType(), svfCaller);
334
- svfBB->setName("ext_bb");
335
- LLVMModuleSet::getLLVMModuleSet()->SVFValue2LLVMValue[svfBB] = nullptr;
336
-
337
- if (!svfCaller->isNotRetFunction())
196
+ else if(svfCallee->getName().compare("dlsym") == 0)
338
197
  {
339
- NodeID srcret = getReturnNode(svfCaller);
340
- NodeID dstrec = pag->getValueNode(svfInst);
341
- addRetEdge(srcret, dstrec,callSiteICFGNode, funExitICFGNode);
342
- pag->addFunRet(svfCaller,pag->getGNode(srcret));
343
- }
344
- return svfBB;
345
- }
198
+ const Value* src = cs->getArgOperand(1);
199
+ if(const GetElementPtrInst* gep = SVFUtil::dyn_cast<GetElementPtrInst>(src))
200
+ src = stripConstantCasts(gep->getPointerOperand());
346
201
 
347
- void SVFIRBuilder::handleExtCallStat(ExtAPI::ExtFunctionOps &extFunctionOps, const SVFCallInst* svfInst)
348
- {
349
- SVFFunction* svfCaller = const_cast<SVFFunction *>(svfModule->getSVFFunction(svfInst->getCalledFunction()->getName()));
350
- SVFBasicBlock* svfBB = extFuncInitialization(svfInst, svfCaller);
351
- // Map an operand to its new created SVFInstruction
352
- std::map<std::string, SVFValue*> operandToSVFValueMap;
353
- for (ExtAPI::ExtOperation& extOperation : extFunctionOps.getOperations())
354
- {
355
- if (extOperation.isCallOp())
202
+ auto getHookFn = [](const Value* src)->const Function*
356
203
  {
357
- // To create a CallInst for the callee
358
- const SVFFunction* svfCallee = svfModule->getSVFFunction(extOperation.getCalleeName());
359
- SVFCallInst* svfCall = addSVFExtCallInst(svfInst, svfBB, svfCaller, svfCallee);
360
- setCurrentLocation(svfCall, getCurrentBB());
361
- operandToSVFValueMap[svfCallee->getName()] = svfCall;
362
- CallICFGNode* callBlockNode = pag->getICFG()->getCallICFGNode(svfCall);
204
+ if (!SVFUtil::isa<GlobalVariable>(src))
205
+ return nullptr;
363
206
 
364
- assert(extOperation.getCalleeOperands().size() >= svfCallee->arg_size()
365
- && "Number of arguments set in CallStmt in ExtAPI.json is inconsistent with the number of arguments required by the Callee?");
366
- // To parse the operations contained in ‘CallStmt’, obtain the NodeID, and add the callEdge
367
- for (ExtAPI::Operand &operand : extOperation.getCalleeOperands())
368
- {
369
- std::string src = operand.getSrcValue();
370
- std::string dst = operand.getDstValue();
371
- // ReturnStmt
372
- if (operand.getType() == ExtAPI::OperationType::Return && !svfCaller->isNotRetFunction())
373
- {
374
- addSVFExtRetInst(svfCall, svfBB, svfCaller);
375
- continue;
376
- }
207
+ auto *glob = SVFUtil::cast<GlobalVariable>(src);
208
+ if (!glob->hasInitializer() || !SVFUtil::isa<ConstantDataArray>(glob->getInitializer()))
209
+ return nullptr;
377
210
 
378
- auto getCallStmtOperands = [](const std::string& str) -> std::pair<std::string, std::string>
379
- {
380
- size_t pos = str.find('_');
381
- assert(pos != std::string::npos && "The operand format in CallStmt is incorrect! It should be either 'funName_Argi' or 'funName_Ret'!");
382
- return std::make_pair(str.substr(0, pos), str.substr(pos + 1));
383
- };
384
- // 'src' operand
385
- if (src.find('_') != std::string::npos)
386
- {
387
- std::pair<std::string, std::string> srcRet = getCallStmtOperands(src);
388
- s32_t argPos = ExtAPI::getExtAPI()->getNodeIDType(srcRet.second);
389
- // operand like "caller_Argi"
390
- if (svfCaller->getName() == srcRet.first)
391
- {
392
- assert(argPos >= 0 && static_cast<u32_t>(argPos) < svfCaller->arg_size() && "The argument index is out of bounds in CallStmt?");
393
- operand.setSrcID(pag->getValueNode(svfCaller->getArg(argPos)));
394
- }
395
- // operand like "callee_Ret"
396
- else
397
- {
398
- assert(argPos == -1 && "The operand format in CallStmt is incorrect! It should be either 'funName_Argi' or 'funName_Ret'!");
399
- assert(operandToSVFValueMap.find(srcRet.first) != operandToSVFValueMap.end() && "No created SVFCallInst in external functions?");
400
- operand.setSrcID(pag->getValueNode(operandToSVFValueMap[srcRet.first]));
401
- }
402
- }
403
- // operand like self-defined "x", which should be created beforehand
404
- else
405
- {
406
- assert(operandToSVFValueMap.find(src) != operandToSVFValueMap.end()
407
- && "Cannot find manual create ext inst, incorrect invocation order for external functions?");
408
- operand.setSrcID(pag->getValueNode(operandToSVFValueMap[src]));
409
- }
410
- // 'dst' operand
411
- if (dst.find('_') != std::string::npos)
412
- {
413
- // operand like "callee_Argi"
414
- std::pair<std::string, std::string> dstRet = getCallStmtOperands(dst);
415
- assert(svfCallee->getName() == dstRet.first && "The operand format of 'dst' in external CallStmt is illegal!");
416
- s32_t argPos = ExtAPI::getExtAPI()->getNodeIDType(dstRet.second);
417
- assert(argPos >= 0 && static_cast<u32_t>(argPos) < svfCallee->arg_size() && "The argument index is out of bounds of callee in CallStmt?");
418
- // Create an new SVFInstruction for "callee_Argi".
419
- if(operandToSVFValueMap.find(dst) == operandToSVFValueMap.end())
420
- {
421
- SVFInstruction* inst = addSVFExtInst("ext_inst", svfInst, svfBB, operand.getType(), nullptr);
422
- operand.setDstID(pag->getValueNode(inst));
423
- operandToSVFValueMap[dst] = inst;
424
- pag->addCallSiteArgs(callBlockNode,pag->getGNode(pag->getValueNode(inst)));
425
- }
426
- CallICFGNode* icfgNode = pag->getICFG()->getCallICFGNode(svfCall);
427
- FunEntryICFGNode* entry = pag->getICFG()->getFunEntryICFGNode(svfCallee);
428
- addCallEdge(operand.getDstID(), pag->getValueNode(svfCallee->getArg(argPos)), icfgNode, entry);
429
- }
430
- else
431
- {
432
- // operand like self-defined "x", if there are no SVFInstructions for 'x', create an new SVFInstruction.
433
- SVFInstruction* inst = addSVFExtInst(dst, svfInst, svfBB, operand.getType(), nullptr);
434
- operand.setDstID(pag->getValueNode(inst));
435
- operandToSVFValueMap[dst] = inst;
436
- }
437
- }
438
- }
439
- }
440
- svfCaller->addBasicBlock(svfBB);
441
- }
211
+ auto *constarray = SVFUtil::cast<ConstantDataArray>(glob->getInitializer());
212
+ return LLVMUtil::getProgFunction(constarray->getAsCString().str());
213
+ };
442
214
 
443
- void SVFIRBuilder::extFuncAtomaticOperation(ExtAPI::Operand& atomicOp, const SVFCallInst* svfCall)
444
- {
445
- if (atomicOp.getType() == ExtAPI::OperationType::Addr)
446
- {
447
- if (!atomicOp.getSrcValue().empty() && !atomicOp.getDstValue().empty())
448
- addAddrEdge(atomicOp.getSrcID(), atomicOp.getDstID());
449
- else
450
- writeWrnMsg("We need two valid NodeIDs to add an Addr edge");
451
- }
452
- else if (atomicOp.getType() == ExtAPI::OperationType::Copy)
453
- {
454
- if (!atomicOp.getSrcValue().empty() && !atomicOp.getDstValue().empty())
455
- addCopyEdge(atomicOp.getSrcID(), atomicOp.getDstID());
456
- else
457
- writeWrnMsg("We need two valid NodeIDs to add a Copy edge");
458
- }
459
- else if (atomicOp.getType() == ExtAPI::OperationType::Load)
460
- {
461
- if (!atomicOp.getSrcValue().empty() && !atomicOp.getDstValue().empty())
462
- addLoadEdge(atomicOp.getSrcID(), atomicOp.getDstID());
463
- else
464
- writeWrnMsg("We need two valid NodeIDs to add a Load edge");
465
- }
466
- else if (atomicOp.getType() == ExtAPI::OperationType::Store)
467
- {
468
- if (!atomicOp.getSrcValue().empty() && !atomicOp.getDstValue().empty())
469
- addStoreEdge(atomicOp.getSrcID(), atomicOp.getDstID());
470
- else
471
- writeWrnMsg("We need two valid NodeIDs to add a Store edge");
472
- }
473
- else if (atomicOp.getType() == ExtAPI::OperationType::Gep)
474
- {
475
- if (!atomicOp.getSrcValue().empty() && !atomicOp.getDstValue().empty() && !atomicOp.getOffsetOrSizeStr().empty())
215
+ if (const Function *fn = getHookFn(src))
476
216
  {
477
- AccessPath ap(atomicOp.getOffsetOrSize());
478
- addNormalGepEdge(atomicOp.getSrcID(), atomicOp.getDstID(), ap);
217
+ NodeID srcNode = getValueNode(fn);
218
+ addCopyEdge(srcNode, getValueNode(cs));
479
219
  }
480
- else
481
- writeWrnMsg("We need two valid NodeIDs and an offset to add a Gep edge");
482
220
  }
483
- else if (atomicOp.getType() == ExtAPI::OperationType::Return)
484
- return;
485
- else if (atomicOp.getType() == ExtAPI::OperationType::Memset_like)
486
- {
487
- // this is for memset(void *str, int c, size_t n)
488
- // which copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str
489
- // const SVFConstantInt* arg2 = SVFUtil::dyn_cast<SVFConstantInt>(svfCall->getArgOperand(op.getOperands()[2]));
490
- NodeID argId = pag->getValueNode(svfCall->getArgOperand(0));
491
- std::vector<AccessPath> dstFields = pag->getTypeLocSetsMap(argId).second;
492
- u32_t sz = dstFields.size();
493
- if (const SVFConstantInt* arg2 = SVFUtil::dyn_cast<SVFConstantInt>(svfCall->getArgOperand(2)))
494
- sz = (dstFields.size() > static_cast<u32_t>(arg2->getSExtValue())) ? arg2->getSExtValue() : dstFields.size();
495
- //For each field (i), add store edge *(arg0 + i) = arg1
496
- for (u32_t index = 0; index < sz; index++)
497
- {
498
- const SVFType* dElementType = pag->getSymbolInfo()->getFlatternedElemType(pag->getTypeLocSetsMap(argId).first, dstFields[index].getConstantFieldIdx());
499
- NodeID dField = getGepValVar(svfCall->getArgOperand(0), dstFields[index], dElementType);
500
- addStoreEdge(pag->getValueNode(svfCall->getArgOperand(1)),dField);
501
- }
502
- if(svfCall->getType()->isPointerTy())
503
- addCopyEdge(pag->getValueNode(svfCall->getArgOperand(0)), pag->getValueNode(svfCall));
504
- }
505
- else if (atomicOp.getType() == ExtAPI::OperationType::Memcpy_like)
506
- {
507
- if(svfCall->arg_size() == 3)
508
- addComplexConsForExt(svfCall->getArgOperand(0), svfCall->getArgOperand(1), svfCall->getArgOperand(2));
509
- else
510
- addComplexConsForExt(svfCall->getArgOperand(0), svfCall->getArgOperand(1), nullptr);
511
- }
512
- else if (atomicOp.getType() == ExtAPI::OperationType::Rb_tree_ops)
221
+ else if(svfCallee->getName().find("_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_") != std::string::npos)
513
222
  {
514
223
  assert(svfCall->arg_size() == 4 && "_Rb_tree_insert_and_rebalance should have 4 arguments.\n");
515
224
 
@@ -529,155 +238,71 @@ void SVFIRBuilder::extFuncAtomaticOperation(ExtAPI::Operand& atomicOp, const SVF
529
238
  break;
530
239
  const SVFType* elementType = pag->getSymbolInfo()->getFlatternedElemType(pag->getTypeLocSetsMap(vnArg3).first,
531
240
  fields[i].getConstantFieldIdx());
532
- NodeID vnD = getGepValVar(svfCall->getArgOperand(3), fields[i], elementType);
241
+ NodeID vnD = getGepValVar(cs->getArgOperand(3), fields[i], elementType);
533
242
  NodeID vnS = pag->getValueNode(svfCall->getArgOperand(1));
534
243
  if(vnD && vnS)
535
244
  addStoreEdge(vnS,vnD);
536
245
  }
537
246
  }
538
- // default
539
- // illegal function operation of external function
540
- else
541
- {
542
- assert(false && "new type of SVFStmt for external calls?");
543
- }
544
- }
545
-
546
- /*!
547
- * Handle external calls
548
- */
549
- void SVFIRBuilder::handleExtCall(const SVFInstruction* svfInst, const SVFFunction* svfCallee)
550
- {
551
- const SVFCallInst* svfCall = SVFUtil::cast<SVFCallInst>(svfInst);
552
247
 
553
- if (isHeapAllocOrStaticExtCall(svfInst))
248
+ if (isThreadForkCall(svfInst))
554
249
  {
555
- // case 1: ret = new obj
556
- if (isHeapAllocExtCallViaRet(svfInst) || isStaticExtCall(svfInst))
557
- {
558
- NodeID val = pag->getValueNode(svfInst);
559
- NodeID obj = pag->getObjectNode(svfInst);
560
- addAddrEdge(obj, val);
561
- }
562
- // case 2: *arg = new obj
563
- else
250
+ if (const SVFFunction* forkedFun = SVFUtil::dyn_cast<SVFFunction>(getForkedFun(svfInst)))
564
251
  {
565
- assert(isHeapAllocExtCallViaArg(svfInst) && "Must be heap alloc call via arg.");
566
- u32_t arg_pos = getHeapAllocHoldingArgPosition(svfCallee);
567
- const SVFValue* arg = svfCall->getArgOperand(arg_pos);
568
- if (arg->getType()->isPointerTy())
252
+ forkedFun = forkedFun->getDefFunForMultipleModule();
253
+ const SVFValue* actualParm = getActualParmAtForkSite(svfInst);
254
+ /// pthread_create has 1 arg.
255
+ /// apr_thread_create has 2 arg.
256
+ assert((forkedFun->arg_size() <= 2) && "Size of formal parameter of start routine should be one");
257
+ if (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)
569
258
  {
570
- NodeID vnArg = pag->getValueNode(arg);
571
- NodeID dummy = pag->addDummyValNode();
572
- NodeID obj = pag->addDummyObjNode(arg->getType());
573
- if (vnArg && dummy && obj)
259
+ const SVFArgument* formalParm = forkedFun->getArg(0);
260
+ /// Connect actual parameter to formal parameter of the start routine
261
+ if (actualParm->getType()->isPointerTy() && formalParm->getType()->isPointerTy())
574
262
  {
575
- addAddrEdge(obj, dummy);
576
- addStoreEdge(dummy, vnArg);
263
+ CallICFGNode *icfgNode = pag->getICFG()->getCallICFGNode(svfInst);
264
+ FunEntryICFGNode *entry = pag->getICFG()->getFunEntryICFGNode(forkedFun);
265
+ addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm), icfgNode, entry);
577
266
  }
578
267
  }
579
- else
580
- {
581
- writeWrnMsg("Arg receiving new object must be pointer type");
582
- }
583
268
  }
584
- }
585
- else
586
- {
587
- if (isExtCall(svfCallee))
269
+ else
588
270
  {
589
- ExtAPI::ExtFunctionOps extFunctionOps = ExtAPI::getExtAPI()->getExtFunctionOps(svfCallee);
590
- if (extFunctionOps.getOperations().size() == 0)
591
- {
592
- std::string str;
593
- std::stringstream rawstr(str);
594
- rawstr << "function " << svfCallee->getName() << " not in the external function summary ExtAPI.json file";
595
- writeWrnMsg(rawstr.str());
596
- }
597
- else
598
- {
599
- parseExtFunctionOps(extFunctionOps, svfCall);
600
- for (ExtAPI::ExtOperation op : extFunctionOps.getOperations())
601
- {
602
- if (op.isCallOp())
603
- for (ExtAPI::Operand atomicOp : op.getCalleeOperands())
604
- extFuncAtomaticOperation(atomicOp, svfCall);
605
- else if(op.isConOp())
606
- {
607
- for (ExtAPI::Operand atomicOp : op.getTrueBranchOperands())
608
- extFuncAtomaticOperation(atomicOp, svfCall);
609
- for (ExtAPI::Operand atomicOp : op.getFalseBranchOperands())
610
- extFuncAtomaticOperation(atomicOp, svfCall);
611
- }
612
- else
613
- {
614
- ExtAPI::Operand atomicOp = op.getBasicOp();
615
- extFuncAtomaticOperation(atomicOp, svfCall);
616
- }
617
- }
618
- }
271
+ /// handle indirect calls at pthread create APIs e.g., pthread_create(&t1, nullptr, fp, ...);
272
+ /// const Value* fun = ThreadAPI::getThreadAPI()->getForkedFun(inst);
273
+ /// if(!SVFUtil::isa<Function>(fun))
274
+ /// pag->addIndirectCallsites(cs,pag->getValueNode(fun));
619
275
  }
276
+ /// If forkedFun does not pass to spawnee as function type but as void pointer
277
+ /// remember to update inter-procedural callgraph/SVFIR/SVFG etc. when indirect call targets are resolved
278
+ /// We don't connect the callgraph here, further investigation is need to handle mod-ref during SVFG construction.
279
+ }
620
280
 
621
- /// create inter-procedural SVFIR edges for thread forks
622
- if (isThreadForkCall(svfInst))
281
+ /// create inter-procedural SVFIR edges for hare_parallel_for calls
282
+ else if (isHareParForCall(svfInst))
283
+ {
284
+ if (const SVFFunction* taskFunc = SVFUtil::dyn_cast<SVFFunction>(getTaskFuncAtHareParForSite(svfInst)))
623
285
  {
624
- if (const SVFFunction* forkedFun = SVFUtil::dyn_cast<SVFFunction>(getForkedFun(svfInst)))
625
- {
626
- forkedFun = forkedFun->getDefFunForMultipleModule();
627
- const SVFValue* actualParm = getActualParmAtForkSite(svfInst);
628
- /// pthread_create has 1 arg.
629
- /// apr_thread_create has 2 arg.
630
- assert((forkedFun->arg_size() <= 2) && "Size of formal parameter of start routine should be one");
631
- if (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)
632
- {
633
- const SVFArgument* formalParm = forkedFun->getArg(0);
634
- /// Connect actual parameter to formal parameter of the start routine
635
- if (actualParm->getType()->isPointerTy() && formalParm->getType()->isPointerTy())
636
- {
637
- CallICFGNode *icfgNode = pag->getICFG()->getCallICFGNode(svfInst);
638
- FunEntryICFGNode *entry = pag->getICFG()->getFunEntryICFGNode(forkedFun);
639
- addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm), icfgNode, entry);
640
- }
641
- }
642
- }
643
- else
286
+ /// The task function of hare_parallel_for has 3 args.
287
+ assert((taskFunc->arg_size() == 3) && "Size of formal parameter of hare_parallel_for's task routine should be 3");
288
+ const SVFValue* actualParm = getTaskDataAtHareParForSite(svfInst);
289
+ const SVFArgument* formalParm = taskFunc->getArg(0);
290
+ /// Connect actual parameter to formal parameter of the start routine
291
+ if (actualParm->getType()->isPointerTy() && formalParm->getType()->isPointerTy())
644
292
  {
645
- /// handle indirect calls at pthread create APIs e.g., pthread_create(&t1, nullptr, fp, ...);
646
- /// const Value* fun = ThreadAPI::getThreadAPI()->getForkedFun(inst);
647
- /// if(!SVFUtil::isa<Function>(fun))
648
- /// pag->addIndirectCallsites(cs,pag->getValueNode(fun));
293
+ CallICFGNode *icfgNode = pag->getICFG()->getCallICFGNode(svfInst);
294
+ FunEntryICFGNode *entry = pag->getICFG()->getFunEntryICFGNode(taskFunc);
295
+ addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm), icfgNode, entry);
649
296
  }
650
- /// If forkedFun does not pass to spawnee as function type but as void pointer
651
- /// remember to update inter-procedural callgraph/SVFIR/SVFG etc. when indirect call targets are resolved
652
- /// We don't connect the callgraph here, further investigation is need to handle mod-ref during SVFG construction.
653
297
  }
654
-
655
- /// create inter-procedural SVFIR edges for hare_parallel_for calls
656
- else if (isHareParForCall(svfInst))
298
+ else
657
299
  {
658
- if (const SVFFunction* taskFunc = SVFUtil::dyn_cast<SVFFunction>(getTaskFuncAtHareParForSite(svfInst)))
659
- {
660
- /// The task function of hare_parallel_for has 3 args.
661
- assert((taskFunc->arg_size() == 3) && "Size of formal parameter of hare_parallel_for's task routine should be 3");
662
- const SVFValue* actualParm = getTaskDataAtHareParForSite(svfInst);
663
- const SVFArgument* formalParm = taskFunc->getArg(0);
664
- /// Connect actual parameter to formal parameter of the start routine
665
- if (actualParm->getType()->isPointerTy() && formalParm->getType()->isPointerTy())
666
- {
667
- CallICFGNode *icfgNode = pag->getICFG()->getCallICFGNode(svfInst);
668
- FunEntryICFGNode *entry = pag->getICFG()->getFunEntryICFGNode(taskFunc);
669
- addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm), icfgNode, entry);
670
- }
671
- }
672
- else
673
- {
674
- /// handle indirect calls at hare_parallel_for (e.g., hare_parallel_for(..., fp, ...);
675
- /// const Value* fun = ThreadAPI::getThreadAPI()->getForkedFun(inst);
676
- /// if(!SVFUtil::isa<Function>(fun))
677
- /// pag->addIndirectCallsites(cs,pag->getValueNode(fun));
678
- }
300
+ /// handle indirect calls at hare_parallel_for (e.g., hare_parallel_for(..., fp, ...);
301
+ /// const Value* fun = ThreadAPI::getThreadAPI()->getForkedFun(inst);
302
+ /// if(!SVFUtil::isa<Function>(fun))
303
+ /// pag->addIndirectCallsites(cs,pag->getValueNode(fun));
679
304
  }
680
-
681
- /// TODO: inter-procedural SVFIR edges for thread joins
682
305
  }
306
+
307
+ /// TODO: inter-procedural SVFIR edges for thread joins
683
308
  }