svf-tools 1.0.281 → 1.0.285
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/Dockerfile +8 -5
- package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/Andersen_8h_source.html +5 -5
- package/SVF-doxygen/html/html/BasicTypes_8h_source.html +2 -2
- package/SVF-doxygen/html/html/CHG_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ConditionalPT_8h_source.html +1 -1
- package/SVF-doxygen/html/html/Conditions_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +4 -4
- package/SVF-doxygen/html/html/CxtStmt_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DCHG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ExternalPAG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FSMPTA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/FileChecker_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +3 -3
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +8 -8
- package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ICFGNode_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +2 -2
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +1 -1
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/LocationSet_8h_source.html +3 -3
- package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/MHP_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +5 -5
- package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MTAAnnotator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/MTAResultValidator_8h_source.html +5 -5
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemModel_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +15 -15
- package/SVF-doxygen/html/html/MemPartition_8h_source.html +11 -11
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +103 -34
- package/SVF-doxygen/html/html/MemRegion_8h.html +3 -3
- package/SVF-doxygen/html/html/MemRegion_8h_source.html +97 -109
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +43 -42
- package/SVF-doxygen/html/html/MemSSA_8h_source.html +46 -47
- package/SVF-doxygen/html/html/MutablePointsToDS_8h_source.html +3 -3
- package/SVF-doxygen/html/html/Options_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PAGBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/PAG_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/PCG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PathCondAllocator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PersistentPointsToCache_8h_source.html +29 -29
- package/SVF-doxygen/html/html/PersistentPointsToDS_8h_source.html +7 -7
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +19 -21
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +81 -81
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/SVFGBuilder_8h.html +2 -1
- package/SVF-doxygen/html/html/SVFGBuilder_8h_source.html +20 -19
- package/SVF-doxygen/html/html/SVFGEdge_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFGNode_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +3 -4
- package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +21 -21
- package/SVF-doxygen/html/html/SVFG_8cpp.html +1 -0
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +46 -45
- package/SVF-doxygen/html/html/SVFG_8h_source.html +12 -13
- package/SVF-doxygen/html/html/SVFModule_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFUtil_8cpp.html +9 -8
- package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +34 -33
- package/SVF-doxygen/html/html/SVFUtil_8h.html +14 -2
- package/SVF-doxygen/html/html/SVFUtil_8h_source.html +43 -36
- package/SVF-doxygen/html/html/SaberCheckerAPI_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8h_source.html +2 -2
- package/SVF-doxygen/html/html/Steensgaard_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/TCT_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ThreadAPI_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/VFG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/annotated.html +16 -16
- package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AddrPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +58 -59
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +19 -22
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +48 -49
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +9 -12
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +60 -61
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +63 -64
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +59 -60
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +63 -64
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +5 -8
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +67 -68
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +58 -59
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiffWithType-members.html +64 -65
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiffWithType.html +4 -7
- package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +135 -138
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1BranchCondManager.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallCHI.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallGraphBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallMU.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CmpPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +115 -115
- package/SVF-doxygen/html/html/classSVF_1_1CondPointsToSet.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1CopyPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CxtStmt.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CxtThread.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CxtThreadStmt.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAClient.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG-members.html +63 -62
- package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +94 -92
- package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1EntryCHI.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ExternalPAG.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FIObjPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +65 -66
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1FileChecker.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +51 -52
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +10 -13
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +62 -63
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +55 -53
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +74 -75
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +17 -20
- package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1FunEntryBlockNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FunExitBlockNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1GepObjPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepValPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG-members.html +71 -70
- package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG.html +88 -86
- package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraBlockNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG-members.html +71 -70
- package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +126 -124
- package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +13 -13
- package/SVF-doxygen/html/html/classSVF_1_1LoadMU.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LoadPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LocSymTableInfo.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1MHP.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator-members.html +76 -75
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +515 -506
- package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MSSACHI.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MSSADEF.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MSSAMU.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MSSAPHI.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1MemRegion-members.html +9 -10
- package/SVF-doxygen/html/html/classSVF_1_1MemRegion.html +38 -56
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +132 -132
- package/SVF-doxygen/html/html/classSVF_1_1MemSSADF.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +21 -21
- package/SVF-doxygen/html/html/classSVF_1_1MutableDFPTData.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MutablePTData.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ObjPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PAGBuilder.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1PAGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PCG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PathCondAllocator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PersistentDFPTData.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1PersistentDiffPTData.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPointsToCache-members.html +28 -27
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPointsToCache.html +144 -111
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +21 -21
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1RetBlockNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RetMU.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SVFG-members.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +62 -62
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +37 -37
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT-members.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +49 -49
- package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SaberCheckerAPI.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +52 -53
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +6 -9
- package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StoreCHI.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StorePE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1TCT.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ThreadAPI.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +51 -52
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +3 -6
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ValPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +82 -83
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +5 -8
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +7 -7
- package/SVF-doxygen/html/html/classes.html +2 -2
- package/SVF-doxygen/html/html/functions_a.html +10 -10
- package/SVF-doxygen/html/html/functions_c.html +11 -11
- package/SVF-doxygen/html/html/functions_e.html +4 -7
- package/SVF-doxygen/html/html/functions_f.html +17 -14
- package/SVF-doxygen/html/html/functions_func.html +10 -10
- package/SVF-doxygen/html/html/functions_func_c.html +5 -5
- package/SVF-doxygen/html/html/functions_func_g.html +33 -30
- package/SVF-doxygen/html/html/functions_func_h.html +1 -1
- package/SVF-doxygen/html/html/functions_func_i.html +1 -1
- package/SVF-doxygen/html/html/functions_func_m.html +2 -2
- package/SVF-doxygen/html/html/functions_func_o.html +3 -3
- package/SVF-doxygen/html/html/functions_func_p.html +1 -1
- package/SVF-doxygen/html/html/functions_func_s.html +1 -1
- package/SVF-doxygen/html/html/functions_g.html +30 -27
- package/SVF-doxygen/html/html/functions_h.html +1 -1
- package/SVF-doxygen/html/html/functions_i.html +7 -7
- package/SVF-doxygen/html/html/functions_l.html +4 -4
- package/SVF-doxygen/html/html/functions_m.html +2 -2
- package/SVF-doxygen/html/html/functions_o.html +7 -9
- package/SVF-doxygen/html/html/functions_p.html +17 -13
- package/SVF-doxygen/html/html/functions_r.html +8 -4
- package/SVF-doxygen/html/html/functions_s.html +7 -7
- package/SVF-doxygen/html/html/functions_t.html +3 -3
- package/SVF-doxygen/html/html/functions_type_c.html +1 -1
- package/SVF-doxygen/html/html/functions_type_e.html +0 -3
- package/SVF-doxygen/html/html/functions_type_f.html +4 -1
- package/SVF-doxygen/html/html/functions_type_l.html +1 -1
- package/SVF-doxygen/html/html/functions_type_p.html +3 -3
- package/SVF-doxygen/html/html/functions_type_s.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_c.html +5 -5
- package/SVF-doxygen/html/html/functions_vars_f.html +3 -3
- package/SVF-doxygen/html/html/functions_vars_i.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_p.html +1 -1
- package/SVF-doxygen/html/html/globals_s.html +3 -3
- package/SVF-doxygen/html/html/hierarchy.html +2 -2
- package/SVF-doxygen/html/html/menudata.js +1 -0
- package/SVF-doxygen/html/html/namespaceSVF.html +3 -3
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +250 -122
- package/SVF-doxygen/html/html/namespacemembers_c.html +3 -0
- package/SVF-doxygen/html/html/namespacemembers_e.html +3 -0
- package/SVF-doxygen/html/html/namespacemembers_func.html +23 -10
- package/SVF-doxygen/html/html/namespacemembers_m.html +3 -0
- package/SVF-doxygen/html/html/namespacemembers_p.html +4 -1
- package/SVF-doxygen/html/html/namespacemembers_type_e.html +3 -0
- package/SVF-doxygen/html/html/namespacemembers_type_p.html +1 -1
- package/SVF-doxygen/html/html/search/all_1.js +10 -10
- package/SVF-doxygen/html/html/search/all_10.js +12 -11
- package/SVF-doxygen/html/html/search/all_12.js +2 -2
- package/SVF-doxygen/html/html/search/all_13.js +7 -7
- package/SVF-doxygen/html/html/search/all_14.js +4 -4
- package/SVF-doxygen/html/html/search/all_15.js +1 -1
- package/SVF-doxygen/html/html/search/all_3.js +12 -11
- package/SVF-doxygen/html/html/search/all_5.js +2 -1
- package/SVF-doxygen/html/html/search/all_6.js +4 -3
- package/SVF-doxygen/html/html/search/all_7.js +14 -13
- package/SVF-doxygen/html/html/search/all_8.js +1 -1
- package/SVF-doxygen/html/html/search/all_9.js +4 -4
- package/SVF-doxygen/html/html/search/all_c.js +2 -2
- package/SVF-doxygen/html/html/search/all_d.js +5 -4
- package/SVF-doxygen/html/html/search/all_e.js +2 -2
- package/SVF-doxygen/html/html/search/all_f.js +3 -3
- package/SVF-doxygen/html/html/search/classes_4.js +2 -1
- package/SVF-doxygen/html/html/search/functions_0.js +10 -10
- package/SVF-doxygen/html/html/search/functions_10.js +2 -2
- package/SVF-doxygen/html/html/search/functions_2.js +6 -5
- package/SVF-doxygen/html/html/search/functions_6.js +14 -13
- package/SVF-doxygen/html/html/search/functions_7.js +1 -1
- package/SVF-doxygen/html/html/search/functions_8.js +1 -1
- package/SVF-doxygen/html/html/search/functions_b.js +3 -2
- package/SVF-doxygen/html/html/search/functions_d.js +1 -1
- package/SVF-doxygen/html/html/search/functions_e.js +2 -1
- package/SVF-doxygen/html/html/search/typedefs_11.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_2.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_4.js +2 -1
- package/SVF-doxygen/html/html/search/typedefs_5.js +2 -1
- package/SVF-doxygen/html/html/search/typedefs_b.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_f.js +3 -3
- package/SVF-doxygen/html/html/search/variables_10.js +1 -1
- 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_3.js +5 -5
- package/SVF-doxygen/html/html/search/variables_6.js +3 -3
- package/SVF-doxygen/html/html/search/variables_9.js +1 -1
- package/SVF-doxygen/html/html/search/variables_d.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1MemRegion_1_1equalMemRegion.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1equalNodeBS-members.html +81 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1equalNodeBS.html +134 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1equalPointsTo.html +3 -3
- 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_01ICFG_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01PAG_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +1 -1
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +1 -1
- package/include/Graphs/SVFG.h +4 -4
- package/include/Graphs/SVFGOPT.h +4 -4
- package/include/MSSA/MemPartition.h +10 -10
- package/include/MSSA/MemRegion.h +40 -64
- package/include/MSSA/MemSSA.h +1 -4
- package/include/MSSA/SVFGBuilder.h +1 -0
- package/include/MemoryModel/LocationSet.h +3 -3
- package/include/MemoryModel/PersistentPointsToCache.h +20 -9
- package/include/MemoryModel/PointerAnalysisImpl.h +3 -4
- package/include/Util/SVFUtil.h +44 -1
- package/lib/Graphs/SVFG.cpp +12 -12
- package/lib/Graphs/SVFGOPT.cpp +6 -6
- package/lib/MSSA/MemPartition.cpp +31 -31
- package/lib/MSSA/MemRegion.cpp +59 -35
- package/lib/MSSA/MemSSA.cpp +5 -0
- package/lib/MemoryModel/LocationSet.cpp +2 -2
- package/lib/MemoryModel/PointerAnalysisImpl.cpp +1 -4
- package/lib/Util/Options.cpp +3 -3
- package/lib/Util/SVFUtil.cpp +3 -2
- package/lib/WPA/FlowSensitive.cpp +34 -0
- package/package.json +1 -1
|
@@ -41,15 +41,15 @@ using namespace SVF;
|
|
|
41
41
|
*/
|
|
42
42
|
void DistinctMRG::partitionMRs()
|
|
43
43
|
{
|
|
44
|
-
for(
|
|
44
|
+
for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(), eit = getFunToPointsToList().end();
|
|
45
45
|
it!=eit; ++it)
|
|
46
46
|
{
|
|
47
47
|
const SVFFunction* fun = it->first;
|
|
48
48
|
/// Collect all points-to target in a function scope.
|
|
49
|
-
|
|
49
|
+
NodeBS mergePts;
|
|
50
50
|
for(PointsToList::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)
|
|
51
51
|
{
|
|
52
|
-
const
|
|
52
|
+
const NodeBS& pts = *cit;
|
|
53
53
|
mergePts |= pts;
|
|
54
54
|
}
|
|
55
55
|
createDistinctMR(fun, mergePts);
|
|
@@ -61,17 +61,17 @@ void DistinctMRG::partitionMRs()
|
|
|
61
61
|
* 1. collect all points-to targets in a function scope.
|
|
62
62
|
* 2. create memory region for each point-to target.
|
|
63
63
|
*/
|
|
64
|
-
void DistinctMRG::createDistinctMR(const SVFFunction* func, const
|
|
64
|
+
void DistinctMRG::createDistinctMR(const SVFFunction* func, const NodeBS& pts)
|
|
65
65
|
{
|
|
66
66
|
/// Create memory regions for each points-to target.
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
NodeBS::iterator ptsIt = pts.begin();
|
|
69
|
+
NodeBS::iterator ptsEit = pts.end();
|
|
70
70
|
for (; ptsIt != ptsEit; ++ptsIt)
|
|
71
71
|
{
|
|
72
72
|
NodeID id = *ptsIt;
|
|
73
73
|
// create new conditional points-to set with this single element.
|
|
74
|
-
|
|
74
|
+
NodeBS newPts;
|
|
75
75
|
newPts.set(id);
|
|
76
76
|
|
|
77
77
|
// set the rep cpts as itself.
|
|
@@ -88,17 +88,17 @@ void DistinctMRG::createDistinctMR(const SVFFunction* func, const PointsTo& pts)
|
|
|
88
88
|
* @param fun The function being analyzed.
|
|
89
89
|
* @param mrs Memory region set contains all possible target memory regions.
|
|
90
90
|
*/
|
|
91
|
-
void DistinctMRG::getMRsForLoad(MRSet& mrs, const
|
|
91
|
+
void DistinctMRG::getMRsForLoad(MRSet& mrs, const NodeBS& pts, const SVFFunction*)
|
|
92
92
|
{
|
|
93
93
|
/// Get memory regions for each points-to element in cpts.
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
NodeBS::iterator ptsIt = pts.begin();
|
|
96
|
+
NodeBS::iterator ptsEit = pts.end();
|
|
97
97
|
for (; ptsIt != ptsEit; ++ptsIt)
|
|
98
98
|
{
|
|
99
99
|
NodeID id = *ptsIt;
|
|
100
100
|
// create new conditional points-to set with this single element.
|
|
101
|
-
|
|
101
|
+
NodeBS newPts;
|
|
102
102
|
newPts.set(id);
|
|
103
103
|
|
|
104
104
|
MemRegion mr(newPts);
|
|
@@ -112,7 +112,7 @@ void DistinctMRG::getMRsForLoad(MRSet& mrs, const PointsTo& pts, const SVFFuncti
|
|
|
112
112
|
* Get memory regions to be inserted at a load statement.
|
|
113
113
|
* Just process as getMRsForLoad().
|
|
114
114
|
*/
|
|
115
|
-
void DistinctMRG::getMRsForCallSiteRef(MRSet& aliasMRs, const
|
|
115
|
+
void DistinctMRG::getMRsForCallSiteRef(MRSet& aliasMRs, const NodeBS& cpts, const SVFFunction* fun)
|
|
116
116
|
{
|
|
117
117
|
getMRsForLoad(aliasMRs, cpts, fun);
|
|
118
118
|
}
|
|
@@ -121,7 +121,7 @@ void DistinctMRG::getMRsForCallSiteRef(MRSet& aliasMRs, const PointsTo& cpts, co
|
|
|
121
121
|
|
|
122
122
|
void IntraDisjointMRG::partitionMRs()
|
|
123
123
|
{
|
|
124
|
-
for(
|
|
124
|
+
for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(),
|
|
125
125
|
eit = getFunToPointsToList().end(); it!=eit; ++it)
|
|
126
126
|
{
|
|
127
127
|
const SVFFunction* fun = it->first;
|
|
@@ -129,7 +129,7 @@ void IntraDisjointMRG::partitionMRs()
|
|
|
129
129
|
for(PointsToList::iterator cit = it->second.begin(), ecit = it->second.end();
|
|
130
130
|
cit!=ecit; ++cit)
|
|
131
131
|
{
|
|
132
|
-
const
|
|
132
|
+
const NodeBS& cpts = *cit;
|
|
133
133
|
|
|
134
134
|
PointsToList& inters = getIntersList(fun);
|
|
135
135
|
computeIntersections(cpts, inters);
|
|
@@ -140,7 +140,7 @@ void IntraDisjointMRG::partitionMRs()
|
|
|
140
140
|
for (PointsToList::const_iterator interIt = inters.begin(), interEit = inters.end();
|
|
141
141
|
interIt != interEit; ++interIt)
|
|
142
142
|
{
|
|
143
|
-
const
|
|
143
|
+
const NodeBS& inter = *interIt;
|
|
144
144
|
createDisjointMR(fun, inter);
|
|
145
145
|
}
|
|
146
146
|
}
|
|
@@ -149,7 +149,7 @@ void IntraDisjointMRG::partitionMRs()
|
|
|
149
149
|
/**
|
|
150
150
|
* Compute intersections between cpts and computed cpts intersections before.
|
|
151
151
|
*/
|
|
152
|
-
void IntraDisjointMRG::computeIntersections(const
|
|
152
|
+
void IntraDisjointMRG::computeIntersections(const NodeBS& cpts, PointsToList& inters)
|
|
153
153
|
{
|
|
154
154
|
if (inters.find(cpts) != inters.end())
|
|
155
155
|
{
|
|
@@ -168,18 +168,18 @@ void IntraDisjointMRG::computeIntersections(const PointsTo& cpts, PointsToList&
|
|
|
168
168
|
PointsToList toBeDeleted;
|
|
169
169
|
PointsToList newInters;
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
NodeBS cpts_copy = cpts; // make a copy since cpts may be changed.
|
|
172
172
|
|
|
173
173
|
// check intersections with existing cpts in subSetMap
|
|
174
174
|
for (PointsToList::const_iterator interIt = inters.begin(), interEit = inters.end();
|
|
175
175
|
interIt != interEit; ++interIt)
|
|
176
176
|
{
|
|
177
|
-
const
|
|
177
|
+
const NodeBS& inter = *interIt;
|
|
178
178
|
|
|
179
179
|
if (cpts_copy.intersects(inter))
|
|
180
180
|
{
|
|
181
181
|
// compute intersection between cpts and inter
|
|
182
|
-
|
|
182
|
+
NodeBS new_inter = inter;
|
|
183
183
|
new_inter &= cpts_copy;
|
|
184
184
|
|
|
185
185
|
// remove old intersection and add new one if possible
|
|
@@ -189,7 +189,7 @@ void IntraDisjointMRG::computeIntersections(const PointsTo& cpts, PointsToList&
|
|
|
189
189
|
newInters.insert(new_inter);
|
|
190
190
|
|
|
191
191
|
// compute complement after intersection
|
|
192
|
-
|
|
192
|
+
NodeBS complement = inter;
|
|
193
193
|
complement.intersectWithComplement(new_inter);
|
|
194
194
|
if (complement.empty() == false)
|
|
195
195
|
{
|
|
@@ -208,7 +208,7 @@ void IntraDisjointMRG::computeIntersections(const PointsTo& cpts, PointsToList&
|
|
|
208
208
|
for (PointsToList::const_iterator it = toBeDeleted.begin(), eit = toBeDeleted.end();
|
|
209
209
|
it != eit; ++it)
|
|
210
210
|
{
|
|
211
|
-
const
|
|
211
|
+
const NodeBS& temp_cpts = *it;
|
|
212
212
|
inters.erase(temp_cpts);
|
|
213
213
|
}
|
|
214
214
|
|
|
@@ -216,7 +216,7 @@ void IntraDisjointMRG::computeIntersections(const PointsTo& cpts, PointsToList&
|
|
|
216
216
|
for (PointsToList::const_iterator it = newInters.begin(), eit = newInters.end();
|
|
217
217
|
it != eit; ++it)
|
|
218
218
|
{
|
|
219
|
-
const
|
|
219
|
+
const NodeBS& temp_cpts = *it;
|
|
220
220
|
inters.insert(temp_cpts);
|
|
221
221
|
}
|
|
222
222
|
|
|
@@ -229,7 +229,7 @@ void IntraDisjointMRG::computeIntersections(const PointsTo& cpts, PointsToList&
|
|
|
229
229
|
/**
|
|
230
230
|
* Create memory regions for each points-to target.
|
|
231
231
|
*/
|
|
232
|
-
void IntraDisjointMRG::createDisjointMR(const SVFFunction* func, const
|
|
232
|
+
void IntraDisjointMRG::createDisjointMR(const SVFFunction* func, const NodeBS& cpts)
|
|
233
233
|
{
|
|
234
234
|
// set the rep cpts as itself.
|
|
235
235
|
cptsToRepCPtsMap[cpts] = cpts;
|
|
@@ -238,13 +238,13 @@ void IntraDisjointMRG::createDisjointMR(const SVFFunction* func, const PointsTo&
|
|
|
238
238
|
createMR(func, cpts);
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
void IntraDisjointMRG::getMRsForLoadFromInterList(MRSet& mrs, const
|
|
241
|
+
void IntraDisjointMRG::getMRsForLoadFromInterList(MRSet& mrs, const NodeBS& cpts, const PointsToList& inters)
|
|
242
242
|
{
|
|
243
243
|
PointsToList::const_iterator it = inters.begin();
|
|
244
244
|
PointsToList::const_iterator eit = inters.end();
|
|
245
245
|
for (; it != eit; ++it)
|
|
246
246
|
{
|
|
247
|
-
const
|
|
247
|
+
const NodeBS& inter = *it;
|
|
248
248
|
if (cpts.contains(inter))
|
|
249
249
|
{
|
|
250
250
|
MemRegion mr(inter);
|
|
@@ -259,7 +259,7 @@ void IntraDisjointMRG::getMRsForLoadFromInterList(MRSet& mrs, const PointsTo& cp
|
|
|
259
259
|
* Get memory regions to be inserted at a load statement.
|
|
260
260
|
* Just process as getMRsForLoad().
|
|
261
261
|
*/
|
|
262
|
-
void IntraDisjointMRG::getMRsForCallSiteRef(MRSet& aliasMRs, const
|
|
262
|
+
void IntraDisjointMRG::getMRsForCallSiteRef(MRSet& aliasMRs, const NodeBS& cpts, const SVFFunction* fun)
|
|
263
263
|
{
|
|
264
264
|
getMRsForLoad(aliasMRs, cpts, fun);
|
|
265
265
|
}
|
|
@@ -269,20 +269,20 @@ void IntraDisjointMRG::getMRsForCallSiteRef(MRSet& aliasMRs, const PointsTo& cpt
|
|
|
269
269
|
void InterDisjointMRG::partitionMRs()
|
|
270
270
|
{
|
|
271
271
|
/// Generate disjoint cpts.
|
|
272
|
-
for(
|
|
272
|
+
for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(),
|
|
273
273
|
eit = getFunToPointsToList().end(); it!=eit; ++it)
|
|
274
274
|
{
|
|
275
275
|
for(PointsToList::iterator cit = it->second.begin(), ecit = it->second.end();
|
|
276
276
|
cit!=ecit; ++cit)
|
|
277
277
|
{
|
|
278
|
-
const
|
|
278
|
+
const NodeBS& cpts = *cit;
|
|
279
279
|
|
|
280
280
|
computeIntersections(cpts, inters);
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
/// Create memory regions.
|
|
285
|
-
for(
|
|
285
|
+
for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(),
|
|
286
286
|
eit = getFunToPointsToList().end(); it!=eit; ++it)
|
|
287
287
|
{
|
|
288
288
|
const SVFFunction* fun = it->first;
|
|
@@ -290,12 +290,12 @@ void InterDisjointMRG::partitionMRs()
|
|
|
290
290
|
for(PointsToList::iterator cit = it->second.begin(), ecit = it->second.end();
|
|
291
291
|
cit!=ecit; ++cit)
|
|
292
292
|
{
|
|
293
|
-
const
|
|
293
|
+
const NodeBS& cpts = *cit;
|
|
294
294
|
|
|
295
295
|
for (PointsToList::const_iterator interIt = inters.begin(), interEit = inters.end();
|
|
296
296
|
interIt != interEit; ++interIt)
|
|
297
297
|
{
|
|
298
|
-
const
|
|
298
|
+
const NodeBS& inter = *interIt;
|
|
299
299
|
if (cpts.contains(inter))
|
|
300
300
|
createDisjointMR(fun, inter);
|
|
301
301
|
}
|
package/lib/MSSA/MemRegion.cpp
CHANGED
|
@@ -39,6 +39,12 @@ using namespace SVFUtil;
|
|
|
39
39
|
Size_t MemRegion::totalMRNum = 0;
|
|
40
40
|
Size_t MRVer::totalVERNum = 0;
|
|
41
41
|
|
|
42
|
+
MRGenerator::MRGenerator(BVDataPTAImpl* p, bool ptrOnly) :
|
|
43
|
+
pta(p), ptrOnlyMSSA(ptrOnly)
|
|
44
|
+
{
|
|
45
|
+
callGraph = pta->getPTACallGraph();
|
|
46
|
+
callGraphSCC = new SCC(callGraph);
|
|
47
|
+
}
|
|
42
48
|
|
|
43
49
|
/*!
|
|
44
50
|
* Clean up memory
|
|
@@ -61,9 +67,9 @@ void MRGenerator::destroy()
|
|
|
61
67
|
/*!
|
|
62
68
|
* Generate a memory region and put in into functions which use it
|
|
63
69
|
*/
|
|
64
|
-
void MRGenerator::createMR(const SVFFunction* fun, const
|
|
70
|
+
void MRGenerator::createMR(const SVFFunction* fun, const NodeBS& cpts)
|
|
65
71
|
{
|
|
66
|
-
const
|
|
72
|
+
const NodeBS& repCPts = getRepPointsTo(cpts);
|
|
67
73
|
MemRegion mr(repCPts);
|
|
68
74
|
MRSet::const_iterator mit = memRegSet.find(&mr);
|
|
69
75
|
if(mit!=memRegSet.end())
|
|
@@ -84,7 +90,7 @@ void MRGenerator::createMR(const SVFFunction* fun, const PointsTo& cpts)
|
|
|
84
90
|
/*!
|
|
85
91
|
* Generate a memory region and put in into functions which use it
|
|
86
92
|
*/
|
|
87
|
-
const MemRegion* MRGenerator::getMR(const
|
|
93
|
+
const MemRegion* MRGenerator::getMR(const NodeBS& cpts) const
|
|
88
94
|
{
|
|
89
95
|
MemRegion mr(getRepPointsTo(cpts));
|
|
90
96
|
MRSet::iterator mit = memRegSet.find(&mr);
|
|
@@ -142,6 +148,24 @@ void MRGenerator::generateMRs()
|
|
|
142
148
|
updateAliasMRs();
|
|
143
149
|
}
|
|
144
150
|
|
|
151
|
+
bool MRGenerator::hasPAGEdgeList(const Instruction* inst)
|
|
152
|
+
{
|
|
153
|
+
PAG* pag = pta->getPAG();
|
|
154
|
+
if (ptrOnlyMSSA)
|
|
155
|
+
return pag->hasPTAPAGEdgeList(pag->getICFG()->getBlockICFGNode(inst));
|
|
156
|
+
else
|
|
157
|
+
return pag->hasPAGEdgeList(pag->getICFG()->getBlockICFGNode(inst));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
PAG::PAGEdgeList& MRGenerator::getPAGEdgesFromInst(const Instruction* inst)
|
|
161
|
+
{
|
|
162
|
+
PAG* pag = pta->getPAG();
|
|
163
|
+
if (ptrOnlyMSSA)
|
|
164
|
+
return pag->getInstPTAPAGEdgeList(pag->getICFG()->getBlockICFGNode(inst));
|
|
165
|
+
else
|
|
166
|
+
return pag->getInstPAGEdgeList(pag->getICFG()->getBlockICFGNode(inst));
|
|
167
|
+
}
|
|
168
|
+
|
|
145
169
|
/*!
|
|
146
170
|
* Generate memory regions for loads/stores
|
|
147
171
|
*/
|
|
@@ -174,7 +198,7 @@ void MRGenerator::collectModRefForLoadStore()
|
|
|
174
198
|
pagEdgeToFunMap[inst] = &fun;
|
|
175
199
|
if (const StorePE *st = SVFUtil::dyn_cast<StorePE>(inst))
|
|
176
200
|
{
|
|
177
|
-
|
|
201
|
+
NodeBS cpts(pta->getPts(st->getDstID()));
|
|
178
202
|
// TODO: change this assertion check later when we have conditional points-to set
|
|
179
203
|
if (cpts.empty())
|
|
180
204
|
continue;
|
|
@@ -184,7 +208,7 @@ void MRGenerator::collectModRefForLoadStore()
|
|
|
184
208
|
|
|
185
209
|
else if (const LoadPE *ld = SVFUtil::dyn_cast<LoadPE>(inst))
|
|
186
210
|
{
|
|
187
|
-
|
|
211
|
+
NodeBS cpts(pta->getPts(ld->getSrcID()));
|
|
188
212
|
// TODO: change this assertion check later when we have conditional points-to set
|
|
189
213
|
if (cpts.empty())
|
|
190
214
|
continue;
|
|
@@ -257,18 +281,18 @@ void MRGenerator::collectModRefForCall()
|
|
|
257
281
|
* 1) map cpts to its superset(rep) which exists in the map, otherwise its superset is itself
|
|
258
282
|
* 2) adjust existing items in the map if their supersets are cpts
|
|
259
283
|
*/
|
|
260
|
-
void MRGenerator::sortPointsTo(const
|
|
284
|
+
void MRGenerator::sortPointsTo(const NodeBS& cpts)
|
|
261
285
|
{
|
|
262
286
|
|
|
263
287
|
if(cptsToRepCPtsMap.find(cpts)!=cptsToRepCPtsMap.end())
|
|
264
288
|
return;
|
|
265
289
|
|
|
266
290
|
PointsToList subSetList;
|
|
267
|
-
|
|
291
|
+
NodeBS repCPts = cpts;
|
|
268
292
|
for(PtsToRepPtsSetMap::iterator it = cptsToRepCPtsMap.begin(),
|
|
269
293
|
eit = cptsToRepCPtsMap.end(); it!=eit; ++it)
|
|
270
294
|
{
|
|
271
|
-
|
|
295
|
+
NodeBS& existCPts = it->second;
|
|
272
296
|
if(cpts.contains(existCPts))
|
|
273
297
|
{
|
|
274
298
|
subSetList.insert(it->first);
|
|
@@ -297,7 +321,7 @@ void MRGenerator::partitionMRs()
|
|
|
297
321
|
/// TODO: we may need some refined region partitioning algorithm here
|
|
298
322
|
/// For now, we just collapse all refs/mods objects at callsites into one region
|
|
299
323
|
/// Consider modularly partition memory regions to speed up analysis (only partition regions within function scope)
|
|
300
|
-
for(
|
|
324
|
+
for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(), eit = getFunToPointsToList().end();
|
|
301
325
|
it!=eit; ++it)
|
|
302
326
|
{
|
|
303
327
|
for(PointsToList::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)
|
|
@@ -306,7 +330,7 @@ void MRGenerator::partitionMRs()
|
|
|
306
330
|
}
|
|
307
331
|
}
|
|
308
332
|
/// Generate memory regions according to condition pts after computing superset
|
|
309
|
-
for(
|
|
333
|
+
for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(), eit = getFunToPointsToList().end();
|
|
310
334
|
it!=eit; ++it)
|
|
311
335
|
{
|
|
312
336
|
const SVFFunction* fun = it->first;
|
|
@@ -329,7 +353,7 @@ void MRGenerator::updateAliasMRs()
|
|
|
329
353
|
{
|
|
330
354
|
MRSet aliasMRs;
|
|
331
355
|
const SVFFunction* fun = getFunction(it->first);
|
|
332
|
-
const
|
|
356
|
+
const NodeBS& storeCPts = it->second;
|
|
333
357
|
getAliasMemRegions(aliasMRs,storeCPts,fun);
|
|
334
358
|
for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
|
|
335
359
|
{
|
|
@@ -341,7 +365,7 @@ void MRGenerator::updateAliasMRs()
|
|
|
341
365
|
{
|
|
342
366
|
MRSet aliasMRs;
|
|
343
367
|
const SVFFunction* fun = getFunction(it->first);
|
|
344
|
-
const
|
|
368
|
+
const NodeBS& loadCPts = it->second;
|
|
345
369
|
getMRsForLoad(aliasMRs, loadCPts, fun);
|
|
346
370
|
for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
|
|
347
371
|
{
|
|
@@ -355,7 +379,7 @@ void MRGenerator::updateAliasMRs()
|
|
|
355
379
|
{
|
|
356
380
|
const SVFFunction* fun = it->first->getCaller();
|
|
357
381
|
MRSet aliasMRs;
|
|
358
|
-
const
|
|
382
|
+
const NodeBS& callsiteModCPts = it->second;
|
|
359
383
|
getAliasMemRegions(aliasMRs,callsiteModCPts,fun);
|
|
360
384
|
for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
|
|
361
385
|
{
|
|
@@ -367,7 +391,7 @@ void MRGenerator::updateAliasMRs()
|
|
|
367
391
|
{
|
|
368
392
|
const SVFFunction* fun = it->first->getCaller();
|
|
369
393
|
MRSet aliasMRs;
|
|
370
|
-
const
|
|
394
|
+
const NodeBS& callsiteRefCPts = it->second;
|
|
371
395
|
getMRsForCallSiteRef(aliasMRs, callsiteRefCPts, fun);
|
|
372
396
|
for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
|
|
373
397
|
{
|
|
@@ -475,8 +499,8 @@ void MRGenerator::collectCallSitePts(const CallBlockNode* cs)
|
|
|
475
499
|
while(!worklist.empty())
|
|
476
500
|
{
|
|
477
501
|
NodeID nodeId = worklist.pop();
|
|
478
|
-
const
|
|
479
|
-
for(
|
|
502
|
+
const NodeBS& tmp = pta->getPts(nodeId);
|
|
503
|
+
for(NodeBS::iterator it = tmp.begin(), eit = tmp.end(); it!=eit; ++it)
|
|
480
504
|
argsPts |= CollectPtsChain(*it);
|
|
481
505
|
}
|
|
482
506
|
|
|
@@ -488,8 +512,8 @@ void MRGenerator::collectCallSitePts(const CallBlockNode* cs)
|
|
|
488
512
|
const PAGNode* node = pta->getPAG()->getCallSiteRet(retBlockNode);
|
|
489
513
|
if(node->isPointer())
|
|
490
514
|
{
|
|
491
|
-
const
|
|
492
|
-
for(
|
|
515
|
+
const NodeBS& tmp = pta->getPts(node->getId());
|
|
516
|
+
for(NodeBS::iterator it = tmp.begin(), eit = tmp.end(); it!=eit; ++it)
|
|
493
517
|
retPts |= CollectPtsChain(*it);
|
|
494
518
|
}
|
|
495
519
|
}
|
|
@@ -508,18 +532,18 @@ NodeBS& MRGenerator::CollectPtsChain(NodeID id)
|
|
|
508
532
|
return it->second;
|
|
509
533
|
else
|
|
510
534
|
{
|
|
511
|
-
|
|
535
|
+
NodeBS& pts = cachedPtsChainMap[baseId];
|
|
512
536
|
pts |= pta->getPAG()->getFieldsAfterCollapse(baseId);
|
|
513
537
|
|
|
514
538
|
WorkList worklist;
|
|
515
|
-
for(
|
|
539
|
+
for(NodeBS::iterator it = pts.begin(), eit = pts.end(); it!=eit; ++it)
|
|
516
540
|
worklist.push(*it);
|
|
517
541
|
|
|
518
542
|
while(!worklist.empty())
|
|
519
543
|
{
|
|
520
544
|
NodeID nodeId = worklist.pop();
|
|
521
|
-
const
|
|
522
|
-
for(
|
|
545
|
+
const NodeBS& tmp = pta->getPts(nodeId);
|
|
546
|
+
for(NodeBS::iterator it = tmp.begin(), eit = tmp.end(); it!=eit; ++it)
|
|
523
547
|
{
|
|
524
548
|
pts |= CollectPtsChain(*it);
|
|
525
549
|
}
|
|
@@ -643,12 +667,12 @@ void MRGenerator::modRefAnalysis(PTACallGraphNode* callGraphNode, WorkList& work
|
|
|
643
667
|
/*!
|
|
644
668
|
* Obtain the mod sets for a call, used for external ModRefInfo queries
|
|
645
669
|
*/
|
|
646
|
-
|
|
670
|
+
NodeBS MRGenerator::getModInfoForCall(const CallBlockNode* cs)
|
|
647
671
|
{
|
|
648
672
|
if (isExtCall(cs->getCallSite()) && !isHeapAllocExtCall(cs->getCallSite()))
|
|
649
673
|
{
|
|
650
674
|
PAGEdgeList& pagEdgeList = getPAGEdgesFromInst(cs->getCallSite());
|
|
651
|
-
|
|
675
|
+
NodeBS mods;
|
|
652
676
|
for (PAGEdgeList::const_iterator bit = pagEdgeList.begin(), ebit =
|
|
653
677
|
pagEdgeList.end(); bit != ebit; ++bit)
|
|
654
678
|
{
|
|
@@ -667,12 +691,12 @@ PointsTo MRGenerator::getModInfoForCall(const CallBlockNode* cs)
|
|
|
667
691
|
/*!
|
|
668
692
|
* Obtain the ref sets for a call, used for external ModRefInfo queries
|
|
669
693
|
*/
|
|
670
|
-
|
|
694
|
+
NodeBS MRGenerator::getRefInfoForCall(const CallBlockNode* cs)
|
|
671
695
|
{
|
|
672
696
|
if (isExtCall(cs->getCallSite()) && !isHeapAllocExtCall(cs->getCallSite()))
|
|
673
697
|
{
|
|
674
698
|
PAGEdgeList& pagEdgeList = getPAGEdgesFromInst(cs->getCallSite());
|
|
675
|
-
|
|
699
|
+
NodeBS refs;
|
|
676
700
|
for (PAGEdgeList::const_iterator bit = pagEdgeList.begin(), ebit =
|
|
677
701
|
pagEdgeList.end(); bit != ebit; ++bit)
|
|
678
702
|
{
|
|
@@ -718,10 +742,10 @@ ModRefInfo MRGenerator::getModRefInfo(const CallBlockNode* cs, const Value* V)
|
|
|
718
742
|
|
|
719
743
|
if (pta->getPAG()->hasValueNode(V))
|
|
720
744
|
{
|
|
721
|
-
const
|
|
722
|
-
const
|
|
723
|
-
const
|
|
724
|
-
|
|
745
|
+
const NodeBS pts(pta->getPts(pta->getPAG()->getValueNode(V)));
|
|
746
|
+
const NodeBS csRef = getRefInfoForCall(cs);
|
|
747
|
+
const NodeBS csMod = getModInfoForCall(cs);
|
|
748
|
+
NodeBS ptsExpanded, csRefExpanded, csModExpanded;
|
|
725
749
|
pta->expandFIObjs(pts, ptsExpanded);
|
|
726
750
|
pta->expandFIObjs(csRef, csRefExpanded);
|
|
727
751
|
pta->expandFIObjs(csMod, csModExpanded);
|
|
@@ -754,11 +778,11 @@ ModRefInfo MRGenerator::getModRefInfo(const CallBlockNode* cs1, const CallBlockN
|
|
|
754
778
|
if (getModRefInfo(cs1) == ModRefInfo::NoModRef || getModRefInfo(cs2) == ModRefInfo::NoModRef)
|
|
755
779
|
return ModRefInfo::NoModRef;
|
|
756
780
|
|
|
757
|
-
const
|
|
758
|
-
const
|
|
759
|
-
const
|
|
760
|
-
const
|
|
761
|
-
|
|
781
|
+
const NodeBS cs1Ref = getRefInfoForCall(cs1);
|
|
782
|
+
const NodeBS cs1Mod = getModInfoForCall(cs1);
|
|
783
|
+
const NodeBS cs2Ref = getRefInfoForCall(cs2);
|
|
784
|
+
const NodeBS cs2Mod = getModInfoForCall(cs2);
|
|
785
|
+
NodeBS cs1RefExpanded, cs1ModExpanded, cs2RefExpanded, cs2ModExpanded;
|
|
762
786
|
pta->expandFIObjs(cs1Ref, cs1RefExpanded);
|
|
763
787
|
pta->expandFIObjs(cs1Mod, cs1ModExpanded);
|
|
764
788
|
pta->expandFIObjs(cs2Ref, cs2RefExpanded);
|
package/lib/MSSA/MemSSA.cpp
CHANGED
|
@@ -113,10 +113,10 @@ bool LocationSet::increaseIfNotReachUpperBound(std::vector<NodeID>& indices,
|
|
|
113
113
|
/*!
|
|
114
114
|
* Compute all possible locations according to offset and number-stride pairs.
|
|
115
115
|
*/
|
|
116
|
-
|
|
116
|
+
NodeBS LocationSet::computeAllLocations() const
|
|
117
117
|
{
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
NodeBS result;
|
|
120
120
|
result.set(getOffset());
|
|
121
121
|
|
|
122
122
|
if (isConstantOffset() == false)
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
#include "Util/Options.h"
|
|
10
9
|
#include "MemoryModel/PointerAnalysisImpl.h"
|
|
11
10
|
#include "SVF-FE/CPPUtil.h"
|
|
12
11
|
#include "SVF-FE/DCHG.h"
|
|
@@ -20,13 +19,11 @@ using namespace SVFUtil;
|
|
|
20
19
|
using namespace cppUtil;
|
|
21
20
|
using namespace std;
|
|
22
21
|
|
|
23
|
-
PersistentPointsToCache<PointsTo> BVDataPTAImpl::ptCache = PersistentPointsToCache<PointsTo>(PointsTo());
|
|
24
|
-
|
|
25
22
|
/*!
|
|
26
23
|
* Constructor
|
|
27
24
|
*/
|
|
28
25
|
BVDataPTAImpl::BVDataPTAImpl(PAG* p, PointerAnalysis::PTATY type, bool alias_check) :
|
|
29
|
-
PointerAnalysis(p, type, alias_check)
|
|
26
|
+
PointerAnalysis(p, type, alias_check), ptCache()
|
|
30
27
|
{
|
|
31
28
|
if (type == Andersen_BASE || type == Andersen_WPA || type == AndersenWaveDiff_WPA || type == AndersenHCD_WPA || type == AndersenHLCD_WPA
|
|
32
29
|
|| type == AndersenLCD_WPA || type == TypeCPP_WPA || type == FlowS_DDA || type == AndersenWaveDiffWithType_WPA
|
package/lib/Util/Options.cpp
CHANGED
|
@@ -7,12 +7,12 @@ namespace SVF
|
|
|
7
7
|
{
|
|
8
8
|
const llvm::cl::opt<bool> Options::MarkedClocksOnly(
|
|
9
9
|
"marked-clocks-only",
|
|
10
|
-
llvm::cl::init(
|
|
10
|
+
llvm::cl::init(true),
|
|
11
11
|
llvm::cl::desc("Only measure times where explicitly marked"));
|
|
12
12
|
|
|
13
13
|
const llvm::cl::opt<NodeIDAllocator::Strategy> Options::NodeAllocStrat(
|
|
14
14
|
"node-alloc-strat",
|
|
15
|
-
llvm::cl::init(NodeIDAllocator::Strategy::
|
|
15
|
+
llvm::cl::init(NodeIDAllocator::Strategy::SEQ),
|
|
16
16
|
llvm::cl::desc("Method of allocating (LLVM) values and memory objects as node IDs"),
|
|
17
17
|
llvm::cl::values(
|
|
18
18
|
clEnumValN(NodeIDAllocator::Strategy::DENSE, "dense", "allocate objects together and values together, separately"),
|
|
@@ -26,7 +26,7 @@ namespace SVF
|
|
|
26
26
|
|
|
27
27
|
const llvm::cl::opt<BVDataPTAImpl::PTBackingType> Options::ptDataBacking(
|
|
28
28
|
"ptd",
|
|
29
|
-
llvm::cl::init(BVDataPTAImpl::PTBackingType::
|
|
29
|
+
llvm::cl::init(BVDataPTAImpl::PTBackingType::Persistent),
|
|
30
30
|
llvm::cl::desc("Overarching points-to data structure"),
|
|
31
31
|
llvm::cl::values(
|
|
32
32
|
clEnumValN(BVDataPTAImpl::PTBackingType::Mutable, "mutable", "points-to set per pointer"),
|
package/lib/Util/SVFUtil.cpp
CHANGED
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
#include "Util/SVFUtil.h"
|
|
32
32
|
#include "SVF-FE/LLVMUtil.h"
|
|
33
33
|
|
|
34
|
+
#include "Util/Conditions.h"
|
|
35
|
+
|
|
34
36
|
#include <sys/resource.h> /// increase stack size
|
|
35
37
|
|
|
36
38
|
using namespace SVF;
|
|
@@ -125,7 +127,7 @@ void SVFUtil::dumpPointsToList(const PointsToList& ptl)
|
|
|
125
127
|
ii != ie; ii++)
|
|
126
128
|
{
|
|
127
129
|
auto bs = *ii;
|
|
128
|
-
|
|
130
|
+
dumpSet(bs);
|
|
129
131
|
}
|
|
130
132
|
outs() << "}\n";
|
|
131
133
|
}
|
|
@@ -351,7 +353,6 @@ std::string SVFUtil::getSourceLoc(const Value* val)
|
|
|
351
353
|
return rawstr.str();
|
|
352
354
|
}
|
|
353
355
|
|
|
354
|
-
|
|
355
356
|
/*!
|
|
356
357
|
* return string of an LLVM Value
|
|
357
358
|
*/
|
|
@@ -615,6 +615,40 @@ bool FlowSensitive::updateCallGraph(const CallSiteToFunPtrMap& callsites)
|
|
|
615
615
|
CallEdgeMap newEdges;
|
|
616
616
|
onTheFlyCallGraphSolve(callsites, newEdges);
|
|
617
617
|
|
|
618
|
+
// Bound the new edges by the Andersen's call graph.
|
|
619
|
+
// TODO: we want this to be an assertion eventually.
|
|
620
|
+
const CallEdgeMap &andersCallEdgeMap = ander->getIndCallMap();
|
|
621
|
+
for (typename CallEdgeMap::value_type &csfs : newEdges)
|
|
622
|
+
{
|
|
623
|
+
const CallBlockNode *potentialCallSite = csfs.first;
|
|
624
|
+
FunctionSet &potentialFunctionSet = csfs.second;
|
|
625
|
+
|
|
626
|
+
// Check this callsite even calls anything per Andersen's.
|
|
627
|
+
typename CallEdgeMap::const_iterator andersFunctionSetIt
|
|
628
|
+
= andersCallEdgeMap.find(potentialCallSite);
|
|
629
|
+
if (andersFunctionSetIt == andersCallEdgeMap.end())
|
|
630
|
+
{
|
|
631
|
+
potentialFunctionSet.clear();
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
const FunctionSet &andersFunctionSet = andersFunctionSetIt->second;
|
|
635
|
+
for (FunctionSet::iterator potentialFunctionIt = potentialFunctionSet.begin();
|
|
636
|
+
potentialFunctionIt != potentialFunctionSet.end(); )
|
|
637
|
+
{
|
|
638
|
+
const SVFFunction *potentialFunction = *potentialFunctionIt;
|
|
639
|
+
if (andersFunctionSet.find(potentialFunction) == andersFunctionSet.end())
|
|
640
|
+
{
|
|
641
|
+
// potentialFunction is not in the Andersen's call graph -- remove it.
|
|
642
|
+
potentialFunctionIt = potentialFunctionSet.erase(potentialFunctionIt);
|
|
643
|
+
}
|
|
644
|
+
else
|
|
645
|
+
{
|
|
646
|
+
// potentialFunction is in the Andersen's call graph -- keep it..
|
|
647
|
+
++potentialFunctionIt;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
618
652
|
SVFGEdgeSetTy svfgEdges;
|
|
619
653
|
connectCallerAndCallee(newEdges, svfgEdges);
|
|
620
654
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.285",
|
|
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": {
|