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