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