svf-tools 1.0.481 → 1.0.482
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/AndersenSCD_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenSFR_8h_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/Andersen_8h_source.html +6 -6
- package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/CFLAlias_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/CHG_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +14 -15
- package/SVF-doxygen/html/html/CPPUtil_8h_source.html +14 -14
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +13 -13
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +7 -7
- package/SVF-doxygen/html/html/DCHG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +2 -2
- package/SVF-doxygen/html/html/ExeState_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/ExeState_8h_source.html +2 -2
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/FSMPTA_8h_source.html +4 -4
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +12 -12
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/FlowSensitive_8cpp.html +0 -1
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +32 -38
- package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +66 -67
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +3 -3
- package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/LLVMModule_8h_source.html +2 -7
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/OfflineConsG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/Options_8cpp_source.html +17 -21
- package/SVF-doxygen/html/html/Options_8h_source.html +13 -16
- package/SVF-doxygen/html/html/PCG_8h_source.html +3 -3
- package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/PathCondAllocator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +21 -22
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +17 -17
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp.html +0 -1
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +64 -69
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +109 -110
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFGBuilder_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +12 -12
- package/SVF-doxygen/html/html/SVFIR_8h_source.html +9 -9
- package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +26 -32
- package/SVF-doxygen/html/html/SVFVariables_8h.html +0 -6
- package/SVF-doxygen/html/html/SVFVariables_8h_source.html +109 -130
- package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Steensgaard_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/TypeAnalysis_8h_source.html +5 -5
- package/SVF-doxygen/html/html/VFGNode_8h_source.html +1 -1
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/VFG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +16 -16
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8h_source.html +4 -4
- package/SVF-doxygen/html/html/WPAPass_8cpp.html +0 -1
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +16 -19
- package/SVF-doxygen/html/html/WPAPass_8h_source.html +6 -6
- package/SVF-doxygen/html/html/annotated.html +248 -253
- 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_1AliasDDAClient.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +173 -174
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +27 -29
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +146 -147
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +17 -19
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +185 -186
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +7 -8
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +189 -190
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +6 -7
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +180 -181
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +8 -9
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +182 -183
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +11 -12
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +185 -186
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +8 -9
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +177 -178
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +8 -9
- package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +103 -104
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +42 -48
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias-members.html +73 -74
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +13 -14
- package/SVF-doxygen/html/html/classSVF_1_1CFLGraphBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +13 -13
- package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl-members.html +94 -95
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +26 -28
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA-members.html +163 -164
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +33 -35
- package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1DDAClient.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar-members.html +72 -75
- package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +16 -27
- package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1DummyValVar-members.html +70 -73
- package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +17 -20
- package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1FIObjVar-members.html +72 -75
- package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +18 -29
- package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +112 -114
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +12 -15
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +163 -164
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +25 -27
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +106 -108
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +234 -314
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +43 -43
- package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar-members.html +77 -80
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +38 -49
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GepValVar-members.html +73 -76
- package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +28 -31
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet-members.html +44 -45
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +4 -45
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar-members.html +71 -74
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +30 -42
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1Options-members.html +104 -107
- package/SVF-doxygen/html/html/classSVF_1_1Options.html +13 -94
- package/SVF-doxygen/html/html/classSVF_1_1PCG.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1PathCondAllocator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis-members.html +69 -70
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +302 -319
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1RetPN-members.html +70 -73
- package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +18 -21
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +18 -18
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFVar-members.html +73 -76
- package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +84 -99
- package/SVF-doxygen/html/html/classSVF_1_1SVFVar.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1SaberAnnotator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +2 -3
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +157 -158
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +6 -7
- package/SVF-doxygen/html/html/classSVF_1_1TCT.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +150 -151
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +21 -23
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1ValVar-members.html +69 -72
- package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +23 -26
- package/SVF-doxygen/html/html/classSVF_1_1VarArgPN-members.html +70 -73
- package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +18 -21
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +125 -127
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +44 -48
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +31 -31
- package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver.html +6 -7
- package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +38 -40
- package/SVF-doxygen/html/html/classSVF_1_1WPASolver.html +17 -15
- package/SVF-doxygen/html/html/classSVF_1_1WPASolver.png +0 -0
- package/SVF-doxygen/html/html/classes.html +104 -105
- package/SVF-doxygen/html/html/dir_66541c162fd98954e2c32089ba9a721f.html +0 -4
- package/SVF-doxygen/html/html/dir_ea25a8a5b2904424d8a51916f8b475b2.html +0 -4
- package/SVF-doxygen/html/html/files.html +12 -16
- package/SVF-doxygen/html/html/functions_0x7e.html +0 -6
- package/SVF-doxygen/html/html/functions_a.html +8 -30
- package/SVF-doxygen/html/html/functions_b.html +8 -12
- package/SVF-doxygen/html/html/functions_c.html +24 -54
- package/SVF-doxygen/html/html/functions_d.html +1 -13
- package/SVF-doxygen/html/html/functions_e.html +1 -2
- package/SVF-doxygen/html/html/functions_eval_c.html +0 -9
- package/SVF-doxygen/html/html/functions_eval_f.html +0 -3
- package/SVF-doxygen/html/html/functions_f.html +19 -24
- package/SVF-doxygen/html/html/functions_func.html +6 -25
- package/SVF-doxygen/html/html/functions_func_0x7e.html +0 -6
- package/SVF-doxygen/html/html/functions_func_b.html +1 -5
- package/SVF-doxygen/html/html/functions_func_c.html +20 -37
- package/SVF-doxygen/html/html/functions_func_d.html +0 -6
- package/SVF-doxygen/html/html/functions_func_e.html +2 -3
- package/SVF-doxygen/html/html/functions_func_f.html +1 -5
- package/SVF-doxygen/html/html/functions_func_g.html +8 -48
- package/SVF-doxygen/html/html/functions_func_i.html +5 -15
- package/SVF-doxygen/html/html/functions_func_p.html +2 -16
- package/SVF-doxygen/html/html/functions_func_s.html +6 -19
- package/SVF-doxygen/html/html/functions_func_t.html +0 -6
- package/SVF-doxygen/html/html/functions_func_u.html +0 -4
- package/SVF-doxygen/html/html/functions_func_v.html +0 -3
- package/SVF-doxygen/html/html/functions_g.html +12 -55
- package/SVF-doxygen/html/html/functions_i.html +11 -21
- package/SVF-doxygen/html/html/functions_l.html +8 -14
- package/SVF-doxygen/html/html/functions_m.html +0 -6
- package/SVF-doxygen/html/html/functions_n.html +0 -36
- package/SVF-doxygen/html/html/functions_o.html +12 -20
- package/SVF-doxygen/html/html/functions_p.html +9 -31
- package/SVF-doxygen/html/html/functions_s.html +15 -31
- package/SVF-doxygen/html/html/functions_t.html +8 -18
- package/SVF-doxygen/html/html/functions_u.html +2 -9
- package/SVF-doxygen/html/html/functions_v.html +7 -10
- package/SVF-doxygen/html/html/functions_vars_a.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_c.html +0 -6
- package/SVF-doxygen/html/html/functions_vars_d.html +0 -6
- package/SVF-doxygen/html/html/functions_vars_g.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_l.html +0 -6
- package/SVF-doxygen/html/html/functions_vars_m.html +0 -6
- package/SVF-doxygen/html/html/functions_vars_n.html +0 -36
- package/SVF-doxygen/html/html/functions_vars_o.html +0 -12
- package/SVF-doxygen/html/html/functions_vars_p.html +0 -4
- package/SVF-doxygen/html/html/functions_vars_s.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_t.html +0 -6
- package/SVF-doxygen/html/html/functions_vars_u.html +0 -3
- package/SVF-doxygen/html/html/functions_w.html +10 -6
- package/SVF-doxygen/html/html/globals_func_g.html +0 -3
- package/SVF-doxygen/html/html/globals_func_i.html +2 -7
- package/SVF-doxygen/html/html/globals_g.html +2 -5
- package/SVF-doxygen/html/html/globals_i.html +4 -7
- package/SVF-doxygen/html/html/globals_r.html +3 -3
- package/SVF-doxygen/html/html/globals_s.html +9 -7
- package/SVF-doxygen/html/html/hierarchy.html +13 -19
- package/SVF-doxygen/html/html/namespaceSVF.html +0 -10
- package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +36 -38
- package/SVF-doxygen/html/html/search/all_1.js +1 -8
- package/SVF-doxygen/html/html/search/all_10.js +19 -21
- package/SVF-doxygen/html/html/search/all_12.js +1 -1
- package/SVF-doxygen/html/html/search/all_13.js +12 -17
- package/SVF-doxygen/html/html/search/all_14.js +8 -12
- package/SVF-doxygen/html/html/search/all_15.js +5 -6
- package/SVF-doxygen/html/html/search/all_16.js +4 -5
- package/SVF-doxygen/html/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/html/search/all_1b.js +0 -2
- package/SVF-doxygen/html/html/search/all_2.js +0 -1
- package/SVF-doxygen/html/html/search/all_3.js +2 -11
- package/SVF-doxygen/html/html/search/all_4.js +0 -4
- package/SVF-doxygen/html/html/search/all_5.js +2 -2
- package/SVF-doxygen/html/html/search/all_6.js +2 -6
- package/SVF-doxygen/html/html/search/all_7.js +3 -16
- package/SVF-doxygen/html/html/search/all_9.js +5 -8
- package/SVF-doxygen/html/html/search/all_c.js +4 -6
- package/SVF-doxygen/html/html/search/all_d.js +4 -6
- package/SVF-doxygen/html/html/search/all_e.js +3 -15
- package/SVF-doxygen/html/html/search/all_f.js +0 -4
- package/SVF-doxygen/html/html/search/classes_10.js +1 -2
- package/SVF-doxygen/html/html/search/classes_2.js +0 -3
- package/SVF-doxygen/html/html/search/classes_5.js +0 -1
- package/SVF-doxygen/html/html/search/enumvalues_2.js +0 -3
- package/SVF-doxygen/html/html/search/enumvalues_5.js +0 -1
- package/SVF-doxygen/html/html/search/files_5.js +0 -2
- package/SVF-doxygen/html/html/search/files_e.js +1 -3
- package/SVF-doxygen/html/html/search/functions_0.js +1 -7
- package/SVF-doxygen/html/html/search/functions_1.js +0 -1
- package/SVF-doxygen/html/html/search/functions_11.js +2 -6
- package/SVF-doxygen/html/html/search/functions_12.js +2 -3
- package/SVF-doxygen/html/html/search/functions_13.js +4 -4
- package/SVF-doxygen/html/html/search/functions_14.js +0 -1
- package/SVF-doxygen/html/html/search/functions_17.js +0 -2
- package/SVF-doxygen/html/html/search/functions_2.js +2 -6
- package/SVF-doxygen/html/html/search/functions_3.js +0 -2
- package/SVF-doxygen/html/html/search/functions_4.js +1 -1
- package/SVF-doxygen/html/html/search/functions_5.js +1 -2
- package/SVF-doxygen/html/html/search/functions_6.js +3 -15
- package/SVF-doxygen/html/html/search/functions_8.js +4 -7
- package/SVF-doxygen/html/html/search/functions_f.js +12 -13
- package/SVF-doxygen/html/html/search/variables_1.js +0 -1
- package/SVF-doxygen/html/html/search/variables_10.js +1 -2
- package/SVF-doxygen/html/html/search/variables_13.js +0 -1
- package/SVF-doxygen/html/html/search/variables_14.js +3 -5
- package/SVF-doxygen/html/html/search/variables_15.js +1 -2
- package/SVF-doxygen/html/html/search/variables_3.js +0 -2
- package/SVF-doxygen/html/html/search/variables_4.js +0 -2
- package/SVF-doxygen/html/html/search/variables_5.js +1 -1
- package/SVF-doxygen/html/html/search/variables_7.js +0 -1
- package/SVF-doxygen/html/html/search/variables_c.js +1 -3
- package/SVF-doxygen/html/html/search/variables_d.js +1 -3
- package/SVF-doxygen/html/html/search/variables_e.js +2 -14
- package/SVF-doxygen/html/html/search/variables_f.js +0 -4
- 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 +3 -3
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01OfflineConsG_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +4 -4
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/wpa_8cpp.html +1 -1
- package/SVF-doxygen/html/html/wpa_8cpp_source.html +1 -1
- package/build.sh +1 -28
- package/include/MemoryModel/PointerAnalysis.h +0 -1
- package/include/MemoryModel/SVFVariables.h +11 -140
- package/include/SVF-FE/LLVMModule.h +0 -24
- package/include/Util/Options.h +0 -7
- package/include/WPA/FlowSensitive.h +0 -4
- package/lib/MemoryModel/PointerAnalysis.cpp +4 -22
- package/lib/MemoryModel/PointerAnalysisImpl.cpp +1 -1
- package/lib/MemoryModel/SVFVariables.cpp +1 -28
- package/lib/SVF-FE/CPPUtil.cpp +0 -7
- package/lib/Util/Options.cpp +0 -24
- package/lib/WPA/FlowSensitive.cpp +1 -75
- package/lib/WPA/WPAPass.cpp +0 -4
- package/package.json +1 -1
- package/include/WPA/FlowSensitiveTBHC.h +0 -122
- package/include/WPA/TypeBasedHeapCloning.h +0 -188
- package/lib/WPA/FlowSensitiveTBHC.cpp +0 -695
- package/lib/WPA/TypeBasedHeapCloning.cpp +0 -795
|
@@ -1,695 +0,0 @@
|
|
|
1
|
-
//===- FlowSensitiveTBHC.cpp -- flow-sensitive type filter ------------//
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
* FlowSensitiveTBHC.cpp
|
|
5
|
-
*
|
|
6
|
-
* Created on: Oct 08, 2019
|
|
7
|
-
* Author: Mohamad Barbar
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
#include "Util/Options.h"
|
|
11
|
-
#include "SVF-FE/BasicTypes.h"
|
|
12
|
-
#include "SVF-FE/DCHG.h"
|
|
13
|
-
#include "SVF-FE/CPPUtil.h"
|
|
14
|
-
#include "WPA/FlowSensitiveTBHC.h"
|
|
15
|
-
#include "WPA/WPAStat.h"
|
|
16
|
-
#include "WPA/Andersen.h"
|
|
17
|
-
#include "MemoryModel/PointsTo.h"
|
|
18
|
-
|
|
19
|
-
using namespace SVF;
|
|
20
|
-
|
|
21
|
-
FlowSensitiveTBHC::FlowSensitiveTBHC(SVFIR* _pag, PTATY type) : FlowSensitive(_pag, type), TypeBasedHeapCloning(this)
|
|
22
|
-
{
|
|
23
|
-
// Using `this` as the argument for TypeBasedHeapCloning is okay. As PointerAnalysis, it's
|
|
24
|
-
// already constructed. TypeBasedHeapCloning also doesn't use pta in the constructor so it
|
|
25
|
-
// just needs to be allocated, which it is.
|
|
26
|
-
allReuse = Options::TBHCAllReuse;
|
|
27
|
-
storeReuse = allReuse || Options::TBHCStoreReuse;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
void FlowSensitiveTBHC::analyze()
|
|
31
|
-
{
|
|
32
|
-
FlowSensitive::analyze();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
void FlowSensitiveTBHC::initialize()
|
|
36
|
-
{
|
|
37
|
-
PointerAnalysis::initialize();
|
|
38
|
-
AndersenWaveDiff* ander = AndersenWaveDiff::createAndersenWaveDiff(getPAG());
|
|
39
|
-
svfg = memSSA.buildFullSVFG(ander);
|
|
40
|
-
setGraph(svfg);
|
|
41
|
-
stat = new FlowSensitiveStat(this);
|
|
42
|
-
|
|
43
|
-
DCHGraph *dchg = SVFUtil::dyn_cast<DCHGraph>(getCHGraph());
|
|
44
|
-
assert(dchg != nullptr && "FSTBHC: DCHGraph required!");
|
|
45
|
-
|
|
46
|
-
TypeBasedHeapCloning::setDCHG(dchg);
|
|
47
|
-
TypeBasedHeapCloning::setPAG(pag);
|
|
48
|
-
|
|
49
|
-
// Populates loadGeps.
|
|
50
|
-
determineWhichGepsAreLoads();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
void FlowSensitiveTBHC::finalize(void)
|
|
54
|
-
{
|
|
55
|
-
FlowSensitive::finalize();
|
|
56
|
-
// ^ Will print call graph and alias stats.
|
|
57
|
-
|
|
58
|
-
if(print_stat)
|
|
59
|
-
dumpStats();
|
|
60
|
-
// getDFPTDataTy()->dumpPTData();
|
|
61
|
-
|
|
62
|
-
validateTBHCTests(svfMod);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
void FlowSensitiveTBHC::backPropagate(NodeID clone)
|
|
66
|
-
{
|
|
67
|
-
PAGNode *cloneObj = pag->getGNode(clone);
|
|
68
|
-
assert(cloneObj && "FSTBHC: clone does not exist in SVFIR?");
|
|
69
|
-
PAGNode *originalObj = pag->getGNode(getOriginalObj(clone));
|
|
70
|
-
assert(cloneObj && "FSTBHC: original object does not exist in SVFIR?");
|
|
71
|
-
// Check the original object too because when reuse of a gep occurs, the new object
|
|
72
|
-
// is an FI object.
|
|
73
|
-
if (SVFUtil::isa<CloneGepObjVar>(cloneObj) || SVFUtil::isa<GepObjVar>(originalObj))
|
|
74
|
-
{
|
|
75
|
-
// Since getGepObjClones is updated, some GEP nodes need to be redone.
|
|
76
|
-
const NodeBS &retrievers = gepToSVFGRetrievers[getOriginalObj(clone)];
|
|
77
|
-
for (NodeID r : retrievers)
|
|
78
|
-
{
|
|
79
|
-
pushIntoWorklist(r);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else if (SVFUtil::isa<CloneFIObjVar>(cloneObj) || SVFUtil::isa<CloneDummyObjVar>(cloneObj))
|
|
83
|
-
{
|
|
84
|
-
pushIntoWorklist(getAllocationSite(getOriginalObj(clone)));
|
|
85
|
-
}
|
|
86
|
-
else
|
|
87
|
-
{
|
|
88
|
-
assert(false && "FSTBHC: unexpected object type?");
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
bool FlowSensitiveTBHC::propAlongIndirectEdge(const IndirectSVFGEdge* edge)
|
|
93
|
-
{
|
|
94
|
-
SVFGNode* src = edge->getSrcNode();
|
|
95
|
-
SVFGNode* dst = edge->getDstNode();
|
|
96
|
-
|
|
97
|
-
bool changed = false;
|
|
98
|
-
|
|
99
|
-
// Get points-to targets may be used by next SVFG node.
|
|
100
|
-
// Propagate points-to set for node used in dst.
|
|
101
|
-
const NodeBS & pts = edge->getPointsTo();
|
|
102
|
-
|
|
103
|
-
// Since the base Andersen's analysis does NOT perform type-based heap cloning,
|
|
104
|
-
// it uses only the base objects; we want to account for clones too.
|
|
105
|
-
NodeBS edgePtsAndClones;
|
|
106
|
-
|
|
107
|
-
// TODO: the conditional bool may be unnecessary.
|
|
108
|
-
// Adding all clones is redundant, and introduces too many calls to propVarPts...
|
|
109
|
-
// This introduces performance and precision penalties.
|
|
110
|
-
// We should filter out according to src.
|
|
111
|
-
bool isStore = false;
|
|
112
|
-
const DIType *tildet = nullptr;
|
|
113
|
-
PointsTo storePts;
|
|
114
|
-
if (const StoreSVFGNode *store = SVFUtil::dyn_cast<StoreSVFGNode>(src))
|
|
115
|
-
{
|
|
116
|
-
tildet = getTypeFromCTirMetadata(store);
|
|
117
|
-
isStore = true;
|
|
118
|
-
storePts = getPts(store->getPAGDstNodeID());
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const PointsTo &filterSet = getFilterSet(src->getId());
|
|
122
|
-
for (NodeID o : pts)
|
|
123
|
-
{
|
|
124
|
-
if (!filterSet.test(o))
|
|
125
|
-
{
|
|
126
|
-
edgePtsAndClones.set(o);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
for (NodeID c : getClones(o))
|
|
130
|
-
{
|
|
131
|
-
if (!isStore)
|
|
132
|
-
{
|
|
133
|
-
if (!filterSet.test(c))
|
|
134
|
-
{
|
|
135
|
-
edgePtsAndClones.set(c);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
else
|
|
139
|
-
{
|
|
140
|
-
if (storePts.test(c) && !filterSet.test(c))
|
|
141
|
-
{
|
|
142
|
-
edgePtsAndClones.set(c);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (GepObjVar *gep = SVFUtil::dyn_cast<GepObjVar>(pag->getGNode(o)))
|
|
148
|
-
{
|
|
149
|
-
// Want the geps which are at the same "level" as this one (same mem obj, same offset).
|
|
150
|
-
const NodeBS &geps = getGepObjsFromMemObj(gep->getMemObj(), gep->getConstantFieldIdx());
|
|
151
|
-
for (NodeID g : geps)
|
|
152
|
-
{
|
|
153
|
-
const DIType *gepType = getType(g);
|
|
154
|
-
if (!isStore || gepType || isBase(tildet, gepType))
|
|
155
|
-
{
|
|
156
|
-
if (!filterSet.test(g))
|
|
157
|
-
{
|
|
158
|
-
edgePtsAndClones.set(g);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
for (NodeID o : edgePtsAndClones)
|
|
166
|
-
{
|
|
167
|
-
if (propVarPtsFromSrcToDst(o, src, dst))
|
|
168
|
-
changed = true;
|
|
169
|
-
|
|
170
|
-
if (isFIObjNode(o))
|
|
171
|
-
{
|
|
172
|
-
/// If this is a field-insensitive obj, propagate all field node's pts
|
|
173
|
-
const NodeBS &allFields = getAllFieldsObjVars(o);
|
|
174
|
-
for (NodeID f : allFields)
|
|
175
|
-
{
|
|
176
|
-
if (propVarPtsFromSrcToDst(f, src, dst))
|
|
177
|
-
changed = true;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return changed;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
bool FlowSensitiveTBHC::propAlongDirectEdge(const DirectSVFGEdge* edge)
|
|
186
|
-
{
|
|
187
|
-
double start = stat->getClk();
|
|
188
|
-
bool changed = false;
|
|
189
|
-
|
|
190
|
-
SVFGNode* src = edge->getSrcNode();
|
|
191
|
-
SVFGNode* dst = edge->getDstNode();
|
|
192
|
-
// If this is an actual-param or formal-ret, top-level pointer's pts must be
|
|
193
|
-
// propagated from src to dst.
|
|
194
|
-
if (ActualParmSVFGNode* ap = SVFUtil::dyn_cast<ActualParmSVFGNode>(src))
|
|
195
|
-
{
|
|
196
|
-
if (!ap->getParam()->isPointer()) return false;
|
|
197
|
-
changed = propagateFromAPToFP(ap, dst);
|
|
198
|
-
}
|
|
199
|
-
else if (FormalRetSVFGNode* fp = SVFUtil::dyn_cast<FormalRetSVFGNode>(src))
|
|
200
|
-
{
|
|
201
|
-
if (!fp->getRet()->isPointer()) return false;
|
|
202
|
-
changed = propagateFromFRToAR(fp, dst);
|
|
203
|
-
}
|
|
204
|
-
else
|
|
205
|
-
{
|
|
206
|
-
// Direct SVFG edge links between def and use of a top-level pointer.
|
|
207
|
-
// There's no points-to information propagated along direct edge.
|
|
208
|
-
// Since the top-level pointer's value has been changed at src node,
|
|
209
|
-
// return TRUE to put dst node into the work list.
|
|
210
|
-
changed = true;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
double end = stat->getClk();
|
|
214
|
-
directPropaTime += (end - start) / TIMEINTERVAL;
|
|
215
|
-
return changed;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
bool FlowSensitiveTBHC::processAddr(const AddrSVFGNode* addr)
|
|
219
|
-
{
|
|
220
|
-
double start = stat->getClk();
|
|
221
|
-
|
|
222
|
-
NodeID srcID = addr->getPAGSrcNodeID();
|
|
223
|
-
NodeID dstID = addr->getPAGDstNodeID();
|
|
224
|
-
|
|
225
|
-
double end = stat->getClk();
|
|
226
|
-
addrTime += (end - start) / TIMEINTERVAL;
|
|
227
|
-
|
|
228
|
-
if (!addr->getPAGEdge()->isPTAEdge()) return false;
|
|
229
|
-
|
|
230
|
-
bool changed = FlowSensitive::processAddr(addr);
|
|
231
|
-
|
|
232
|
-
start = stat->getClk();
|
|
233
|
-
|
|
234
|
-
const DIType *objType;
|
|
235
|
-
if (isHeapMemObj(srcID))
|
|
236
|
-
{
|
|
237
|
-
objType = undefType;
|
|
238
|
-
}
|
|
239
|
-
else if (pag->isConstantObj(srcID))
|
|
240
|
-
{
|
|
241
|
-
// Probably constants that have been merged into one.
|
|
242
|
-
// We make it undefined even though it's technically a global
|
|
243
|
-
// to keep in line with SVF's design.
|
|
244
|
-
// This will end up splitting into one for each type of constant.
|
|
245
|
-
objType = undefType;
|
|
246
|
-
}
|
|
247
|
-
else
|
|
248
|
-
{
|
|
249
|
-
// Stack/global.
|
|
250
|
-
objType = getTypeFromCTirMetadata(addr);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
setType(srcID, objType);
|
|
254
|
-
setAllocationSite(srcID, addr->getId());
|
|
255
|
-
|
|
256
|
-
// All the typed versions of srcID. This handles back-propagation.
|
|
257
|
-
const NodeBS &clones = getClones(srcID);
|
|
258
|
-
for (NodeID c : clones)
|
|
259
|
-
{
|
|
260
|
-
changed = addPts(dstID, c) || changed;
|
|
261
|
-
// No need for typing these are all clones; they are all typed.
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
end = stat->getClk();
|
|
265
|
-
addrTime += (end - start) / TIMEINTERVAL;
|
|
266
|
-
|
|
267
|
-
return changed;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
bool FlowSensitiveTBHC::processGep(const GepSVFGNode* gep)
|
|
271
|
-
{
|
|
272
|
-
// Copy of that in FlowSensitive.cpp + some changes.
|
|
273
|
-
double start = stat->getClk();
|
|
274
|
-
bool changed = false;
|
|
275
|
-
|
|
276
|
-
NodeID q = gep->getPAGSrcNodeID();
|
|
277
|
-
|
|
278
|
-
const DIType *tildet = getTypeFromCTirMetadata(gep);
|
|
279
|
-
if (tildet != undefType)
|
|
280
|
-
{
|
|
281
|
-
bool reuse = Options::TBHCAllReuse || (Options::TBHCStoreReuse && !gepIsLoad(gep->getId()));
|
|
282
|
-
changed = init(gep->getId(), q, tildet, reuse, true);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (!gep->getPAGEdge()->isPTAEdge())
|
|
286
|
-
{
|
|
287
|
-
return changed;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
const PointsTo& qPts = getPts(q);
|
|
291
|
-
PointsTo &filterSet = getFilterSet(gep->getId());
|
|
292
|
-
PointsTo tmpDstPts;
|
|
293
|
-
for (NodeID oq : qPts)
|
|
294
|
-
{
|
|
295
|
-
if (filterSet.test(oq)) continue;
|
|
296
|
-
|
|
297
|
-
if (TypeBasedHeapCloning::isBlkObjOrConstantObj(oq))
|
|
298
|
-
{
|
|
299
|
-
tmpDstPts.set(oq);
|
|
300
|
-
}
|
|
301
|
-
else
|
|
302
|
-
{
|
|
303
|
-
const GepStmt* gepStmt = SVFUtil::cast<GepStmt>(gep->getPAGEdge());
|
|
304
|
-
if (gepStmt->isVariantFieldGep())
|
|
305
|
-
{
|
|
306
|
-
setObjFieldInsensitive(oq);
|
|
307
|
-
tmpDstPts.set(oq);
|
|
308
|
-
const DIType *t = getType(oq);
|
|
309
|
-
if (t && (t->getTag() == dwarf::DW_TAG_array_type || t->getTag() == dwarf::DW_TAG_pointer_type))
|
|
310
|
-
{
|
|
311
|
-
const NodeBS fieldClones = getGepObjClones(oq, 1);
|
|
312
|
-
for (NodeID fc : fieldClones)
|
|
313
|
-
{
|
|
314
|
-
gepToSVFGRetrievers[getOriginalObj(fc)].set(gep->getId());
|
|
315
|
-
tmpDstPts.set(fc);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
else
|
|
320
|
-
{
|
|
321
|
-
const DIType *baseType = getType(oq);
|
|
322
|
-
|
|
323
|
-
// Drop down to field insensitive.
|
|
324
|
-
if (baseType == nullptr)
|
|
325
|
-
{
|
|
326
|
-
setObjFieldInsensitive(oq);
|
|
327
|
-
NodeID fiObj = oq;
|
|
328
|
-
tmpDstPts.set(fiObj);
|
|
329
|
-
continue;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
if (DCHGraph::isAgg(baseType) && baseType->getTag() != dwarf::DW_TAG_array_type
|
|
333
|
-
&& ((u32_t)gepStmt->getConstantFieldIdx() >= dchg->getNumFields(baseType)))
|
|
334
|
-
{
|
|
335
|
-
// If the field offset is too high for this object, it is killed. It seems that a
|
|
336
|
-
// clone was made on this GEP but this is not the base (e.g. base->f1->f2), and SVF
|
|
337
|
-
// expects to operate on the base (hence the large offset). The base will have been
|
|
338
|
-
// cloned at another GEP and back-propagated, thus it'll reach here safe and sound.
|
|
339
|
-
// We ignore arrays/pointers because those are array accesses/pointer arithmetic we
|
|
340
|
-
// assume are correct.
|
|
341
|
-
// Obviously, non-aggregates cannot have their fields taken so they are spurious.
|
|
342
|
-
filterSet.set(oq);
|
|
343
|
-
}
|
|
344
|
-
else
|
|
345
|
-
{
|
|
346
|
-
// Operate on the field and all its clones.
|
|
347
|
-
const NodeBS fieldClones = getGepObjClones(oq, gepStmt->getConstantFieldIdx());
|
|
348
|
-
for (NodeID fc : fieldClones)
|
|
349
|
-
{
|
|
350
|
-
gepToSVFGRetrievers[getOriginalObj(fc)].set(gep->getId());
|
|
351
|
-
tmpDstPts.set(fc);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
double end = stat->getClk();
|
|
359
|
-
gepTime += (end - start) / TIMEINTERVAL;
|
|
360
|
-
|
|
361
|
-
changed = unionPts(gep->getPAGDstNodeID(), tmpDstPts) || changed;
|
|
362
|
-
return changed;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
bool FlowSensitiveTBHC::processLoad(const LoadSVFGNode* load)
|
|
366
|
-
{
|
|
367
|
-
double start = stat->getClk();
|
|
368
|
-
|
|
369
|
-
bool changed = false;
|
|
370
|
-
const DIType *tildet = getTypeFromCTirMetadata(load);
|
|
371
|
-
if (tildet != undefType)
|
|
372
|
-
{
|
|
373
|
-
changed = init(load->getId(), load->getPAGSrcNodeID(), tildet, Options::TBHCAllReuse);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
// We want to perform the initialisation for non-pointer nodes but not process the load.
|
|
377
|
-
if (!load->getPAGEdge()->isPTAEdge())
|
|
378
|
-
{
|
|
379
|
-
return changed;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
NodeID dstVar = load->getPAGDstNodeID();
|
|
383
|
-
|
|
384
|
-
const PointsTo& srcPts = getPts(load->getPAGSrcNodeID());
|
|
385
|
-
const PointsTo &filterSet = getFilterSet(load->getId());
|
|
386
|
-
// unionPtsFromIn is going to call getOriginalObj on ptd anyway.
|
|
387
|
-
// This results in fewer loop iterations. o_t, o_s --> o.
|
|
388
|
-
PointsTo srcOriginalObjs;
|
|
389
|
-
for (NodeID s : srcPts)
|
|
390
|
-
{
|
|
391
|
-
if (filterSet.test(s)) continue;
|
|
392
|
-
if (pag->isConstantObj(s) || pag->isNonPointerObj(s)) continue;
|
|
393
|
-
srcOriginalObjs.set(getOriginalObj(s));
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
for (NodeID ptd : srcOriginalObjs)
|
|
397
|
-
{
|
|
398
|
-
// filterSet tests happened while building srcOriginalObjs.
|
|
399
|
-
if (unionPtsFromIn(load, ptd, dstVar))
|
|
400
|
-
changed = true;
|
|
401
|
-
|
|
402
|
-
if (isFIObjNode(ptd))
|
|
403
|
-
{
|
|
404
|
-
/// If the ptd is a field-insensitive node, we should also get all field nodes'
|
|
405
|
-
/// points-to sets and pass them to pagDst.
|
|
406
|
-
const NodeBS &allFields = getAllFieldsObjVars(ptd);
|
|
407
|
-
for (NodeID f : allFields)
|
|
408
|
-
{
|
|
409
|
-
if (unionPtsFromIn(load, f, dstVar))
|
|
410
|
-
changed = true;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
double end = stat->getClk();
|
|
416
|
-
loadTime += (end - start) / TIMEINTERVAL;
|
|
417
|
-
return changed;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
bool FlowSensitiveTBHC::processStore(const StoreSVFGNode* store)
|
|
421
|
-
{
|
|
422
|
-
double start = stat->getClk();
|
|
423
|
-
|
|
424
|
-
bool changed = false;
|
|
425
|
-
const DIType *tildet = getTypeFromCTirMetadata(store);
|
|
426
|
-
if (tildet != undefType)
|
|
427
|
-
{
|
|
428
|
-
changed = init(store->getId(), store->getPAGDstNodeID(), tildet, Options::TBHCAllReuse || Options::TBHCStoreReuse);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
// Like processLoad: we want to perform initialisation for non-pointers but not the store.
|
|
432
|
-
if (!store->getPAGEdge()->isPTAEdge())
|
|
433
|
-
{
|
|
434
|
-
// Pass through and return because there may be some pointer nodes
|
|
435
|
-
// relying on this node's parents.
|
|
436
|
-
changed = getDFPTDataTy()->updateAllDFOutFromIn(store->getId(), 0, false);
|
|
437
|
-
return changed;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const PointsTo & dstPts = getPts(store->getPAGDstNodeID());
|
|
441
|
-
|
|
442
|
-
/// STORE statement can only be processed if the pointer on the LHS
|
|
443
|
-
/// points to something. If we handle STORE with an empty points-to
|
|
444
|
-
/// set, the OUT set will be updated from IN set. Then if LHS pointer
|
|
445
|
-
/// points-to one target and it has been identified as a strong
|
|
446
|
-
/// update, we can't remove those points-to information computed
|
|
447
|
-
/// before this strong update from the OUT set.
|
|
448
|
-
if (dstPts.empty())
|
|
449
|
-
{
|
|
450
|
-
return changed;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
changed = false;
|
|
454
|
-
const PointsTo &filterSet = getFilterSet(store->getId());
|
|
455
|
-
if(getPts(store->getPAGSrcNodeID()).empty() == false)
|
|
456
|
-
{
|
|
457
|
-
for (NodeID ptd : dstPts)
|
|
458
|
-
{
|
|
459
|
-
if (filterSet.test(ptd)) continue;
|
|
460
|
-
|
|
461
|
-
if (pag->isConstantObj(ptd) || pag->isNonPointerObj(ptd))
|
|
462
|
-
continue;
|
|
463
|
-
|
|
464
|
-
if (unionPtsFromTop(store, store->getPAGSrcNodeID(), ptd))
|
|
465
|
-
changed = true;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
double end = stat->getClk();
|
|
470
|
-
storeTime += (end - start) / TIMEINTERVAL;
|
|
471
|
-
|
|
472
|
-
double updateStart = stat->getClk();
|
|
473
|
-
// also merge the DFInSet to DFOutSet.
|
|
474
|
-
/// check if this is a strong updates store
|
|
475
|
-
NodeID singleton;
|
|
476
|
-
bool isSU = isStrongUpdate(store, singleton);
|
|
477
|
-
if (isSU)
|
|
478
|
-
{
|
|
479
|
-
svfgHasSU.set(store->getId());
|
|
480
|
-
if (strongUpdateOutFromIn(store, singleton))
|
|
481
|
-
changed = true;
|
|
482
|
-
}
|
|
483
|
-
else
|
|
484
|
-
{
|
|
485
|
-
svfgHasSU.reset(store->getId());
|
|
486
|
-
if (weakUpdateOutFromIn(store))
|
|
487
|
-
changed = true;
|
|
488
|
-
}
|
|
489
|
-
double updateEnd = stat->getClk();
|
|
490
|
-
updateTime += (updateEnd - updateStart) / TIMEINTERVAL;
|
|
491
|
-
|
|
492
|
-
return changed;
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
bool FlowSensitiveTBHC::processPhi(const PHISVFGNode* phi)
|
|
496
|
-
{
|
|
497
|
-
if (!phi->isPTANode()) return false;
|
|
498
|
-
return FlowSensitive::processPhi(phi);
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
/// Returns whether this instruction initialisates an object's
|
|
502
|
-
/// vtable (metadata: ctir.vt.init). Returns the object's type,
|
|
503
|
-
/// otherwise, nullptr.
|
|
504
|
-
static const DIType *getVTInitType(const CopySVFGNode *copy, DCHGraph *dchg)
|
|
505
|
-
{
|
|
506
|
-
if (copy->getInst() == nullptr) return nullptr;
|
|
507
|
-
const Instruction *inst = copy->getInst();
|
|
508
|
-
|
|
509
|
-
const MDNode *mdNode = inst->getMetadata(cppUtil::ctir::vtInitMDName);
|
|
510
|
-
if (mdNode == nullptr) return nullptr;
|
|
511
|
-
|
|
512
|
-
const DIType *type = SVFUtil::dyn_cast<DIType>(mdNode);
|
|
513
|
-
assert(type != nullptr && "TBHC: bad ctir.vt.init metadata");
|
|
514
|
-
return dchg->getCanonicalType(type);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
bool FlowSensitiveTBHC::processCopy(const CopySVFGNode* copy)
|
|
518
|
-
{
|
|
519
|
-
const DIType *vtInitType = getVTInitType(copy, dchg);
|
|
520
|
-
bool changed = false;
|
|
521
|
-
if (vtInitType != nullptr)
|
|
522
|
-
{
|
|
523
|
-
// Setting the virtual table pointer.
|
|
524
|
-
changed = init(copy->getId(), copy->getPAGSrcNodeID(), vtInitType, true);
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
return FlowSensitive::processCopy(copy) || changed;
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
const NodeBS& FlowSensitiveTBHC::getAllFieldsObjVars(NodeID id)
|
|
531
|
-
{
|
|
532
|
-
return getGepObjs(id);
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
bool FlowSensitiveTBHC::updateInFromIn(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar)
|
|
536
|
-
{
|
|
537
|
-
// IN sets are only based on the original object.
|
|
538
|
-
return getDFPTDataTy()->updateDFInFromIn(srcStmt->getId(), getOriginalObj(srcVar),
|
|
539
|
-
dstStmt->getId(), getOriginalObj(dstVar));
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
bool FlowSensitiveTBHC::updateInFromOut(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar)
|
|
543
|
-
{
|
|
544
|
-
// OUT/IN sets only have original objects.
|
|
545
|
-
return getDFPTDataTy()->updateDFInFromOut(srcStmt->getId(), getOriginalObj(srcVar),
|
|
546
|
-
dstStmt->getId(), getOriginalObj(dstVar));
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
bool FlowSensitiveTBHC::unionPtsFromIn(const SVFGNode* stmt, NodeID srcVar, NodeID dstVar)
|
|
550
|
-
{
|
|
551
|
-
// IN sets only have original objects.
|
|
552
|
-
return getDFPTDataTy()->updateTLVPts(stmt->getId(), getOriginalObj(srcVar), dstVar);
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
bool FlowSensitiveTBHC::unionPtsFromTop(const SVFGNode* stmt, NodeID srcVar, NodeID dstVar)
|
|
556
|
-
{
|
|
557
|
-
// OUT sets only have original objects.
|
|
558
|
-
return getDFPTDataTy()->updateATVPts(srcVar, stmt->getId(), getOriginalObj(dstVar));
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
bool FlowSensitiveTBHC::propDFInToIn(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar)
|
|
562
|
-
{
|
|
563
|
-
// IN sets are only based on the original object.
|
|
564
|
-
return getDFPTDataTy()->updateAllDFInFromIn(srcStmt->getId(), getOriginalObj(srcVar),
|
|
565
|
-
dstStmt->getId(), getOriginalObj(dstVar));
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
bool FlowSensitiveTBHC::propDFOutToIn(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar)
|
|
569
|
-
{
|
|
570
|
-
// OUT/IN sets only have original objects.
|
|
571
|
-
return getDFPTDataTy()->updateAllDFInFromOut(srcStmt->getId(), getOriginalObj(srcVar),
|
|
572
|
-
dstStmt->getId(), getOriginalObj(dstVar));
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
void FlowSensitiveTBHC::determineWhichGepsAreLoads(void)
|
|
576
|
-
{
|
|
577
|
-
for (SVFG::iterator nI = svfg->begin(); nI != svfg->end(); ++nI)
|
|
578
|
-
{
|
|
579
|
-
SVFGNode *svfgNode = nI->second;
|
|
580
|
-
if (const StmtSVFGNode *gep = SVFUtil::dyn_cast<GepSVFGNode>(svfgNode))
|
|
581
|
-
{
|
|
582
|
-
// Only care about ctir nodes - they have the reuse problem.
|
|
583
|
-
if (getTypeFromCTirMetadata(gep))
|
|
584
|
-
{
|
|
585
|
-
bool isLoad = true;
|
|
586
|
-
for (const SVFGEdge *e : gep->getOutEdges())
|
|
587
|
-
{
|
|
588
|
-
SVFGNode *dst = e->getDstNode();
|
|
589
|
-
|
|
590
|
-
// Loop on itself - don't care.
|
|
591
|
-
if (gep == dst) continue;
|
|
592
|
-
|
|
593
|
-
if (!SVFUtil::isa<LoadSVFGNode>(dst))
|
|
594
|
-
{
|
|
595
|
-
isLoad = false;
|
|
596
|
-
break;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
if (isLoad)
|
|
601
|
-
{
|
|
602
|
-
loadGeps.set(gep->getId());
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
bool FlowSensitiveTBHC::gepIsLoad(NodeID gep)
|
|
610
|
-
{
|
|
611
|
-
// Handles when gep is not even a GEP; loadGeps only contains GEPs.
|
|
612
|
-
return loadGeps.test(gep);
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
const MDNode *FlowSensitiveTBHC::getRawCTirMetadata(const SVFGNode *s)
|
|
616
|
-
{
|
|
617
|
-
if (const StmtSVFGNode *stmt = SVFUtil::dyn_cast<StmtSVFGNode>(s))
|
|
618
|
-
{
|
|
619
|
-
const Value *v = stmt->getInst() ? stmt->getInst() : stmt->getPAGEdge()->getValue();
|
|
620
|
-
if (v != nullptr)
|
|
621
|
-
{
|
|
622
|
-
return TypeBasedHeapCloning::getRawCTirMetadata(v);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
return nullptr;
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
const DIType *FlowSensitiveTBHC::getTypeFromCTirMetadata(const SVFGNode *s)
|
|
630
|
-
{
|
|
631
|
-
if (const StmtSVFGNode *stmt = SVFUtil::dyn_cast<StmtSVFGNode>(s))
|
|
632
|
-
{
|
|
633
|
-
const Value *v = stmt->getInst();
|
|
634
|
-
if (v != nullptr)
|
|
635
|
-
{
|
|
636
|
-
return TypeBasedHeapCloning::getTypeFromCTirMetadata(v);
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
return nullptr;
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
void FlowSensitiveTBHC::expandFIObjs(const PointsTo& pts, PointsTo& expandedPts)
|
|
644
|
-
{
|
|
645
|
-
expandedPts = pts;
|
|
646
|
-
for (NodeID o : pts)
|
|
647
|
-
{
|
|
648
|
-
expandedPts |= getAllFieldsObjVars(o);
|
|
649
|
-
while (const GepObjVar *gepObj = SVFUtil::dyn_cast<GepObjVar>(pag->getGNode(o)))
|
|
650
|
-
{
|
|
651
|
-
expandedPts |= getAllFieldsObjVars(o);
|
|
652
|
-
o = gepObj->getBaseNode();
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
void FlowSensitiveTBHC::countAliases(Set<std::pair<NodeID, NodeID>> cmp, unsigned *mayAliases, unsigned *noAliases)
|
|
658
|
-
{
|
|
659
|
-
Map<std::pair<NodeID, NodeID>, PointsTo> filteredPts;
|
|
660
|
-
for (std::pair<NodeID, NodeID> locP : cmp)
|
|
661
|
-
{
|
|
662
|
-
const PointsTo &filterSet = getFilterSet(locP.first);
|
|
663
|
-
const PointsTo &pts = getPts(locP.second);
|
|
664
|
-
PointsTo &ptsFiltered = filteredPts[locP];
|
|
665
|
-
|
|
666
|
-
for (NodeID o : pts)
|
|
667
|
-
{
|
|
668
|
-
if (filterSet.test(o)) continue;
|
|
669
|
-
ptsFiltered.set(o);
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
for (std::pair<NodeID, NodeID> locPA : cmp)
|
|
674
|
-
{
|
|
675
|
-
const PointsTo &aPts = filteredPts[locPA];
|
|
676
|
-
for (std::pair<NodeID, NodeID> locPB : cmp)
|
|
677
|
-
{
|
|
678
|
-
if (locPB == locPA) continue;
|
|
679
|
-
const PointsTo &bPts = filteredPts[locPB];
|
|
680
|
-
|
|
681
|
-
switch (alias(aPts, bPts))
|
|
682
|
-
{
|
|
683
|
-
case AliasResult::NoAlias:
|
|
684
|
-
++(*noAliases);
|
|
685
|
-
break;
|
|
686
|
-
case AliasResult::MayAlias:
|
|
687
|
-
++(*mayAliases);
|
|
688
|
-
break;
|
|
689
|
-
default:
|
|
690
|
-
assert("Not May/NoAlias?");
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
}
|