svf-tools 1.0.333 → 1.0.337
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/AndersenSFR_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/Andersen_8h_source.html +2 -2
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +18 -9
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +4 -4
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
- 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 +3 -3
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +5 -2
- package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ICFGNode_8h_source.html +4 -4
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +17 -17
- package/SVF-doxygen/html/html/ICFG_8h_source.html +38 -37
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +3 -3
- package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +2 -2
- 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/MemRegion_8h_source.html +2 -2
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/MemSSA_8h_source.html +2 -2
- package/SVF-doxygen/html/html/OfflineConsG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PAGBuilderFromFile_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +5 -5
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +24 -27
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +42 -43
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp.html +1 -0
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +6 -5
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +50 -50
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +35 -35
- package/SVF-doxygen/html/html/SVFIR_8h_source.html +25 -25
- package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +22 -21
- package/SVF-doxygen/html/html/SVFStatements_8h.html +14 -12
- package/SVF-doxygen/html/html/SVFStatements_8h_source.html +131 -122
- package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +17 -17
- package/SVF-doxygen/html/html/SVFVariables_8h_source.html +131 -128
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +5 -4
- package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +3 -3
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/VFGNode_8h_source.html +13 -13
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +26 -26
- package/SVF-doxygen/html/html/VFG_8h_source.html +19 -18
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/annotated.html +271 -270
- package/SVF-doxygen/html/html/classSVF_1_1AddrStmt-members.html +16 -10
- package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +36 -14
- package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +187 -188
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +8 -11
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +160 -161
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +4 -7
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +199 -200
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +202 -203
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +195 -196
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +196 -197
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +205 -206
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +1 -4
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +193 -194
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1AssignStmt-members.html +145 -0
- package/SVF-doxygen/html/html/classSVF_1_1AssignStmt.html +770 -0
- package/SVF-doxygen/html/html/classSVF_1_1AssignStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +116 -117
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +12 -15
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt-members.html +7 -11
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +23 -142
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +46 -46
- package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode-members.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode.html +18 -18
- package/SVF-doxygen/html/html/classSVF_1_1CallPE-members.html +19 -13
- package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +44 -22
- package/SVF-doxygen/html/html/classSVF_1_1CallPE.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1CloneDummyObjVar-members.html +37 -40
- package/SVF-doxygen/html/html/classSVF_1_1CloneDummyObjVar.html +14 -22
- package/SVF-doxygen/html/html/classSVF_1_1CloneFIObjVar-members.html +37 -40
- package/SVF-doxygen/html/html/classSVF_1_1CloneFIObjVar.html +15 -23
- package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar-members.html +38 -41
- package/SVF-doxygen/html/html/classSVF_1_1CloneGepObjVar.html +15 -23
- package/SVF-doxygen/html/html/classSVF_1_1CmpStmt-members.html +7 -11
- package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +24 -143
- package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl-members.html +104 -105
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +5 -8
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +17 -10
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA-members.html +182 -183
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +13 -16
- package/SVF-doxygen/html/html/classSVF_1_1CopyStmt-members.html +16 -10
- package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +36 -14
- package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar-members.html +37 -40
- package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +16 -24
- package/SVF-doxygen/html/html/classSVF_1_1DummyValVar-members.html +36 -39
- package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +15 -23
- package/SVF-doxygen/html/html/classSVF_1_1FIObjVar-members.html +37 -40
- package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +21 -29
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +219 -220
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +180 -181
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +10 -13
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +212 -213
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +18 -21
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +244 -245
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +8 -11
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.html +3 -9
- package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar-members.html +39 -42
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +39 -47
- package/SVF-doxygen/html/html/classSVF_1_1GepStmt-members.html +16 -10
- package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +42 -20
- package/SVF-doxygen/html/html/classSVF_1_1GepStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GepValVar-members.html +37 -40
- package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +32 -40
- package/SVF-doxygen/html/html/classSVF_1_1ICFG-members.html +27 -26
- package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +183 -116
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +10 -5
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter-members.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +37 -36
- 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_1LeakChecker.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LoadStmt-members.html +16 -10
- package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +37 -15
- package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt-members.html +36 -29
- package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt.html +252 -33
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepStmt-members.html +17 -11
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepStmt.html +40 -18
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar-members.html +37 -40
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +34 -42
- package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PhiStmt-members.html +41 -44
- package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +32 -127
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis-members.html +78 -79
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +111 -151
- package/SVF-doxygen/html/html/classSVF_1_1RetPE-members.html +16 -10
- package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +44 -22
- package/SVF-doxygen/html/html/classSVF_1_1RetPE.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1RetPN-members.html +36 -39
- package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +16 -24
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +39 -39
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +122 -115
- package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.html +12 -8
- package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1SVFVar-members.html +28 -25
- package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +185 -107
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +171 -172
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1StoreStmt-members.html +16 -10
- package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +37 -15
- package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +13 -9
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE-members.html +18 -12
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +36 -14
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE-members.html +17 -11
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +36 -14
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +161 -162
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +3 -6
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +17 -17
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +38 -38
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +36 -36
- package/SVF-doxygen/html/html/classSVF_1_1ValVar-members.html +36 -39
- package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +19 -27
- package/SVF-doxygen/html/html/classSVF_1_1VarArgPN-members.html +36 -39
- package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +16 -24
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepStmt-members.html +17 -11
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepStmt.html +38 -16
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +254 -255
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +2 -2
- package/SVF-doxygen/html/html/classes.html +91 -93
- package/SVF-doxygen/html/html/functions_a.html +14 -11
- package/SVF-doxygen/html/html/functions_c.html +16 -15
- package/SVF-doxygen/html/html/functions_d.html +0 -3
- package/SVF-doxygen/html/html/functions_func.html +7 -4
- package/SVF-doxygen/html/html/functions_func_c.html +24 -23
- package/SVF-doxygen/html/html/functions_func_d.html +0 -3
- package/SVF-doxygen/html/html/functions_func_g.html +27 -19
- package/SVF-doxygen/html/html/functions_func_i.html +13 -10
- package/SVF-doxygen/html/html/functions_func_o.html +5 -3
- package/SVF-doxygen/html/html/functions_func_t.html +1 -0
- package/SVF-doxygen/html/html/functions_g.html +31 -23
- package/SVF-doxygen/html/html/functions_i.html +11 -6
- package/SVF-doxygen/html/html/functions_l.html +3 -3
- package/SVF-doxygen/html/html/functions_m.html +1 -1
- package/SVF-doxygen/html/html/functions_n.html +3 -3
- package/SVF-doxygen/html/html/functions_o.html +11 -9
- package/SVF-doxygen/html/html/functions_p.html +15 -11
- package/SVF-doxygen/html/html/functions_rela.html +59 -1
- package/SVF-doxygen/html/html/functions_s.html +9 -8
- package/SVF-doxygen/html/html/functions_t.html +5 -4
- package/SVF-doxygen/html/html/functions_type.html +2 -2
- package/SVF-doxygen/html/html/functions_v.html +8 -7
- package/SVF-doxygen/html/html/functions_vars_a.html +1 -1
- package/SVF-doxygen/html/html/functions_w.html +9 -5
- package/SVF-doxygen/html/html/hierarchy.html +17 -16
- package/SVF-doxygen/html/html/menudata.js +13 -1
- package/SVF-doxygen/html/html/namespaceSVF.html +2 -0
- package/SVF-doxygen/html/html/search/all_1.js +3 -2
- package/SVF-doxygen/html/html/search/all_10.js +9 -9
- package/SVF-doxygen/html/html/search/all_12.js +1 -1
- package/SVF-doxygen/html/html/search/all_13.js +6 -6
- package/SVF-doxygen/html/html/search/all_14.js +7 -7
- package/SVF-doxygen/html/html/search/all_16.js +2 -2
- package/SVF-doxygen/html/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/html/search/all_3.js +2 -2
- package/SVF-doxygen/html/html/search/all_4.js +0 -1
- package/SVF-doxygen/html/html/search/all_7.js +9 -5
- package/SVF-doxygen/html/html/search/all_9.js +3 -2
- package/SVF-doxygen/html/html/search/all_c.js +2 -2
- package/SVF-doxygen/html/html/search/all_d.js +2 -2
- package/SVF-doxygen/html/html/search/all_e.js +2 -2
- package/SVF-doxygen/html/html/search/all_f.js +2 -2
- package/SVF-doxygen/html/html/search/classes_0.js +2 -1
- package/SVF-doxygen/html/html/search/functions_0.js +1 -0
- package/SVF-doxygen/html/html/search/functions_11.js +1 -1
- package/SVF-doxygen/html/html/search/functions_2.js +1 -1
- package/SVF-doxygen/html/html/search/functions_3.js +0 -1
- package/SVF-doxygen/html/html/search/functions_6.js +9 -5
- package/SVF-doxygen/html/html/search/functions_8.js +1 -0
- package/SVF-doxygen/html/html/search/functions_b.js +1 -1
- package/SVF-doxygen/html/html/search/functions_d.js +1 -1
- package/SVF-doxygen/html/html/search/functions_e.js +1 -1
- package/SVF-doxygen/html/html/search/related_4.js +2 -2
- package/SVF-doxygen/html/html/search/related_5.js +2 -1
- package/SVF-doxygen/html/html/search/related_6.js +1 -4
- package/SVF-doxygen/html/html/search/related_7.js +4 -1
- package/SVF-doxygen/html/html/search/related_8.js +1 -5
- package/SVF-doxygen/html/html/search/related_9.js +6 -2
- package/SVF-doxygen/html/html/search/related_a.js +2 -1
- package/SVF-doxygen/html/html/search/related_b.html +26 -0
- package/SVF-doxygen/html/html/search/related_b.js +5 -0
- package/SVF-doxygen/html/html/search/searchdata.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_0.js +1 -1
- package/SVF-doxygen/html/html/search/variables_1.js +1 -1
- package/SVF-doxygen/html/html/search/variables_14.js +3 -3
- package/SVF-doxygen/html/html/search/variables_d.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_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/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1ICFGNode_01_5_01_4_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFGNode_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1ICFG_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +3 -3
- package/images/svf-stat.pdf +0 -0
- package/include/Graphs/ICFG.h +5 -3
- package/include/Graphs/ICFGNode.h +3 -3
- package/include/Graphs/VFG.h +4 -4
- package/include/MemoryModel/PointerAnalysis.h +0 -3
- package/include/MemoryModel/SVFStatements.h +382 -308
- package/include/MemoryModel/SVFVariables.h +22 -21
- package/lib/Graphs/ConsG.cpp +24 -24
- package/lib/Graphs/ICFG.cpp +2 -2
- package/lib/Graphs/VFG.cpp +10 -10
- package/lib/MSSA/MemRegion.cpp +5 -5
- package/lib/MemoryModel/PointerAnalysis.cpp +1 -21
- package/lib/MemoryModel/SVFIR.cpp +2 -2
- package/lib/MemoryModel/SVFStatements.cpp +21 -12
- package/lib/SVF-FE/ICFGBuilder.cpp +17 -2
- package/lib/SVF-FE/SVFIRBuilder.cpp +13 -0
- package/lib/SVF-FE/SymbolTableBuilder.cpp +16 -3
- package/package.json +1 -1
|
@@ -190,16 +190,89 @@ private:
|
|
|
190
190
|
static u64_t multiOpndLabelCounter; ///< MultiOpndStmt counter
|
|
191
191
|
};
|
|
192
192
|
|
|
193
|
+
/*
|
|
194
|
+
Parent class of Addr, Copy, Store, Load, Call, Ret, NormalGep, VariantGep, ThreadFork, ThreadJoin
|
|
195
|
+
connecting RHS expression and LHS expression with an assignment (e.g., LHSExpr = RHSExpr)
|
|
196
|
+
Only one operand on the right handside of an assignment
|
|
197
|
+
*/
|
|
198
|
+
class AssignStmt : public SVFStmt{
|
|
199
|
+
|
|
200
|
+
private:
|
|
201
|
+
AssignStmt(); ///< place holder
|
|
202
|
+
AssignStmt(const AssignStmt &); ///< place holder
|
|
203
|
+
void operator=(const AssignStmt &); ///< place holder
|
|
204
|
+
SVFVar* getSrcNode(); ///< not allowed, use getRHSVar() instead
|
|
205
|
+
SVFVar* getDstNode(); ///< not allowed, use getLHSVar() instead
|
|
206
|
+
NodeID getSrcID(); ///< not allowed, use getRHSVarID() instead
|
|
207
|
+
NodeID getDstID(); ///< not allowed, use getLHSVarID() instead
|
|
208
|
+
|
|
209
|
+
protected:
|
|
210
|
+
/// constructor
|
|
211
|
+
AssignStmt(SVFVar* s, SVFVar* d, GEdgeFlag k) : SVFStmt(s,d,k)
|
|
212
|
+
{
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public:
|
|
216
|
+
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
217
|
+
//@{
|
|
218
|
+
static inline bool classof(const AssignStmt *)
|
|
219
|
+
{
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
static inline bool classof(const SVFStmt *edge)
|
|
223
|
+
{
|
|
224
|
+
return edge->getEdgeKind() == SVFStmt::Addr ||
|
|
225
|
+
edge->getEdgeKind() == SVFStmt::Copy ||
|
|
226
|
+
edge->getEdgeKind() == SVFStmt::Store ||
|
|
227
|
+
edge->getEdgeKind() == SVFStmt::Load ||
|
|
228
|
+
edge->getEdgeKind() == SVFStmt::Call ||
|
|
229
|
+
edge->getEdgeKind() == SVFStmt::Ret ||
|
|
230
|
+
edge->getEdgeKind() == SVFStmt::NormalGep ||
|
|
231
|
+
edge->getEdgeKind() == SVFStmt::VariantGep ||
|
|
232
|
+
edge->getEdgeKind() == SVFStmt::ThreadFork ||
|
|
233
|
+
edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
234
|
+
}
|
|
235
|
+
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
236
|
+
{
|
|
237
|
+
return edge->getEdgeKind() == SVFStmt::Addr ||
|
|
238
|
+
edge->getEdgeKind() == SVFStmt::Copy ||
|
|
239
|
+
edge->getEdgeKind() == SVFStmt::Store ||
|
|
240
|
+
edge->getEdgeKind() == SVFStmt::Load ||
|
|
241
|
+
edge->getEdgeKind() == SVFStmt::Call ||
|
|
242
|
+
edge->getEdgeKind() == SVFStmt::Ret ||
|
|
243
|
+
edge->getEdgeKind() == SVFStmt::NormalGep ||
|
|
244
|
+
edge->getEdgeKind() == SVFStmt::VariantGep ||
|
|
245
|
+
edge->getEdgeKind() == SVFStmt::ThreadFork ||
|
|
246
|
+
edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
247
|
+
}
|
|
248
|
+
//@}
|
|
249
|
+
|
|
250
|
+
inline SVFVar* getRHSVar() const {
|
|
251
|
+
return SVFStmt::getSrcNode();
|
|
252
|
+
}
|
|
253
|
+
inline SVFVar* getLHSVar() const {
|
|
254
|
+
return SVFStmt::getDstNode();
|
|
255
|
+
}
|
|
256
|
+
inline NodeID getRHSVarID() const {
|
|
257
|
+
return SVFStmt::getSrcID();
|
|
258
|
+
}
|
|
259
|
+
inline NodeID getLHSVarID() const {
|
|
260
|
+
return SVFStmt::getDstID();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
virtual const std::string toString() const = 0;
|
|
264
|
+
};
|
|
193
265
|
|
|
194
266
|
/*!
|
|
195
267
|
* Address statement (memory allocations)
|
|
196
268
|
*/
|
|
197
|
-
class AddrStmt: public
|
|
269
|
+
class AddrStmt: public AssignStmt
|
|
198
270
|
{
|
|
199
271
|
private:
|
|
200
272
|
AddrStmt(); ///< place holder
|
|
201
273
|
AddrStmt(const AddrStmt &); ///< place holder
|
|
202
274
|
void operator=(const AddrStmt &); ///< place holder
|
|
275
|
+
|
|
203
276
|
public:
|
|
204
277
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
205
278
|
//@{
|
|
@@ -218,7 +291,7 @@ public:
|
|
|
218
291
|
//@}
|
|
219
292
|
|
|
220
293
|
/// constructor
|
|
221
|
-
AddrStmt(SVFVar* s, SVFVar* d) :
|
|
294
|
+
AddrStmt(SVFVar* s, SVFVar* d) : AssignStmt(s,d,SVFStmt::Addr)
|
|
222
295
|
{
|
|
223
296
|
}
|
|
224
297
|
|
|
@@ -229,7 +302,7 @@ public:
|
|
|
229
302
|
/*!
|
|
230
303
|
* Copy statements (simple assignment and casting)
|
|
231
304
|
*/
|
|
232
|
-
class CopyStmt: public
|
|
305
|
+
class CopyStmt: public AssignStmt
|
|
233
306
|
{
|
|
234
307
|
private:
|
|
235
308
|
CopyStmt(); ///< place holder
|
|
@@ -253,646 +326,647 @@ public:
|
|
|
253
326
|
//@}
|
|
254
327
|
|
|
255
328
|
/// constructor
|
|
256
|
-
CopyStmt(SVFVar* s, SVFVar* d) :
|
|
329
|
+
CopyStmt(SVFVar* s, SVFVar* d) : AssignStmt(s,d,SVFStmt::Copy)
|
|
257
330
|
{
|
|
258
331
|
}
|
|
259
332
|
|
|
260
333
|
virtual const std::string toString() const override;
|
|
261
334
|
};
|
|
262
335
|
|
|
263
|
-
|
|
264
|
-
*
|
|
265
|
-
*/
|
|
266
|
-
class
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
336
|
+
/*!
|
|
337
|
+
* Store statement
|
|
338
|
+
*/
|
|
339
|
+
class StoreStmt: public AssignStmt
|
|
340
|
+
{
|
|
341
|
+
private:
|
|
342
|
+
StoreStmt(); ///< place holder
|
|
343
|
+
StoreStmt(const StoreStmt &); ///< place holder
|
|
344
|
+
void operator=(const StoreStmt &); ///< place holder
|
|
345
|
+
|
|
271
346
|
public:
|
|
272
|
-
/// Constructor, only used by subclassess but not external users
|
|
273
|
-
MultiOpndStmt(SVFVar* r, const OPVars& opnds, GEdgeFlag k): SVFStmt(opnds.at(0), r, k), opVars(opnds)
|
|
274
|
-
{
|
|
275
|
-
}
|
|
276
347
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
277
348
|
//@{
|
|
278
|
-
static inline bool classof(const
|
|
349
|
+
static inline bool classof(const StoreStmt *)
|
|
279
350
|
{
|
|
280
351
|
return true;
|
|
281
352
|
}
|
|
282
|
-
static inline bool classof(const SVFStmt *
|
|
353
|
+
static inline bool classof(const SVFStmt *edge)
|
|
283
354
|
{
|
|
284
|
-
return
|
|
285
|
-
node->getEdgeKind() == BinaryOp ||
|
|
286
|
-
node->getEdgeKind() == Cmp;
|
|
355
|
+
return edge->getEdgeKind() == SVFStmt::Store;
|
|
287
356
|
}
|
|
288
|
-
static inline bool classof(const GenericPAGEdgeTy *
|
|
357
|
+
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
289
358
|
{
|
|
290
|
-
return
|
|
291
|
-
node->getEdgeKind() == BinaryOp ||
|
|
292
|
-
node->getEdgeKind() == Cmp;
|
|
359
|
+
return edge->getEdgeKind() == SVFStmt::Store;
|
|
293
360
|
}
|
|
294
361
|
//@}
|
|
295
|
-
/// Operands and result at a BinaryNode e.g., p = q + r, `p` is resVar and `r` is OpVar
|
|
296
|
-
//@{
|
|
297
|
-
/// Operand SVFVars
|
|
298
|
-
inline const SVFVar* getOpVar(u32_t pos) const
|
|
299
|
-
{
|
|
300
|
-
return opVars.at(pos);
|
|
301
|
-
}
|
|
302
|
-
/// Result SVFVar
|
|
303
|
-
inline const SVFVar* getRes() const
|
|
304
|
-
{
|
|
305
|
-
return getDstNode();
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
NodeID getOpVarID(u32_t pos) const;
|
|
309
|
-
NodeID getResID() const;
|
|
310
362
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
315
|
-
inline const OPVars& getOpndVars() const{
|
|
316
|
-
return opVars;
|
|
317
|
-
}
|
|
318
|
-
inline OPVars::const_iterator opVarBegin() const
|
|
319
|
-
{
|
|
320
|
-
return opVars.begin();
|
|
321
|
-
}
|
|
322
|
-
inline OPVars::const_iterator opVerEnd() const
|
|
363
|
+
/// constructor
|
|
364
|
+
StoreStmt(SVFVar* s, SVFVar* d, const IntraBlockNode* st) :
|
|
365
|
+
AssignStmt(s, d, makeEdgeFlagWithStoreInst(SVFStmt::Store, st))
|
|
323
366
|
{
|
|
324
|
-
return opVars.end();
|
|
325
367
|
}
|
|
326
|
-
|
|
368
|
+
|
|
369
|
+
virtual const std::string toString() const override;
|
|
327
370
|
};
|
|
328
371
|
|
|
372
|
+
|
|
329
373
|
/*!
|
|
330
|
-
*
|
|
331
|
-
* it is typically at a joint point of the control-flow graph
|
|
374
|
+
* Load statement
|
|
332
375
|
*/
|
|
333
|
-
class
|
|
376
|
+
class LoadStmt: public AssignStmt
|
|
334
377
|
{
|
|
335
378
|
private:
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
void operator=(const
|
|
339
|
-
SVFVar* getSrcNode(); ///< place holder, not allowed since this SVFStmt has multiple operands but not a single source
|
|
340
|
-
SVFVar* getDstNode(); ///< place holder, use getRes() instead
|
|
341
|
-
SVFVar* getSrcID(); ///< place holder, use getOpVarID(pos) instead
|
|
342
|
-
SVFVar* getDstID(); ///< place holder, use getResID() instead
|
|
379
|
+
LoadStmt(); ///< place holder
|
|
380
|
+
LoadStmt(const LoadStmt &); ///< place holder
|
|
381
|
+
void operator=(const LoadStmt &); ///< place holder
|
|
343
382
|
|
|
344
383
|
public:
|
|
345
384
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
346
385
|
//@{
|
|
347
|
-
static inline bool classof(const
|
|
386
|
+
static inline bool classof(const LoadStmt *)
|
|
348
387
|
{
|
|
349
388
|
return true;
|
|
350
389
|
}
|
|
351
390
|
static inline bool classof(const SVFStmt *edge)
|
|
352
391
|
{
|
|
353
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
354
|
-
}
|
|
355
|
-
static inline bool classof(const MultiOpndStmt *edge)
|
|
356
|
-
{
|
|
357
|
-
return edge->getEdgeKind() == SVFStmt::Phi;
|
|
392
|
+
return edge->getEdgeKind() == SVFStmt::Load;
|
|
358
393
|
}
|
|
359
394
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
360
395
|
{
|
|
361
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
396
|
+
return edge->getEdgeKind() == SVFStmt::Load;
|
|
362
397
|
}
|
|
363
398
|
//@}
|
|
364
399
|
|
|
365
400
|
/// constructor
|
|
366
|
-
|
|
401
|
+
LoadStmt(SVFVar* s, SVFVar* d) : AssignStmt(s,d,SVFStmt::Load)
|
|
367
402
|
{
|
|
368
403
|
}
|
|
369
|
-
|
|
370
|
-
opVars.push_back(op);
|
|
371
|
-
}
|
|
404
|
+
|
|
372
405
|
virtual const std::string toString() const override;
|
|
373
406
|
};
|
|
374
407
|
|
|
375
408
|
|
|
376
409
|
/*!
|
|
377
|
-
*
|
|
410
|
+
* Gep statement for struct field access, array access and pointer arithmetic
|
|
378
411
|
*/
|
|
379
|
-
class
|
|
412
|
+
class GepStmt: public AssignStmt
|
|
380
413
|
{
|
|
381
414
|
private:
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
void operator=(const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
SVFVar* getSrcID(); ///< place holder, use getOpVarID(pos) instead
|
|
388
|
-
SVFVar* getDstID(); ///< place holder, use getResID() instead
|
|
415
|
+
GepStmt(); ///< place holder
|
|
416
|
+
GepStmt(const GepStmt &); ///< place holder
|
|
417
|
+
void operator=(const GepStmt &); ///< place holder
|
|
418
|
+
|
|
419
|
+
LocationSet ls; ///< location set of the gep edge
|
|
389
420
|
|
|
390
|
-
u32_t predicate;
|
|
391
421
|
public:
|
|
392
422
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
393
423
|
//@{
|
|
394
|
-
static inline bool classof(const
|
|
424
|
+
static inline bool classof(const GepStmt *)
|
|
395
425
|
{
|
|
396
426
|
return true;
|
|
397
427
|
}
|
|
398
428
|
static inline bool classof(const SVFStmt *edge)
|
|
399
429
|
{
|
|
400
|
-
return
|
|
401
|
-
|
|
402
|
-
static inline bool classof(const MultiOpndStmt *edge)
|
|
403
|
-
{
|
|
404
|
-
return edge->getEdgeKind() == SVFStmt::Cmp;
|
|
430
|
+
return edge->getEdgeKind() == SVFStmt::NormalGep ||
|
|
431
|
+
edge->getEdgeKind() == SVFStmt::VariantGep;
|
|
405
432
|
}
|
|
406
433
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
407
434
|
{
|
|
408
|
-
return
|
|
435
|
+
return edge->getEdgeKind() == SVFStmt::NormalGep ||
|
|
436
|
+
edge->getEdgeKind() == SVFStmt::VariantGep;
|
|
409
437
|
}
|
|
410
438
|
//@}
|
|
411
439
|
|
|
412
|
-
|
|
413
|
-
CmpStmt(SVFVar* s, const OPVars& opnds, u32_t pre) : MultiOpndStmt(s,opnds,SVFStmt::Cmp), predicate(pre)
|
|
440
|
+
inline const LocationSet& getLocationSet() const
|
|
414
441
|
{
|
|
442
|
+
return ls;
|
|
415
443
|
}
|
|
416
444
|
|
|
417
|
-
|
|
445
|
+
protected:
|
|
446
|
+
/// constructor
|
|
447
|
+
GepStmt(SVFVar* s, SVFVar* d, const LocationSet& l, PEDGEK k) : AssignStmt(s,d,k), ls(l)
|
|
418
448
|
{
|
|
419
|
-
return predicate;
|
|
420
449
|
}
|
|
421
|
-
|
|
422
|
-
virtual const std::string toString() const
|
|
450
|
+
|
|
451
|
+
virtual const std::string toString() const;
|
|
452
|
+
|
|
423
453
|
};
|
|
424
454
|
|
|
425
455
|
|
|
426
456
|
/*!
|
|
427
|
-
*
|
|
457
|
+
* Gep statement with a fixed field index for struct field access
|
|
428
458
|
*/
|
|
429
|
-
class
|
|
459
|
+
class NormalGepStmt : public GepStmt
|
|
430
460
|
{
|
|
431
461
|
private:
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
void operator=(const
|
|
435
|
-
SVFVar* getSrcNode(); ///< place holder, not allowed since this SVFStmt has multiple operands but not a single source
|
|
436
|
-
SVFVar* getDstNode(); ///< place holder, use getRes() instead
|
|
437
|
-
SVFVar* getSrcID(); ///< place holder, use getOpVarID(pos) instead
|
|
438
|
-
SVFVar* getDstID(); ///< place holder, use getResID() instead
|
|
439
|
-
|
|
440
|
-
u32_t opcode;
|
|
462
|
+
NormalGepStmt(); ///< place holder
|
|
463
|
+
NormalGepStmt(const NormalGepStmt&); ///< place holder
|
|
464
|
+
void operator=(const NormalGepStmt&); ///< place holder
|
|
441
465
|
|
|
442
466
|
public:
|
|
443
467
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
444
468
|
//@{
|
|
445
|
-
static inline bool classof(const
|
|
469
|
+
static inline bool classof(const NormalGepStmt *)
|
|
446
470
|
{
|
|
447
471
|
return true;
|
|
448
472
|
}
|
|
449
|
-
static inline bool classof(const
|
|
473
|
+
static inline bool classof(const GepStmt *edge)
|
|
450
474
|
{
|
|
451
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
475
|
+
return edge->getEdgeKind() == SVFStmt::NormalGep;
|
|
452
476
|
}
|
|
453
|
-
static inline bool classof(const
|
|
477
|
+
static inline bool classof(const SVFStmt *edge)
|
|
454
478
|
{
|
|
455
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
479
|
+
return edge->getEdgeKind() == SVFStmt::NormalGep;
|
|
456
480
|
}
|
|
457
481
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
458
482
|
{
|
|
459
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
483
|
+
return edge->getEdgeKind() == SVFStmt::NormalGep;
|
|
460
484
|
}
|
|
461
485
|
//@}
|
|
462
486
|
|
|
463
487
|
/// constructor
|
|
464
|
-
|
|
465
|
-
{
|
|
466
|
-
}
|
|
488
|
+
NormalGepStmt(SVFVar* s, SVFVar* d, const LocationSet& l) : GepStmt(s,d,l, SVFStmt::NormalGep)
|
|
489
|
+
{}
|
|
467
490
|
|
|
468
|
-
|
|
491
|
+
/// offset of the gep edge
|
|
492
|
+
inline u32_t getFieldOffset() const
|
|
469
493
|
{
|
|
470
|
-
return
|
|
494
|
+
return getLocationSet().accumulateConstantFieldIdx();
|
|
471
495
|
}
|
|
472
496
|
|
|
473
497
|
virtual const std::string toString() const override;
|
|
474
498
|
};
|
|
475
499
|
|
|
476
500
|
/*!
|
|
477
|
-
*
|
|
501
|
+
* Gep statement with a variant field index for struct field access
|
|
478
502
|
*/
|
|
479
|
-
class
|
|
503
|
+
class VariantGepStmt : public GepStmt
|
|
480
504
|
{
|
|
481
505
|
private:
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
void operator=(const
|
|
485
|
-
SVFVar* getSrcNode(); ///< place holder, use getOpVar() instead
|
|
486
|
-
SVFVar* getDstNode(); ///< place holder, use getRes() instead
|
|
487
|
-
SVFVar* getSrcID(); ///< place holder, use getOpVarID() instead
|
|
488
|
-
SVFVar* getDstID(); ///< place holder, use getResID() instead
|
|
506
|
+
VariantGepStmt(); ///< place holder
|
|
507
|
+
VariantGepStmt(const VariantGepStmt&); ///< place holder
|
|
508
|
+
void operator=(const VariantGepStmt&); ///< place holder
|
|
489
509
|
|
|
490
|
-
u32_t opcode;
|
|
491
510
|
public:
|
|
492
511
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
493
512
|
//@{
|
|
494
|
-
static inline bool classof(const
|
|
513
|
+
static inline bool classof(const VariantGepStmt *)
|
|
495
514
|
{
|
|
496
515
|
return true;
|
|
497
516
|
}
|
|
517
|
+
static inline bool classof(const GepStmt *edge)
|
|
518
|
+
{
|
|
519
|
+
return edge->getEdgeKind() == SVFStmt::VariantGep;
|
|
520
|
+
}
|
|
498
521
|
static inline bool classof(const SVFStmt *edge)
|
|
499
522
|
{
|
|
500
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
523
|
+
return edge->getEdgeKind() == SVFStmt::VariantGep;
|
|
501
524
|
}
|
|
502
525
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
503
526
|
{
|
|
504
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
527
|
+
return edge->getEdgeKind() == SVFStmt::VariantGep;
|
|
505
528
|
}
|
|
506
529
|
//@}
|
|
507
530
|
|
|
508
531
|
/// constructor
|
|
509
|
-
|
|
510
|
-
{
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
u32_t getOpcode() const
|
|
514
|
-
{
|
|
515
|
-
return opcode;
|
|
516
|
-
}
|
|
517
|
-
inline const SVFVar* getOpVar() const{
|
|
518
|
-
return SVFStmt::getSrcNode();
|
|
519
|
-
}
|
|
520
|
-
inline const SVFVar* getRes() const{
|
|
521
|
-
return SVFStmt::getDstNode();
|
|
522
|
-
}
|
|
523
|
-
NodeID getOpVarID() const;
|
|
524
|
-
NodeID getResID() const;
|
|
532
|
+
VariantGepStmt(SVFVar* s, SVFVar* d, const LocationSet& l) : GepStmt(s,d,l, SVFStmt::VariantGep) {}
|
|
525
533
|
|
|
526
534
|
virtual const std::string toString() const override;
|
|
535
|
+
|
|
527
536
|
};
|
|
528
537
|
|
|
529
538
|
|
|
530
539
|
/*!
|
|
531
|
-
*
|
|
540
|
+
* Call
|
|
532
541
|
*/
|
|
533
|
-
class
|
|
542
|
+
class CallPE: public AssignStmt
|
|
534
543
|
{
|
|
535
544
|
private:
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
void operator=(const
|
|
539
|
-
SVFVar* getSrcNode(); ///< place holder, not allowed
|
|
540
|
-
SVFVar* getDstNode(); ///< place holder, not allowed
|
|
541
|
-
SVFVar* getSrcID(); ///< place holder, not allowed
|
|
542
|
-
SVFVar* getDstID(); ///< place holder, not allowed
|
|
545
|
+
CallPE(); ///< place holder
|
|
546
|
+
CallPE(const CallPE &); ///< place holder
|
|
547
|
+
void operator=(const CallPE &); ///< place holder
|
|
543
548
|
|
|
544
|
-
|
|
545
|
-
const SVFVar* cond;
|
|
546
|
-
const SVFVar* brInst;
|
|
549
|
+
const CallBlockNode* inst; ///< llvm instruction for this call
|
|
547
550
|
public:
|
|
548
551
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
549
552
|
//@{
|
|
550
|
-
static inline bool classof(const
|
|
553
|
+
static inline bool classof(const CallPE *)
|
|
551
554
|
{
|
|
552
555
|
return true;
|
|
553
556
|
}
|
|
554
557
|
static inline bool classof(const SVFStmt *edge)
|
|
555
558
|
{
|
|
556
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
559
|
+
return edge->getEdgeKind() == SVFStmt::Call
|
|
560
|
+
|| edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
557
561
|
}
|
|
558
562
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
559
563
|
{
|
|
560
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
564
|
+
return edge->getEdgeKind() == SVFStmt::Call
|
|
565
|
+
|| edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
561
566
|
}
|
|
562
567
|
//@}
|
|
563
568
|
|
|
564
569
|
/// constructor
|
|
565
|
-
|
|
570
|
+
CallPE(SVFVar* s, SVFVar* d, const CallBlockNode* i, GEdgeKind k = SVFStmt::Call) :
|
|
571
|
+
AssignStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
|
|
566
572
|
{
|
|
567
573
|
}
|
|
568
574
|
|
|
569
|
-
///
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
const SVFVar* getCondition() const;
|
|
575
|
-
const SVFVar* getBranchInst() const{
|
|
576
|
-
return brInst;
|
|
577
|
-
}
|
|
578
|
-
/// Successors of this branch statement
|
|
579
|
-
///@{
|
|
580
|
-
u32_t getNumSuccessors() const{
|
|
581
|
-
return successors.size();
|
|
582
|
-
}
|
|
583
|
-
const std::vector<const ICFGNode*>& getSuccessors() const{
|
|
584
|
-
return successors;
|
|
575
|
+
/// Get method for the call instruction
|
|
576
|
+
//@{
|
|
577
|
+
inline const CallBlockNode* getCallInst() const
|
|
578
|
+
{
|
|
579
|
+
return inst;
|
|
585
580
|
}
|
|
586
|
-
const
|
|
587
|
-
|
|
581
|
+
inline const CallBlockNode* getCallSite() const
|
|
582
|
+
{
|
|
583
|
+
return inst;
|
|
588
584
|
}
|
|
589
|
-
|
|
585
|
+
//@}
|
|
586
|
+
|
|
590
587
|
virtual const std::string toString() const override;
|
|
591
588
|
};
|
|
592
589
|
|
|
590
|
+
|
|
593
591
|
/*!
|
|
594
|
-
*
|
|
592
|
+
* Return
|
|
595
593
|
*/
|
|
596
|
-
class
|
|
594
|
+
class RetPE: public AssignStmt
|
|
597
595
|
{
|
|
598
596
|
private:
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
void operator=(const
|
|
597
|
+
RetPE(); ///< place holder
|
|
598
|
+
RetPE(const RetPE &); ///< place holder
|
|
599
|
+
void operator=(const RetPE &); ///< place holder
|
|
602
600
|
|
|
601
|
+
const CallBlockNode* inst; /// the callsite instruction return to
|
|
603
602
|
public:
|
|
604
603
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
605
604
|
//@{
|
|
606
|
-
static inline bool classof(const
|
|
605
|
+
static inline bool classof(const RetPE *)
|
|
607
606
|
{
|
|
608
607
|
return true;
|
|
609
608
|
}
|
|
610
609
|
static inline bool classof(const SVFStmt *edge)
|
|
611
610
|
{
|
|
612
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
611
|
+
return edge->getEdgeKind() == SVFStmt::Ret
|
|
612
|
+
|| edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
613
613
|
}
|
|
614
614
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
615
615
|
{
|
|
616
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
616
|
+
return edge->getEdgeKind() == SVFStmt::Ret
|
|
617
|
+
|| edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
617
618
|
}
|
|
618
619
|
//@}
|
|
619
620
|
|
|
620
621
|
/// constructor
|
|
621
|
-
|
|
622
|
-
|
|
622
|
+
RetPE(SVFVar* s, SVFVar* d, const CallBlockNode* i, GEdgeKind k = SVFStmt::Ret) :
|
|
623
|
+
AssignStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
|
|
624
|
+
{
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/// Get method for call instruction at caller
|
|
628
|
+
//@{
|
|
629
|
+
inline const CallBlockNode* getCallInst() const
|
|
623
630
|
{
|
|
631
|
+
return inst;
|
|
624
632
|
}
|
|
633
|
+
inline const CallBlockNode* getCallSite() const
|
|
634
|
+
{
|
|
635
|
+
return inst;
|
|
636
|
+
}
|
|
637
|
+
//@}
|
|
625
638
|
|
|
626
639
|
virtual const std::string toString() const override;
|
|
627
640
|
};
|
|
628
641
|
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
642
|
+
/*
|
|
643
|
+
* Program statements with multiple operands including BinaryOPStmt, CmpStmt and PhiStmt
|
|
644
|
+
*/
|
|
645
|
+
class MultiOpndStmt : public SVFStmt{
|
|
646
|
+
public:
|
|
647
|
+
typedef std::vector<SVFVar*> OPVars;
|
|
635
648
|
private:
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
void operator=(const
|
|
649
|
+
MultiOpndStmt(); ///< place holder
|
|
650
|
+
MultiOpndStmt(const MultiOpndStmt &); ///< place holder
|
|
651
|
+
void operator=(const MultiOpndStmt &); ///< place holder
|
|
652
|
+
SVFVar* getSrcNode(); ///< not allowed, use getOpVar(idx) instead
|
|
653
|
+
SVFVar* getDstNode(); ///< not allowed, use getRes() instead
|
|
654
|
+
NodeID getSrcID(); ///< not allowed, use getOpVarID(idx) instead
|
|
655
|
+
NodeID getDstID(); ///< not allowed, use getResID() instead
|
|
639
656
|
|
|
657
|
+
protected:
|
|
658
|
+
OPVars opVars;
|
|
659
|
+
/// Constructor, only used by subclassess but not external users
|
|
660
|
+
MultiOpndStmt(SVFVar* r, const OPVars& opnds, GEdgeFlag k): SVFStmt(opnds.at(0), r, k), opVars(opnds)
|
|
661
|
+
{
|
|
662
|
+
}
|
|
640
663
|
public:
|
|
641
664
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
642
665
|
//@{
|
|
643
|
-
static inline bool classof(const
|
|
666
|
+
static inline bool classof(const MultiOpndStmt *)
|
|
644
667
|
{
|
|
645
668
|
return true;
|
|
646
669
|
}
|
|
647
|
-
static inline bool classof(const SVFStmt *
|
|
670
|
+
static inline bool classof(const SVFStmt *node)
|
|
648
671
|
{
|
|
649
|
-
return
|
|
672
|
+
return node->getEdgeKind() == Phi ||
|
|
673
|
+
node->getEdgeKind() == BinaryOp ||
|
|
674
|
+
node->getEdgeKind() == Cmp;
|
|
650
675
|
}
|
|
651
|
-
static inline bool classof(const GenericPAGEdgeTy *
|
|
676
|
+
static inline bool classof(const GenericPAGEdgeTy *node)
|
|
652
677
|
{
|
|
653
|
-
return
|
|
678
|
+
return node->getEdgeKind() == Phi ||
|
|
679
|
+
node->getEdgeKind() == BinaryOp ||
|
|
680
|
+
node->getEdgeKind() == Cmp;
|
|
654
681
|
}
|
|
655
682
|
//@}
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
683
|
+
/// Operands and result at a BinaryNode e.g., p = q + r, `p` is resVar and `r` is OpVar
|
|
684
|
+
//@{
|
|
685
|
+
/// Operand SVFVars
|
|
686
|
+
inline const SVFVar* getOpVar(u32_t pos) const
|
|
659
687
|
{
|
|
688
|
+
return opVars.at(pos);
|
|
660
689
|
}
|
|
690
|
+
/// Result SVFVar
|
|
691
|
+
inline const SVFVar* getRes() const
|
|
692
|
+
{
|
|
693
|
+
return SVFStmt::getDstNode();
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
NodeID getOpVarID(u32_t pos) const;
|
|
697
|
+
NodeID getResID() const;
|
|
661
698
|
|
|
662
|
-
|
|
699
|
+
inline u32_t getOpVarNum() const
|
|
700
|
+
{
|
|
701
|
+
return opVars.size();
|
|
702
|
+
}
|
|
703
|
+
inline const OPVars& getOpndVars() const{
|
|
704
|
+
return opVars;
|
|
705
|
+
}
|
|
706
|
+
inline OPVars::const_iterator opVarBegin() const
|
|
707
|
+
{
|
|
708
|
+
return opVars.begin();
|
|
709
|
+
}
|
|
710
|
+
inline OPVars::const_iterator opVerEnd() const
|
|
711
|
+
{
|
|
712
|
+
return opVars.end();
|
|
713
|
+
}
|
|
714
|
+
//@}
|
|
663
715
|
};
|
|
664
716
|
|
|
665
|
-
|
|
666
717
|
/*!
|
|
667
|
-
*
|
|
718
|
+
* Phi statement (e.g., p = phi(q,r) which receives values from variables q and r from different paths)
|
|
719
|
+
* it is typically at a joint point of the control-flow graph
|
|
668
720
|
*/
|
|
669
|
-
class
|
|
721
|
+
class PhiStmt: public MultiOpndStmt
|
|
670
722
|
{
|
|
671
723
|
private:
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
void operator=(const
|
|
675
|
-
|
|
676
|
-
LocationSet ls; ///< location set of the gep edge
|
|
724
|
+
PhiStmt(); ///< place holder
|
|
725
|
+
PhiStmt(const PhiStmt &); ///< place holder
|
|
726
|
+
void operator=(const PhiStmt &); ///< place holder
|
|
677
727
|
|
|
678
728
|
public:
|
|
679
729
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
680
730
|
//@{
|
|
681
|
-
static inline bool classof(const
|
|
731
|
+
static inline bool classof(const PhiStmt *)
|
|
682
732
|
{
|
|
683
733
|
return true;
|
|
684
734
|
}
|
|
685
735
|
static inline bool classof(const SVFStmt *edge)
|
|
686
736
|
{
|
|
687
|
-
return
|
|
688
|
-
edge->getEdgeKind() == SVFStmt::VariantGep;
|
|
737
|
+
return edge->getEdgeKind() == SVFStmt::Phi;
|
|
689
738
|
}
|
|
690
|
-
static inline bool classof(const
|
|
739
|
+
static inline bool classof(const MultiOpndStmt *edge)
|
|
691
740
|
{
|
|
692
|
-
return
|
|
693
|
-
edge->getEdgeKind() == SVFStmt::VariantGep;
|
|
741
|
+
return edge->getEdgeKind() == SVFStmt::Phi;
|
|
694
742
|
}
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
inline const LocationSet& getLocationSet() const
|
|
743
|
+
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
698
744
|
{
|
|
699
|
-
return
|
|
745
|
+
return edge->getEdgeKind() == SVFStmt::Phi;
|
|
700
746
|
}
|
|
747
|
+
//@}
|
|
701
748
|
|
|
702
|
-
protected:
|
|
703
749
|
/// constructor
|
|
704
|
-
|
|
750
|
+
PhiStmt(SVFVar* s, const OPVars& opnds) : MultiOpndStmt(s,opnds,SVFStmt::Phi)
|
|
705
751
|
{
|
|
706
752
|
}
|
|
753
|
+
void addOpVar(SVFVar* op){
|
|
754
|
+
opVars.push_back(op);
|
|
755
|
+
}
|
|
707
756
|
|
|
708
|
-
|
|
757
|
+
/// Return true if this is a phi at the function exit
|
|
758
|
+
/// to receive one or multiple return values of this function
|
|
759
|
+
bool isFunctionRetPhi() const;
|
|
709
760
|
|
|
761
|
+
virtual const std::string toString() const override;
|
|
710
762
|
};
|
|
711
763
|
|
|
712
764
|
|
|
713
765
|
/*!
|
|
714
|
-
*
|
|
766
|
+
* Comparison statement
|
|
715
767
|
*/
|
|
716
|
-
class
|
|
768
|
+
class CmpStmt: public MultiOpndStmt
|
|
717
769
|
{
|
|
718
770
|
private:
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
void operator=(const
|
|
771
|
+
CmpStmt(); ///< place holder
|
|
772
|
+
CmpStmt(const CmpStmt &); ///< place holder
|
|
773
|
+
void operator=(const CmpStmt &); ///< place holder
|
|
722
774
|
|
|
775
|
+
u32_t predicate;
|
|
723
776
|
public:
|
|
724
777
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
725
778
|
//@{
|
|
726
|
-
static inline bool classof(const
|
|
779
|
+
static inline bool classof(const CmpStmt *)
|
|
727
780
|
{
|
|
728
781
|
return true;
|
|
729
782
|
}
|
|
730
|
-
static inline bool classof(const
|
|
783
|
+
static inline bool classof(const SVFStmt *edge)
|
|
731
784
|
{
|
|
732
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
785
|
+
return edge->getEdgeKind() == SVFStmt::Cmp;
|
|
733
786
|
}
|
|
734
|
-
static inline bool classof(const
|
|
787
|
+
static inline bool classof(const MultiOpndStmt *edge)
|
|
735
788
|
{
|
|
736
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
789
|
+
return edge->getEdgeKind() == SVFStmt::Cmp;
|
|
737
790
|
}
|
|
738
791
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
739
792
|
{
|
|
740
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
793
|
+
return edge->getEdgeKind() == SVFStmt::Cmp;
|
|
741
794
|
}
|
|
742
795
|
//@}
|
|
743
796
|
|
|
744
797
|
/// constructor
|
|
745
|
-
|
|
746
|
-
{}
|
|
747
|
-
|
|
748
|
-
/// offset of the gep edge
|
|
749
|
-
inline u32_t getFieldOffset() const
|
|
798
|
+
CmpStmt(SVFVar* s, const OPVars& opnds, u32_t pre) : MultiOpndStmt(s,opnds,SVFStmt::Cmp), predicate(pre)
|
|
750
799
|
{
|
|
751
|
-
return getLocationSet().accumulateConstantFieldIdx();
|
|
752
800
|
}
|
|
753
801
|
|
|
802
|
+
u32_t getPredicate() const
|
|
803
|
+
{
|
|
804
|
+
return predicate;
|
|
805
|
+
}
|
|
806
|
+
|
|
754
807
|
virtual const std::string toString() const override;
|
|
755
808
|
};
|
|
756
809
|
|
|
810
|
+
|
|
757
811
|
/*!
|
|
758
|
-
*
|
|
812
|
+
* Binary statement
|
|
759
813
|
*/
|
|
760
|
-
class
|
|
814
|
+
class BinaryOPStmt: public MultiOpndStmt
|
|
761
815
|
{
|
|
762
816
|
private:
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
void operator=(const
|
|
817
|
+
BinaryOPStmt(); ///< place holder
|
|
818
|
+
BinaryOPStmt(const BinaryOPStmt &); ///< place holder
|
|
819
|
+
void operator=(const BinaryOPStmt &); ///< place holder
|
|
820
|
+
u32_t opcode;
|
|
766
821
|
|
|
767
822
|
public:
|
|
768
823
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
769
824
|
//@{
|
|
770
|
-
static inline bool classof(const
|
|
825
|
+
static inline bool classof(const BinaryOPStmt *)
|
|
771
826
|
{
|
|
772
827
|
return true;
|
|
773
828
|
}
|
|
774
|
-
static inline bool classof(const
|
|
829
|
+
static inline bool classof(const SVFStmt *edge)
|
|
775
830
|
{
|
|
776
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
831
|
+
return edge->getEdgeKind() == SVFStmt::BinaryOp;
|
|
777
832
|
}
|
|
778
|
-
static inline bool classof(const
|
|
833
|
+
static inline bool classof(const MultiOpndStmt *edge)
|
|
779
834
|
{
|
|
780
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
835
|
+
return edge->getEdgeKind() == SVFStmt::BinaryOp;
|
|
781
836
|
}
|
|
782
837
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
783
838
|
{
|
|
784
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
839
|
+
return edge->getEdgeKind() == SVFStmt::BinaryOp;
|
|
785
840
|
}
|
|
786
841
|
//@}
|
|
787
842
|
|
|
788
843
|
/// constructor
|
|
789
|
-
|
|
844
|
+
BinaryOPStmt(SVFVar* s, const OPVars& opnds, u32_t oc) : MultiOpndStmt(s,opnds,SVFStmt::BinaryOp), opcode(oc)
|
|
845
|
+
{
|
|
846
|
+
}
|
|
790
847
|
|
|
791
|
-
|
|
848
|
+
u32_t getOpcode() const
|
|
849
|
+
{
|
|
850
|
+
return opcode;
|
|
851
|
+
}
|
|
792
852
|
|
|
853
|
+
virtual const std::string toString() const override;
|
|
793
854
|
};
|
|
794
855
|
|
|
795
|
-
|
|
796
856
|
/*!
|
|
797
|
-
*
|
|
857
|
+
* Unary statement
|
|
798
858
|
*/
|
|
799
|
-
class
|
|
859
|
+
class UnaryOPStmt: public SVFStmt
|
|
800
860
|
{
|
|
801
861
|
private:
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
void operator=(const
|
|
862
|
+
UnaryOPStmt(); ///< place holder
|
|
863
|
+
UnaryOPStmt(const UnaryOPStmt &); ///< place holder
|
|
864
|
+
void operator=(const UnaryOPStmt &); ///< place holder
|
|
865
|
+
SVFVar* getSrcNode(); ///< place holder, use getOpVar() instead
|
|
866
|
+
SVFVar* getDstNode(); ///< place holder, use getRes() instead
|
|
867
|
+
NodeID getSrcID(); ///< place holder, use getOpVarID(pos) instead
|
|
868
|
+
NodeID getDstID(); ///< place holder, use getResID() instead
|
|
805
869
|
|
|
806
|
-
|
|
870
|
+
u32_t opcode;
|
|
807
871
|
public:
|
|
808
872
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
809
873
|
//@{
|
|
810
|
-
static inline bool classof(const
|
|
874
|
+
static inline bool classof(const UnaryOPStmt *)
|
|
811
875
|
{
|
|
812
876
|
return true;
|
|
813
877
|
}
|
|
814
878
|
static inline bool classof(const SVFStmt *edge)
|
|
815
879
|
{
|
|
816
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
817
|
-
|| edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
880
|
+
return edge->getEdgeKind() == SVFStmt::UnaryOp;
|
|
818
881
|
}
|
|
819
882
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
820
883
|
{
|
|
821
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
822
|
-
|| edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
884
|
+
return edge->getEdgeKind() == SVFStmt::UnaryOp;
|
|
823
885
|
}
|
|
824
886
|
//@}
|
|
825
887
|
|
|
826
888
|
/// constructor
|
|
827
|
-
|
|
828
|
-
SVFStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
|
|
889
|
+
UnaryOPStmt(SVFVar* s, SVFVar* d, u32_t oc) : SVFStmt(s,d,SVFStmt::UnaryOp), opcode(oc)
|
|
829
890
|
{
|
|
830
891
|
}
|
|
831
892
|
|
|
832
|
-
|
|
833
|
-
//@{
|
|
834
|
-
inline const CallBlockNode* getCallInst() const
|
|
893
|
+
u32_t getOpcode() const
|
|
835
894
|
{
|
|
836
|
-
return
|
|
895
|
+
return opcode;
|
|
837
896
|
}
|
|
838
|
-
inline const
|
|
839
|
-
|
|
840
|
-
return inst;
|
|
897
|
+
inline const SVFVar* getOpVar() const{
|
|
898
|
+
return SVFStmt::getSrcNode();
|
|
841
899
|
}
|
|
842
|
-
|
|
900
|
+
inline const SVFVar* getRes() const{
|
|
901
|
+
return SVFStmt::getDstNode();
|
|
902
|
+
}
|
|
903
|
+
NodeID getOpVarID() const;
|
|
904
|
+
NodeID getResID() const;
|
|
843
905
|
|
|
844
906
|
virtual const std::string toString() const override;
|
|
845
907
|
};
|
|
846
908
|
|
|
847
909
|
|
|
848
910
|
/*!
|
|
849
|
-
*
|
|
911
|
+
* Branch statements including if/else and switch
|
|
850
912
|
*/
|
|
851
|
-
class
|
|
913
|
+
class BranchStmt: public SVFStmt
|
|
852
914
|
{
|
|
853
915
|
private:
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
void operator=(const
|
|
916
|
+
BranchStmt(); ///< place holder
|
|
917
|
+
BranchStmt(const BranchStmt &); ///< place holder
|
|
918
|
+
void operator=(const BranchStmt &); ///< place holder
|
|
919
|
+
SVFVar* getSrcNode(); ///< place holder, not allowed
|
|
920
|
+
SVFVar* getDstNode(); ///< place holder, not allowed
|
|
921
|
+
NodeID getSrcID(); ///< place holder, use getOpVarID(pos) instead
|
|
922
|
+
NodeID getDstID(); ///< place holder, use getResID() instead
|
|
857
923
|
|
|
858
|
-
const
|
|
924
|
+
std::vector<const ICFGNode*> successors;
|
|
925
|
+
const SVFVar* cond;
|
|
926
|
+
const SVFVar* brInst;
|
|
859
927
|
public:
|
|
860
928
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
861
929
|
//@{
|
|
862
|
-
static inline bool classof(const
|
|
930
|
+
static inline bool classof(const BranchStmt *)
|
|
863
931
|
{
|
|
864
932
|
return true;
|
|
865
933
|
}
|
|
866
934
|
static inline bool classof(const SVFStmt *edge)
|
|
867
935
|
{
|
|
868
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
869
|
-
|| edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
936
|
+
return edge->getEdgeKind() == SVFStmt::Branch;
|
|
870
937
|
}
|
|
871
938
|
static inline bool classof(const GenericPAGEdgeTy *edge)
|
|
872
939
|
{
|
|
873
|
-
return edge->getEdgeKind() == SVFStmt::
|
|
874
|
-
|| edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
940
|
+
return edge->getEdgeKind() == SVFStmt::Branch;
|
|
875
941
|
}
|
|
876
942
|
//@}
|
|
877
943
|
|
|
878
944
|
/// constructor
|
|
879
|
-
|
|
880
|
-
SVFStmt(s,d,makeEdgeFlagWithCallInst(k,i)), inst(i)
|
|
945
|
+
BranchStmt(SVFVar* inst, SVFVar* c, const std::vector<const ICFGNode*>& succs) : SVFStmt(c,inst,SVFStmt::Branch), successors(succs), cond(c), brInst(inst)
|
|
881
946
|
{
|
|
882
947
|
}
|
|
883
948
|
|
|
884
|
-
///
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
949
|
+
/// The branch is unconditional if cond is a null value
|
|
950
|
+
bool isUnconditional() const;
|
|
951
|
+
/// The branch is conditional if cond is not a null value
|
|
952
|
+
bool isConditional() const;
|
|
953
|
+
/// Return the condition
|
|
954
|
+
const SVFVar* getCondition() const;
|
|
955
|
+
const SVFVar* getBranchInst() const{
|
|
956
|
+
return brInst;
|
|
889
957
|
}
|
|
890
|
-
|
|
891
|
-
{
|
|
892
|
-
|
|
958
|
+
/// Successors of this branch statement
|
|
959
|
+
///@{
|
|
960
|
+
u32_t getNumSuccessors() const{
|
|
961
|
+
return successors.size();
|
|
893
962
|
}
|
|
894
|
-
|
|
895
|
-
|
|
963
|
+
const std::vector<const ICFGNode*>& getSuccessors() const{
|
|
964
|
+
return successors;
|
|
965
|
+
}
|
|
966
|
+
const ICFGNode* getSuccessor (u32_t i) const{
|
|
967
|
+
return successors.at(i);
|
|
968
|
+
}
|
|
969
|
+
///@}
|
|
896
970
|
virtual const std::string toString() const override;
|
|
897
971
|
};
|
|
898
972
|
|