svf-lib 1.0.2319 → 1.0.2321
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-linux-aarch64/Release-build/include/{Util → SVF/Util}/WorkList.h +0 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/Modules/FindZ3.cmake +93 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFConfig.cmake +106 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFConfigVersion.cmake +43 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFTargets-release.cmake +101 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFTargets.cmake +180 -0
- package/SVF-linux-aarch64/Release-build/lib/libSvfCore.so.3.1 +0 -0
- package/SVF-linux-aarch64/Release-build/lib/libSvfLLVM.so.3.1 +0 -0
- package/SVF-linux-aarch64/Release-build/lib/pkgconfig/SVF.pc +12 -0
- package/SVF-osx/Release-build/bin/ae +0 -0
- package/SVF-osx/Release-build/bin/cfl +0 -0
- package/SVF-osx/Release-build/bin/dvf +0 -0
- package/SVF-osx/Release-build/bin/llvm2svf +0 -0
- package/SVF-osx/Release-build/bin/mta +0 -0
- package/SVF-osx/Release-build/bin/saber +0 -0
- package/SVF-osx/Release-build/bin/svf-ex +0 -0
- package/SVF-osx/Release-build/bin/wpa +0 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/AbstractState.h +425 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/AbstractValue.h +157 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/AddressValue.h +225 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/ICFGWTO.h +135 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/IntervalValue.h +1055 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/NumericValue.h +1292 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/RelExeState.h +226 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/RelationSolver.h +91 -0
- package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AEDetector.h +439 -0
- package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AbsExtAPI.h +138 -0
- package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AbstractInterpretation.h +384 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFGNormalizer.h +84 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFGrammar.h +468 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLAlias.h +168 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLBase.h +118 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLGramGraphChecker.h +74 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLGraphBuilder.h +168 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLSVFGBuilder.h +58 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLSolver.h +374 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLStat.h +67 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLVF.h +68 -0
- package/SVF-osx/Release-build/include/SVF/CFL/GrammarBuilder.h +100 -0
- package/SVF-osx/Release-build/include/SVF/DDA/ContextDDA.h +230 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAClient.h +163 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAPass.h +102 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAStat.h +121 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAVFSolver.h +794 -0
- package/SVF-osx/Release-build/include/SVF/DDA/FlowDDA.h +178 -0
- package/SVF-osx/Release-build/include/SVF/FastCluster/fastcluster.h +80 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/BasicBlockG.h +318 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CDG.h +482 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CFLGraph.h +232 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CHG.h +368 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CallGraph.h +497 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ConsG.h +402 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ConsGEdge.h +355 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ConsGNode.h +418 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/DOTGraphTraits.h +188 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GenericGraph.h +628 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GraphPrinter.h +111 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GraphTraits.h +150 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GraphWriter.h +380 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFG.h +331 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFGEdge.h +281 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFGNode.h +669 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFGStat.h +164 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/IRGraph.h +398 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SCC.h +375 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFG.h +491 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGEdge.h +237 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGNode.h +501 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGOPT.h +372 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGStat.h +273 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ThreadCallGraph.h +399 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/VFG.h +726 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/VFGEdge.h +295 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/VFGNode.h +1266 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/WTO.h +872 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MSSAMuChi.h +722 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MemPartition.h +169 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MemRegion.h +489 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MemSSA.h +452 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/SVFGBuilder.h +104 -0
- package/SVF-osx/Release-build/include/SVF/MTA/LockAnalysis.h +533 -0
- package/SVF-osx/Release-build/include/SVF/MTA/MHP.h +546 -0
- package/SVF-osx/Release-build/include/SVF/MTA/MTA.h +97 -0
- package/SVF-osx/Release-build/include/SVF/MTA/MTAStat.h +73 -0
- package/SVF-osx/Release-build/include/SVF/MTA/TCT.h +620 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/AbstractPointsToDS.h +316 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/AccessPath.h +194 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/ConditionalPT.h +878 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/MutablePointsToDS.h +1025 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PersistentPointsToCache.h +463 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PersistentPointsToDS.h +955 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PointerAnalysis.h +428 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PointerAnalysisImpl.h +602 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PointsTo.h +255 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/SVFLoop.h +167 -0
- package/SVF-osx/Release-build/include/SVF/SABER/DoubleFreeChecker.h +76 -0
- package/SVF-osx/Release-build/include/SVF/SABER/FileChecker.h +80 -0
- package/SVF-osx/Release-build/include/SVF/SABER/LeakChecker.h +122 -0
- package/SVF-osx/Release-build/include/SVF/SABER/ProgSlice.h +327 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SaberCheckerAPI.h +151 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SaberCondAllocator.h +317 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SaberSVFGBuilder.h +114 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SrcSnkDDA.h +327 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SrcSnkSolver.h +186 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/BasicTypes.h +280 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/BreakConstantExpr.h +93 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/CHGBuilder.h +78 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/CppUtil.h +184 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/DCHG.h +474 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/GEPTypeBridgeIterator.h +183 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/ICFGBuilder.h +160 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMLoopAnalysis.h +60 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMModule.h +527 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMUtil.h +433 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/ObjTypeInference.h +129 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/SVFIRBuilder.h +523 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/SymbolTableBuilder.h +132 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/ObjTypeInfo.h +224 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/PAGBuilderFromFile.h +80 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFIR.h +856 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFStatements.h +1330 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFType.h +606 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFValue.h +338 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFVariables.h +2212 -0
- package/SVF-osx/Release-build/include/SVF/Util/Annotator.h +180 -0
- package/SVF-osx/Release-build/include/SVF/Util/BitVector.h +55 -0
- package/SVF-osx/Release-build/include/SVF/Util/CDGBuilder.h +107 -0
- package/SVF-osx/Release-build/include/SVF/Util/CallGraphBuilder.h +61 -0
- package/SVF-osx/Release-build/include/SVF/Util/Casting.h +426 -0
- package/SVF-osx/Release-build/include/SVF/Util/CommandLine.h +530 -0
- package/SVF-osx/Release-build/include/SVF/Util/CoreBitVector.h +214 -0
- package/SVF-osx/Release-build/include/SVF/Util/CxtStmt.h +502 -0
- package/SVF-osx/Release-build/include/SVF/Util/DPItem.h +618 -0
- package/SVF-osx/Release-build/include/SVF/Util/ExtAPI.h +117 -0
- package/SVF-osx/Release-build/include/SVF/Util/GeneralType.h +127 -0
- package/SVF-osx/Release-build/include/SVF/Util/GraphReachSolver.h +186 -0
- package/SVF-osx/Release-build/include/SVF/Util/NodeIDAllocator.h +203 -0
- package/SVF-osx/Release-build/include/SVF/Util/Options.h +273 -0
- package/SVF-osx/Release-build/include/SVF/Util/PTAStat.h +83 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFBugReport.h +427 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFLoopAndDomInfo.h +169 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFStat.h +103 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFUtil.h +478 -0
- package/SVF-osx/Release-build/include/SVF/Util/SparseBitVector.h +1252 -0
- package/SVF-osx/Release-build/include/SVF/Util/ThreadAPI.h +188 -0
- package/SVF-osx/Release-build/include/SVF/Util/WorkList.h +317 -0
- package/SVF-osx/Release-build/include/SVF/Util/Z3Expr.h +325 -0
- package/SVF-osx/Release-build/include/SVF/Util/cJSON.h +300 -0
- package/SVF-osx/Release-build/include/SVF/Util/config.h +46 -0
- package/SVF-osx/Release-build/include/SVF/Util/iterator.h +407 -0
- package/SVF-osx/Release-build/include/SVF/Util/iterator_range.h +76 -0
- package/SVF-osx/Release-build/include/SVF/WPA/Andersen.h +434 -0
- package/SVF-osx/Release-build/include/SVF/WPA/AndersenPWC.h +160 -0
- package/SVF-osx/Release-build/include/SVF/WPA/CSC.h +95 -0
- package/SVF-osx/Release-build/include/SVF/WPA/FlowSensitive.h +322 -0
- package/SVF-osx/Release-build/include/SVF/WPA/Steensgaard.h +131 -0
- package/SVF-osx/Release-build/include/SVF/WPA/TypeAnalysis.h +90 -0
- package/SVF-osx/Release-build/include/SVF/WPA/VersionedFlowSensitive.h +295 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPAFSSolver.h +246 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPAPass.h +115 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPASolver.h +205 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPAStat.h +222 -0
- package/SVF-osx/Release-build/include/SVF/extapi.bc +2384 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/Modules/FindZ3.cmake +93 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFConfig.cmake +106 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFConfigVersion.cmake +43 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFTargets-release.cmake +101 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFTargets.cmake +180 -0
- package/SVF-osx/Release-build/lib/libSvfCore.3.1.dylib +0 -0
- package/SVF-osx/Release-build/lib/libSvfLLVM.3.1.dylib +0 -0
- package/SVF-osx/Release-build/lib/pkgconfig/SVF.pc +12 -0
- package/package.json +1 -1
- package/SVF-linux-aarch64/Release-build/include/CFL/grammar/PAGGrammar.txt +0 -15
- package/SVF-linux-aarch64/Release-build/include/CFL/grammar/PEGGrammar.txt +0 -11
- package/SVF-linux-aarch64/Release-build/include/CFL/grammar/VFGGrammar.txt +0 -7
- package/SVF-linux-aarch64/Release-build/include/FastCluster/LICENSE.TXT +0 -13
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AbstractState.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AbstractValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AddressValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/ICFGWTO.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/IntervalValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/NumericValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/RelExeState.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/RelationSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AEDetector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AbsExtAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AbstractInterpretation.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFGNormalizer.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFGrammar.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLAlias.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLBase.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLGramGraphChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLGraphBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLSVFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLVF.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/GrammarBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/ContextDDA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAClient.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAPass.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAVFSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/FlowDDA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{FastCluster → SVF/FastCluster}/fastcluster.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/BasicBlockG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CDG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CFLGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CHG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CallGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/DOTGraphTraits.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GenericGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphPrinter.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphTraits.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphWriter.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/IRGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SCC.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGOPT.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ThreadCallGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/WTO.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MSSAMuChi.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemPartition.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemRegion.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemSSA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/SVFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/LockAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MHP.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MTA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MTAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/TCT.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/AbstractPointsToDS.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/AccessPath.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/ConditionalPT.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/MutablePointsToDS.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PersistentPointsToCache.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PersistentPointsToDS.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointerAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointerAnalysisImpl.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointsTo.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/SVFLoop.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/DoubleFreeChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/FileChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/LeakChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/ProgSlice.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberCheckerAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberCondAllocator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberSVFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SrcSnkDDA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SrcSnkSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/BasicTypes.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/BreakConstantExpr.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/CHGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/CppUtil.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/DCHG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/GEPTypeBridgeIterator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/ICFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMLoopAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMModule.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMUtil.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/ObjTypeInference.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/SVFIRBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/SymbolTableBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/ObjTypeInfo.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/PAGBuilderFromFile.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFIR.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFStatements.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFType.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFVariables.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Annotator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/BitVector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CDGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CallGraphBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Casting.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CommandLine.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CoreBitVector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CxtStmt.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/DPItem.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/ExtAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/GeneralType.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/GraphReachSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/NodeIDAllocator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Options.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/PTAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFBugReport.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFLoopAndDomInfo.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFUtil.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SparseBitVector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/ThreadAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Z3Expr.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/cJSON.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/iterator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/iterator_range.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/Andersen.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/AndersenPWC.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/CSC.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/FlowSensitive.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/Steensgaard.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/TypeAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/VersionedFlowSensitive.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAFSSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAPass.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPASolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/{lib → include/SVF}/extapi.bc +0 -0
|
@@ -0,0 +1,726 @@
|
|
|
1
|
+
//===- VFG.h ----------------------------------------------------------------//
|
|
2
|
+
//
|
|
3
|
+
// SVF: Static Value-Flow Analysis
|
|
4
|
+
//
|
|
5
|
+
// Copyright (C) <2013-2018> <Yulei Sui>
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
// This program is free software: you can redistribute it and/or modify
|
|
9
|
+
// it under the terms of the GNU Affero General Public License as published by
|
|
10
|
+
// the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
// (at your option) any later version.
|
|
12
|
+
|
|
13
|
+
// This program is distributed in the hope that it will be useful,
|
|
14
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
// GNU Affero General Public License for more details.
|
|
17
|
+
|
|
18
|
+
// You should have received a copy of the GNU Affero General Public License
|
|
19
|
+
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
//
|
|
21
|
+
//===----------------------------------------------------------------------===//
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* VFG.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: 18 Sep. 2018
|
|
27
|
+
* Author: Yulei Sui
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
#ifndef INCLUDE_UTIL_VFG_H_
|
|
31
|
+
#define INCLUDE_UTIL_VFG_H_
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
#include "SVFIR/SVFIR.h"
|
|
35
|
+
#include "Graphs/CallGraph.h"
|
|
36
|
+
#include "Graphs/VFGNode.h"
|
|
37
|
+
#include "Graphs/VFGEdge.h"
|
|
38
|
+
|
|
39
|
+
namespace SVF
|
|
40
|
+
{
|
|
41
|
+
|
|
42
|
+
class PointerAnalysis;
|
|
43
|
+
class VFGStat;
|
|
44
|
+
class CallICFGNode;
|
|
45
|
+
|
|
46
|
+
/*!
|
|
47
|
+
* Value Flow Graph (VFG)
|
|
48
|
+
*/
|
|
49
|
+
typedef GenericGraph<VFGNode,VFGEdge> GenericVFGTy;
|
|
50
|
+
class VFG : public GenericVFGTy
|
|
51
|
+
{
|
|
52
|
+
|
|
53
|
+
public:
|
|
54
|
+
/// VFG kind
|
|
55
|
+
enum VFGK
|
|
56
|
+
{
|
|
57
|
+
FULLSVFG, PTRONLYSVFG, FULLSVFG_OPT, PTRONLYSVFG_OPT
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
typedef OrderedMap<NodeID, VFGNode *> VFGNodeIDToNodeMapTy;
|
|
61
|
+
typedef Set<VFGNode*> VFGNodeSet;
|
|
62
|
+
typedef Map<const PAGNode*, NodeID> PAGNodeToDefMapTy;
|
|
63
|
+
typedef Map<std::pair<NodeID,const CallICFGNode*>, ActualParmVFGNode *> PAGNodeToActualParmMapTy;
|
|
64
|
+
typedef Map<const PAGNode*, ActualRetVFGNode *> PAGNodeToActualRetMapTy;
|
|
65
|
+
typedef Map<const PAGNode*, FormalParmVFGNode *> PAGNodeToFormalParmMapTy;
|
|
66
|
+
typedef Map<const PAGNode*, FormalRetVFGNode *> PAGNodeToFormalRetMapTy;
|
|
67
|
+
typedef Map<const PAGEdge*, StmtVFGNode*> PAGEdgeToStmtVFGNodeMapTy;
|
|
68
|
+
typedef Map<const PAGNode*, IntraPHIVFGNode*> PAGNodeToPHIVFGNodeMapTy;
|
|
69
|
+
typedef Map<const PAGNode*, BinaryOPVFGNode*> PAGNodeToBinaryOPVFGNodeMapTy;
|
|
70
|
+
typedef Map<const PAGNode*, UnaryOPVFGNode*> PAGNodeToUnaryOPVFGNodeMapTy;
|
|
71
|
+
typedef Map<const PAGNode*, BranchVFGNode*> PAGNodeToBranchVFGNodeMapTy;
|
|
72
|
+
typedef Map<const PAGNode*, CmpVFGNode*> PAGNodeToCmpVFGNodeMapTy;
|
|
73
|
+
typedef Map<const FunObjVar*, VFGNodeSet > FunToVFGNodesMapTy;
|
|
74
|
+
|
|
75
|
+
typedef FormalParmVFGNode::CallPESet CallPESet;
|
|
76
|
+
typedef FormalRetVFGNode::RetPESet RetPESet;
|
|
77
|
+
typedef VFGEdge::VFGEdgeSetTy VFGEdgeSetTy;
|
|
78
|
+
typedef VFGEdge::SVFGEdgeSetTy SVFGEdgeSetTy;
|
|
79
|
+
typedef VFGEdge::VFGEdgeSetTy::iterator VFGNodeIter;
|
|
80
|
+
typedef VFGNodeIDToNodeMapTy::iterator iterator;
|
|
81
|
+
typedef VFGNodeIDToNodeMapTy::const_iterator const_iterator;
|
|
82
|
+
typedef SVFIR::SVFStmtSet SVFStmtSet;
|
|
83
|
+
typedef Set<const VFGNode*> GlobalVFGNodeSet;
|
|
84
|
+
typedef Set<const PAGNode*> PAGNodeSet;
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
protected:
|
|
88
|
+
NodeID totalVFGNode;
|
|
89
|
+
PAGNodeToDefMapTy PAGNodeToDefMap; ///< map a pag node to its definition SVG node
|
|
90
|
+
PAGNodeToActualParmMapTy PAGNodeToActualParmMap; ///< map a PAGNode to an actual parameter
|
|
91
|
+
PAGNodeToActualRetMapTy PAGNodeToActualRetMap; ///< map a PAGNode to an actual return
|
|
92
|
+
PAGNodeToFormalParmMapTy PAGNodeToFormalParmMap; ///< map a PAGNode to a formal parameter
|
|
93
|
+
PAGNodeToFormalRetMapTy PAGNodeToFormalRetMap; ///< map a PAGNode to a formal return
|
|
94
|
+
PAGNodeToPHIVFGNodeMapTy PAGNodeToIntraPHIVFGNodeMap; ///< map a PAGNode to its PHIVFGNode
|
|
95
|
+
PAGNodeToBinaryOPVFGNodeMapTy PAGNodeToBinaryOPVFGNodeMap; ///< map a PAGNode to its BinaryOPVFGNode
|
|
96
|
+
PAGNodeToUnaryOPVFGNodeMapTy PAGNodeToUnaryOPVFGNodeMap; ///< map a PAGNode to its UnaryOPVFGNode
|
|
97
|
+
PAGNodeToBranchVFGNodeMapTy PAGNodeToBranchVFGNodeMap; ///< map a PAGNode to its BranchVFGNode
|
|
98
|
+
PAGNodeToCmpVFGNodeMapTy PAGNodeToCmpVFGNodeMap; ///< map a PAGNode to its CmpVFGNode
|
|
99
|
+
PAGEdgeToStmtVFGNodeMapTy PAGEdgeToStmtVFGNodeMap; ///< map a PAGEdge to its StmtVFGNode
|
|
100
|
+
FunToVFGNodesMapTy funToVFGNodesMap; ///< map a function to its VFGNodes;
|
|
101
|
+
|
|
102
|
+
GlobalVFGNodeSet globalVFGNodes; ///< set of global store VFG nodes
|
|
103
|
+
CallGraph* callgraph;
|
|
104
|
+
SVFIR* pag;
|
|
105
|
+
VFGK kind;
|
|
106
|
+
|
|
107
|
+
/// Clean up memory
|
|
108
|
+
void destroy();
|
|
109
|
+
|
|
110
|
+
public:
|
|
111
|
+
/// Constructor
|
|
112
|
+
VFG(CallGraph* callgraph, VFGK k = FULLSVFG);
|
|
113
|
+
|
|
114
|
+
/// Destructor
|
|
115
|
+
virtual ~VFG()
|
|
116
|
+
{
|
|
117
|
+
destroy();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// Get VFG kind
|
|
121
|
+
inline VFGK getKind() const
|
|
122
|
+
{
|
|
123
|
+
return kind;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/// Return true if this VFG only contains pointer related SVFGNodes for pointer analysis
|
|
127
|
+
inline bool isPtrOnlySVFG() const
|
|
128
|
+
{
|
|
129
|
+
return (kind == PTRONLYSVFG) || (kind == PTRONLYSVFG_OPT);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/// Return SVFIR
|
|
133
|
+
inline SVFIR* getPAG() const
|
|
134
|
+
{
|
|
135
|
+
return pag;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/// Return PTACallGraph
|
|
139
|
+
inline CallGraph* getCallGraph() const
|
|
140
|
+
{
|
|
141
|
+
return callgraph;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/// Get a VFG node
|
|
145
|
+
inline VFGNode* getVFGNode(NodeID id) const
|
|
146
|
+
{
|
|
147
|
+
return getGNode(id);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/// Whether has the VFGNode
|
|
151
|
+
inline bool hasVFGNode(NodeID id) const
|
|
152
|
+
{
|
|
153
|
+
return hasGNode(id);
|
|
154
|
+
}
|
|
155
|
+
/// Return global stores
|
|
156
|
+
inline GlobalVFGNodeSet& getGlobalVFGNodes()
|
|
157
|
+
{
|
|
158
|
+
return globalVFGNodes;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// Get a SVFG edge according to src and dst
|
|
162
|
+
VFGEdge* getIntraVFGEdge(const VFGNode* src, const VFGNode* dst, VFGEdge::VFGEdgeK kind);
|
|
163
|
+
|
|
164
|
+
/// Dump graph into dot file
|
|
165
|
+
void dump(const std::string& file, bool simple = false);
|
|
166
|
+
|
|
167
|
+
/// Dump graph into dot file
|
|
168
|
+
void view();
|
|
169
|
+
|
|
170
|
+
/// Update VFG based on pointer analysis results
|
|
171
|
+
void updateCallGraph(PointerAnalysis* pta);
|
|
172
|
+
|
|
173
|
+
/// Connect VFG nodes between caller and callee for indirect call site
|
|
174
|
+
virtual void connectCallerAndCallee(const CallICFGNode* cs, const FunObjVar* callee, VFGEdgeSetTy& edges);
|
|
175
|
+
|
|
176
|
+
/// Get callsite given a callsiteID
|
|
177
|
+
//@{
|
|
178
|
+
inline CallSiteID getCallSiteID(const CallICFGNode* cs, const FunObjVar* func) const
|
|
179
|
+
{
|
|
180
|
+
return callgraph->getCallSiteID(cs, func);
|
|
181
|
+
}
|
|
182
|
+
inline const CallICFGNode* getCallSite(CallSiteID id) const
|
|
183
|
+
{
|
|
184
|
+
return callgraph->getCallSite(id);
|
|
185
|
+
}
|
|
186
|
+
//@}
|
|
187
|
+
|
|
188
|
+
/// Given a pagNode, return its definition site
|
|
189
|
+
inline const VFGNode* getDefVFGNode(const PAGNode* pagNode) const
|
|
190
|
+
{
|
|
191
|
+
return getVFGNode(getDef(pagNode));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Given an VFG node, return true if it has a left hand side top level pointer (PAGnode)
|
|
195
|
+
inline bool hasLHSTopLevPtr(const VFGNode* node) const
|
|
196
|
+
{
|
|
197
|
+
return node && SVFUtil::isa<AddrVFGNode,
|
|
198
|
+
CopyVFGNode,
|
|
199
|
+
GepVFGNode,
|
|
200
|
+
LoadVFGNode,
|
|
201
|
+
PHIVFGNode,
|
|
202
|
+
CmpVFGNode,
|
|
203
|
+
BinaryOPVFGNode,
|
|
204
|
+
UnaryOPVFGNode,
|
|
205
|
+
ActualParmVFGNode,
|
|
206
|
+
FormalParmVFGNode,
|
|
207
|
+
ActualRetVFGNode,
|
|
208
|
+
FormalRetVFGNode,
|
|
209
|
+
NullPtrVFGNode>(node);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Given an VFG node, return its left hand side top level pointer (PAGnode)
|
|
213
|
+
const PAGNode* getLHSTopLevPtr(const VFGNode* node) const;
|
|
214
|
+
|
|
215
|
+
/// Existence checks for VFGNodes
|
|
216
|
+
//@{
|
|
217
|
+
inline bool hasStmtVFGNode(const PAGEdge* pagEdge) const
|
|
218
|
+
{
|
|
219
|
+
return PAGEdgeToStmtVFGNodeMap.find(pagEdge) != PAGEdgeToStmtVFGNodeMap.end();
|
|
220
|
+
}
|
|
221
|
+
inline bool hasIntraPHIVFGNode(const PAGNode* pagNode) const
|
|
222
|
+
{
|
|
223
|
+
return PAGNodeToIntraPHIVFGNodeMap.find(pagNode) != PAGNodeToIntraPHIVFGNodeMap.end();
|
|
224
|
+
}
|
|
225
|
+
inline bool hasBinaryOPVFGNode(const PAGNode* pagNode) const
|
|
226
|
+
{
|
|
227
|
+
return PAGNodeToBinaryOPVFGNodeMap.find(pagNode) != PAGNodeToBinaryOPVFGNodeMap.end();
|
|
228
|
+
}
|
|
229
|
+
inline bool hasUnaryOPVFGNode(const PAGNode* pagNode) const
|
|
230
|
+
{
|
|
231
|
+
return PAGNodeToUnaryOPVFGNodeMap.find(pagNode) != PAGNodeToUnaryOPVFGNodeMap.end();
|
|
232
|
+
}
|
|
233
|
+
inline bool hasBranchVFGNode(const PAGNode* pagNode) const
|
|
234
|
+
{
|
|
235
|
+
return PAGNodeToBranchVFGNodeMap.find(pagNode) != PAGNodeToBranchVFGNodeMap.end();
|
|
236
|
+
}
|
|
237
|
+
inline bool hasCmpVFGNode(const PAGNode* pagNode) const
|
|
238
|
+
{
|
|
239
|
+
return PAGNodeToCmpVFGNodeMap.find(pagNode) != PAGNodeToCmpVFGNodeMap.end();
|
|
240
|
+
}
|
|
241
|
+
inline bool hasActualParmVFGNode(const PAGNode* aparm,const CallICFGNode* cs) const
|
|
242
|
+
{
|
|
243
|
+
return PAGNodeToActualParmMap.find(std::make_pair(aparm->getId(),cs)) != PAGNodeToActualParmMap.end();
|
|
244
|
+
}
|
|
245
|
+
inline bool hasActualRetVFGNode(const PAGNode* aret) const
|
|
246
|
+
{
|
|
247
|
+
return PAGNodeToActualRetMap.find(aret) != PAGNodeToActualRetMap.end();
|
|
248
|
+
}
|
|
249
|
+
inline bool hasFormalParmVFGNode(const PAGNode* fparm) const
|
|
250
|
+
{
|
|
251
|
+
return PAGNodeToFormalParmMap.find(fparm) != PAGNodeToFormalParmMap.end();
|
|
252
|
+
}
|
|
253
|
+
inline bool hasFormalRetVFGNode(const PAGNode* fret) const
|
|
254
|
+
{
|
|
255
|
+
return PAGNodeToFormalRetMap.find(fret) != PAGNodeToFormalRetMap.end();
|
|
256
|
+
}
|
|
257
|
+
//@}
|
|
258
|
+
|
|
259
|
+
/// Get an VFGNode
|
|
260
|
+
//@{
|
|
261
|
+
inline StmtVFGNode* getStmtVFGNode(const PAGEdge* pagEdge) const
|
|
262
|
+
{
|
|
263
|
+
PAGEdgeToStmtVFGNodeMapTy::const_iterator it = PAGEdgeToStmtVFGNodeMap.find(pagEdge);
|
|
264
|
+
assert(it != PAGEdgeToStmtVFGNodeMap.end() && "StmtVFGNode can not be found??");
|
|
265
|
+
return it->second;
|
|
266
|
+
}
|
|
267
|
+
inline IntraPHIVFGNode* getIntraPHIVFGNode(const PAGNode* pagNode) const
|
|
268
|
+
{
|
|
269
|
+
PAGNodeToPHIVFGNodeMapTy::const_iterator it = PAGNodeToIntraPHIVFGNodeMap.find(pagNode);
|
|
270
|
+
assert(it != PAGNodeToIntraPHIVFGNodeMap.end() && "PHIVFGNode can not be found??");
|
|
271
|
+
return it->second;
|
|
272
|
+
}
|
|
273
|
+
inline BinaryOPVFGNode* getBinaryOPVFGNode(const PAGNode* pagNode) const
|
|
274
|
+
{
|
|
275
|
+
PAGNodeToBinaryOPVFGNodeMapTy::const_iterator it = PAGNodeToBinaryOPVFGNodeMap.find(pagNode);
|
|
276
|
+
assert(it != PAGNodeToBinaryOPVFGNodeMap.end() && "BinaryOPVFGNode can not be found??");
|
|
277
|
+
return it->second;
|
|
278
|
+
}
|
|
279
|
+
inline UnaryOPVFGNode* getUnaryOPVFGNode(const PAGNode* pagNode) const
|
|
280
|
+
{
|
|
281
|
+
PAGNodeToUnaryOPVFGNodeMapTy::const_iterator it = PAGNodeToUnaryOPVFGNodeMap.find(pagNode);
|
|
282
|
+
assert(it != PAGNodeToUnaryOPVFGNodeMap.end() && "UnaryOPVFGNode can not be found??");
|
|
283
|
+
return it->second;
|
|
284
|
+
}
|
|
285
|
+
inline BranchVFGNode* getBranchVFGNode(const PAGNode* pagNode) const
|
|
286
|
+
{
|
|
287
|
+
PAGNodeToBranchVFGNodeMapTy::const_iterator it = PAGNodeToBranchVFGNodeMap.find(pagNode);
|
|
288
|
+
assert(it != PAGNodeToBranchVFGNodeMap.end() && "BranchVFGNode can not be found??");
|
|
289
|
+
return it->second;
|
|
290
|
+
}
|
|
291
|
+
inline CmpVFGNode* getCmpVFGNode(const PAGNode* pagNode) const
|
|
292
|
+
{
|
|
293
|
+
PAGNodeToCmpVFGNodeMapTy::const_iterator it = PAGNodeToCmpVFGNodeMap.find(pagNode);
|
|
294
|
+
assert(it != PAGNodeToCmpVFGNodeMap.end() && "CmpVFGNode can not be found??");
|
|
295
|
+
return it->second;
|
|
296
|
+
}
|
|
297
|
+
inline ActualParmVFGNode* getActualParmVFGNode(const PAGNode* aparm,const CallICFGNode* cs) const
|
|
298
|
+
{
|
|
299
|
+
PAGNodeToActualParmMapTy::const_iterator it = PAGNodeToActualParmMap.find(std::make_pair(aparm->getId(),cs));
|
|
300
|
+
assert(it!=PAGNodeToActualParmMap.end() && "actual parameter VFG node can not be found??");
|
|
301
|
+
return it->second;
|
|
302
|
+
}
|
|
303
|
+
inline ActualRetVFGNode* getActualRetVFGNode(const PAGNode* aret) const
|
|
304
|
+
{
|
|
305
|
+
PAGNodeToActualRetMapTy::const_iterator it = PAGNodeToActualRetMap.find(aret);
|
|
306
|
+
assert(it!=PAGNodeToActualRetMap.end() && "actual return VFG node can not be found??");
|
|
307
|
+
return it->second;
|
|
308
|
+
}
|
|
309
|
+
inline FormalParmVFGNode* getFormalParmVFGNode(const PAGNode* fparm) const
|
|
310
|
+
{
|
|
311
|
+
PAGNodeToFormalParmMapTy::const_iterator it = PAGNodeToFormalParmMap.find(fparm);
|
|
312
|
+
assert(it!=PAGNodeToFormalParmMap.end() && "formal parameter VFG node can not be found??");
|
|
313
|
+
return it->second;
|
|
314
|
+
}
|
|
315
|
+
inline FormalRetVFGNode* getFormalRetVFGNode(const PAGNode* fret) const
|
|
316
|
+
{
|
|
317
|
+
PAGNodeToFormalRetMapTy::const_iterator it = PAGNodeToFormalRetMap.find(fret);
|
|
318
|
+
assert(it!=PAGNodeToFormalRetMap.end() && "formal return VFG node can not be found??");
|
|
319
|
+
return it->second;
|
|
320
|
+
}
|
|
321
|
+
//@}
|
|
322
|
+
|
|
323
|
+
/// Whether a node is function entry VFGNode
|
|
324
|
+
const FunObjVar* isFunEntryVFGNode(const VFGNode* node) const;
|
|
325
|
+
|
|
326
|
+
/// Whether a PAGNode has a blackhole or const object as its definition
|
|
327
|
+
inline bool hasBlackHoleConstObjAddrAsDef(const PAGNode* pagNode) const
|
|
328
|
+
{
|
|
329
|
+
if (hasDef(pagNode))
|
|
330
|
+
{
|
|
331
|
+
const VFGNode* defNode = getVFGNode(getDef(pagNode));
|
|
332
|
+
if (const AddrVFGNode* addr = SVFUtil::dyn_cast<AddrVFGNode>(defNode))
|
|
333
|
+
{
|
|
334
|
+
if (SVFIR::getPAG()->isBlkObjOrConstantObj(addr->getPAGEdge()->getSrcID()))
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
else if(const CopyVFGNode* copy = SVFUtil::dyn_cast<CopyVFGNode>(defNode))
|
|
338
|
+
{
|
|
339
|
+
if (SVFIR::getPAG()->isNullPtr(copy->getPAGEdge()->getSrcID()))
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/// Return all the VFGNodes of a function
|
|
347
|
+
///@{
|
|
348
|
+
inline VFGNodeSet& getVFGNodes(const FunObjVar *fun)
|
|
349
|
+
{
|
|
350
|
+
return funToVFGNodesMap[fun];
|
|
351
|
+
}
|
|
352
|
+
inline bool hasVFGNodes(const FunObjVar *fun) const
|
|
353
|
+
{
|
|
354
|
+
return funToVFGNodesMap.find(fun) != funToVFGNodesMap.end();
|
|
355
|
+
}
|
|
356
|
+
inline bool VFGNodes(const FunObjVar *fun) const
|
|
357
|
+
{
|
|
358
|
+
return funToVFGNodesMap.find(fun) != funToVFGNodesMap.end();
|
|
359
|
+
}
|
|
360
|
+
inline VFGNodeSet::const_iterator getVFGNodeBegin(const FunObjVar *fun) const
|
|
361
|
+
{
|
|
362
|
+
FunToVFGNodesMapTy::const_iterator it = funToVFGNodesMap.find(fun);
|
|
363
|
+
assert(it != funToVFGNodesMap.end() && "this function does not have any VFGNode");
|
|
364
|
+
return it->second.begin();
|
|
365
|
+
}
|
|
366
|
+
inline VFGNodeSet::const_iterator getVFGNodeEnd(const FunObjVar *fun) const
|
|
367
|
+
{
|
|
368
|
+
FunToVFGNodesMapTy::const_iterator it = funToVFGNodesMap.find(fun);
|
|
369
|
+
assert(it != funToVFGNodesMap.end() && "this function does not have any VFGNode");
|
|
370
|
+
return it->second.end();
|
|
371
|
+
}
|
|
372
|
+
///@}
|
|
373
|
+
/// Add control-flow edges for top level pointers
|
|
374
|
+
//@{
|
|
375
|
+
VFGEdge* addIntraDirectVFEdge(NodeID srcId, NodeID dstId);
|
|
376
|
+
VFGEdge* addCallEdge(NodeID srcId, NodeID dstId, CallSiteID csId);
|
|
377
|
+
VFGEdge* addRetEdge(NodeID srcId, NodeID dstId, CallSiteID csId);
|
|
378
|
+
//@}
|
|
379
|
+
|
|
380
|
+
/// Remove a SVFG edge
|
|
381
|
+
inline void removeVFGEdge(VFGEdge* edge)
|
|
382
|
+
{
|
|
383
|
+
edge->getDstNode()->removeIncomingEdge(edge);
|
|
384
|
+
edge->getSrcNode()->removeOutgoingEdge(edge);
|
|
385
|
+
delete edge;
|
|
386
|
+
}
|
|
387
|
+
/// Remove a VFGNode
|
|
388
|
+
inline void removeVFGNode(VFGNode* node)
|
|
389
|
+
{
|
|
390
|
+
removeGNode(node);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/// Whether we has a SVFG edge
|
|
394
|
+
//@{
|
|
395
|
+
VFGEdge* hasIntraVFGEdge(VFGNode* src, VFGNode* dst, VFGEdge::VFGEdgeK kind);
|
|
396
|
+
VFGEdge* hasInterVFGEdge(VFGNode* src, VFGNode* dst, VFGEdge::VFGEdgeK kind, CallSiteID csId);
|
|
397
|
+
VFGEdge* hasThreadVFGEdge(VFGNode* src, VFGNode* dst, VFGEdge::VFGEdgeK kind);
|
|
398
|
+
//@}
|
|
399
|
+
|
|
400
|
+
/// Add VFG edge
|
|
401
|
+
inline bool addVFGEdge(VFGEdge* edge)
|
|
402
|
+
{
|
|
403
|
+
bool added1 = edge->getDstNode()->addIncomingEdge(edge);
|
|
404
|
+
bool added2 = edge->getSrcNode()->addOutgoingEdge(edge);
|
|
405
|
+
bool both_added = added1 & added2;
|
|
406
|
+
assert(both_added && "VFGEdge not added??");
|
|
407
|
+
return both_added;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
protected:
|
|
411
|
+
|
|
412
|
+
/// sanitize Intra edges, verify that both nodes belong to the same function.
|
|
413
|
+
inline void checkIntraEdgeParents(const VFGNode *srcNode, const VFGNode *dstNode)
|
|
414
|
+
{
|
|
415
|
+
const FunObjVar *srcfun = srcNode->getFun();
|
|
416
|
+
const FunObjVar *dstfun = dstNode->getFun();
|
|
417
|
+
if(srcfun != nullptr && dstfun != nullptr)
|
|
418
|
+
{
|
|
419
|
+
assert((srcfun == dstfun) && "src and dst nodes of an intra VFG edge are not in the same function?");
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/// Add inter VF edge from actual to formal parameters
|
|
424
|
+
inline VFGEdge* addInterEdgeFromAPToFP(ActualParmVFGNode* src, FormalParmVFGNode* dst, CallSiteID csId)
|
|
425
|
+
{
|
|
426
|
+
return addCallEdge(src->getId(),dst->getId(),csId);
|
|
427
|
+
}
|
|
428
|
+
/// Add inter VF edge from callee return to callsite receive parameter
|
|
429
|
+
inline VFGEdge* addInterEdgeFromFRToAR(FormalRetVFGNode* src, ActualRetVFGNode* dst, CallSiteID csId)
|
|
430
|
+
{
|
|
431
|
+
return addRetEdge(src->getId(),dst->getId(),csId);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/// Add inter VF edge from actual to formal parameters
|
|
435
|
+
inline VFGEdge* addInterEdgeFromAPToFP(NodeID src, NodeID dst, CallSiteID csId)
|
|
436
|
+
{
|
|
437
|
+
return addCallEdge(src,dst,csId);
|
|
438
|
+
}
|
|
439
|
+
/// Add inter VF edge from callee return to callsite receive parameter
|
|
440
|
+
inline VFGEdge* addInterEdgeFromFRToAR(NodeID src, NodeID dst, CallSiteID csId)
|
|
441
|
+
{
|
|
442
|
+
return addRetEdge(src,dst,csId);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/// Connect VFG nodes between caller and callee for indirect call site
|
|
446
|
+
//@{
|
|
447
|
+
/// Connect actual-param and formal param
|
|
448
|
+
virtual inline void connectAParamAndFParam(const PAGNode* csArg, const PAGNode* funArg, const CallICFGNode* cbn, CallSiteID csId, VFGEdgeSetTy& edges)
|
|
449
|
+
{
|
|
450
|
+
NodeID actualParam = getActualParmVFGNode(csArg, cbn)->getId();
|
|
451
|
+
NodeID formalParam = getFormalParmVFGNode(funArg)->getId();
|
|
452
|
+
VFGEdge* edge = addInterEdgeFromAPToFP(actualParam, formalParam,csId);
|
|
453
|
+
if (edge != nullptr)
|
|
454
|
+
edges.insert(edge);
|
|
455
|
+
}
|
|
456
|
+
/// Connect formal-ret and actual ret
|
|
457
|
+
virtual inline void connectFRetAndARet(const PAGNode* funReturn, const PAGNode* csReturn, CallSiteID csId, VFGEdgeSetTy& edges)
|
|
458
|
+
{
|
|
459
|
+
NodeID formalRet = getFormalRetVFGNode(funReturn)->getId();
|
|
460
|
+
NodeID actualRet = getActualRetVFGNode(csReturn)->getId();
|
|
461
|
+
VFGEdge* edge = addInterEdgeFromFRToAR(formalRet, actualRet,csId);
|
|
462
|
+
if (edge != nullptr)
|
|
463
|
+
edges.insert(edge);
|
|
464
|
+
}
|
|
465
|
+
//@}
|
|
466
|
+
|
|
467
|
+
/// Given a PAGNode, set/get its def VFG node (definition of top level pointers)
|
|
468
|
+
//@{
|
|
469
|
+
inline void setDef(const PAGNode* pagNode, const VFGNode* node)
|
|
470
|
+
{
|
|
471
|
+
PAGNodeToDefMapTy::iterator it = PAGNodeToDefMap.find(pagNode);
|
|
472
|
+
if(it == PAGNodeToDefMap.end())
|
|
473
|
+
{
|
|
474
|
+
PAGNodeToDefMap[pagNode] = node->getId();
|
|
475
|
+
assert(hasVFGNode(node->getId()) && "not in the map!!");
|
|
476
|
+
}
|
|
477
|
+
else
|
|
478
|
+
{
|
|
479
|
+
assert((it->second == node->getId()) && "a SVFVar can only have unique definition ");
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
inline NodeID getDef(const PAGNode* pagNode) const
|
|
483
|
+
{
|
|
484
|
+
PAGNodeToDefMapTy::const_iterator it = PAGNodeToDefMap.find(pagNode);
|
|
485
|
+
assert(it!=PAGNodeToDefMap.end() && "SVFVar does not have a definition??");
|
|
486
|
+
return it->second;
|
|
487
|
+
}
|
|
488
|
+
inline bool hasDef(const PAGNode* pagNode) const
|
|
489
|
+
{
|
|
490
|
+
return (PAGNodeToDefMap.find(pagNode) != PAGNodeToDefMap.end());
|
|
491
|
+
}
|
|
492
|
+
//@}
|
|
493
|
+
|
|
494
|
+
/// Create VFG nodes
|
|
495
|
+
void addVFGNodes();
|
|
496
|
+
|
|
497
|
+
/// Get PAGEdge set
|
|
498
|
+
virtual inline SVFStmt::SVFStmtSetTy& getPAGEdgeSet(SVFStmt::PEDGEK kind)
|
|
499
|
+
{
|
|
500
|
+
if (isPtrOnlySVFG())
|
|
501
|
+
return pag->getPTASVFStmtSet(kind);
|
|
502
|
+
else
|
|
503
|
+
return pag->getSVFStmtSet(kind);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
virtual inline bool isInterestedPAGNode(const SVFVar* node) const
|
|
507
|
+
{
|
|
508
|
+
if (isPtrOnlySVFG())
|
|
509
|
+
return node->isPointer();
|
|
510
|
+
else
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/// Create edges between VFG nodes within a function
|
|
515
|
+
void connectDirectVFGEdges();
|
|
516
|
+
|
|
517
|
+
/// Create edges between VFG nodes across functions
|
|
518
|
+
void addVFGInterEdges(const CallICFGNode* cs, const FunObjVar* callee);
|
|
519
|
+
|
|
520
|
+
inline bool isPhiCopyEdge(const PAGEdge* copy) const
|
|
521
|
+
{
|
|
522
|
+
return pag->isPhiNode(copy->getDstNode());
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/// Add a VFG node
|
|
526
|
+
virtual inline void addVFGNode(VFGNode* vfgNode, ICFGNode* icfgNode)
|
|
527
|
+
{
|
|
528
|
+
addGNode(vfgNode->getId(), vfgNode);
|
|
529
|
+
vfgNode->setICFGNode(icfgNode);
|
|
530
|
+
icfgNode->addVFGNode(vfgNode);
|
|
531
|
+
|
|
532
|
+
if(const FunObjVar* fun = icfgNode->getFun())
|
|
533
|
+
funToVFGNodesMap[fun].insert(vfgNode);
|
|
534
|
+
else
|
|
535
|
+
globalVFGNodes.insert(vfgNode);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/// Add a VFG node for program statement
|
|
539
|
+
inline void addStmtVFGNode(StmtVFGNode* node, const PAGEdge* pagEdge)
|
|
540
|
+
{
|
|
541
|
+
assert(PAGEdgeToStmtVFGNodeMap.find(pagEdge)==PAGEdgeToStmtVFGNodeMap.end() && "should not insert twice!");
|
|
542
|
+
PAGEdgeToStmtVFGNodeMap[pagEdge] = node;
|
|
543
|
+
addVFGNode(node, pagEdge->getICFGNode());
|
|
544
|
+
}
|
|
545
|
+
/// Add a Dummy VFG node for null pointer definition
|
|
546
|
+
/// To be noted for black hole pointer it has already has address edge connected
|
|
547
|
+
inline void addNullPtrVFGNode(const PAGNode* pagNode)
|
|
548
|
+
{
|
|
549
|
+
NullPtrVFGNode* sNode = new NullPtrVFGNode(totalVFGNode++,pagNode);
|
|
550
|
+
addVFGNode(sNode, pag->getICFG()->getGlobalICFGNode());
|
|
551
|
+
setDef(pagNode,sNode);
|
|
552
|
+
}
|
|
553
|
+
/// Add an Address VFG node
|
|
554
|
+
inline void addAddrVFGNode(const AddrStmt* addr)
|
|
555
|
+
{
|
|
556
|
+
AddrVFGNode* sNode = new AddrVFGNode(totalVFGNode++,addr);
|
|
557
|
+
addStmtVFGNode(sNode, addr);
|
|
558
|
+
setDef(addr->getLHSVar(),sNode);
|
|
559
|
+
}
|
|
560
|
+
/// Add a Copy VFG node
|
|
561
|
+
inline void addCopyVFGNode(const CopyStmt* copy)
|
|
562
|
+
{
|
|
563
|
+
CopyVFGNode* sNode = new CopyVFGNode(totalVFGNode++,copy);
|
|
564
|
+
addStmtVFGNode(sNode, copy);
|
|
565
|
+
setDef(copy->getLHSVar(),sNode);
|
|
566
|
+
}
|
|
567
|
+
/// Add a Gep VFG node
|
|
568
|
+
inline void addGepVFGNode(const GepStmt* gep)
|
|
569
|
+
{
|
|
570
|
+
GepVFGNode* sNode = new GepVFGNode(totalVFGNode++,gep);
|
|
571
|
+
addStmtVFGNode(sNode, gep);
|
|
572
|
+
setDef(gep->getLHSVar(),sNode);
|
|
573
|
+
}
|
|
574
|
+
/// Add a Load VFG node
|
|
575
|
+
void addLoadVFGNode(const LoadStmt* load)
|
|
576
|
+
{
|
|
577
|
+
LoadVFGNode* sNode = new LoadVFGNode(totalVFGNode++,load);
|
|
578
|
+
addStmtVFGNode(sNode, load);
|
|
579
|
+
setDef(load->getLHSVar(),sNode);
|
|
580
|
+
}
|
|
581
|
+
/// Add a Store VFG node,
|
|
582
|
+
/// To be noted store does not create a new pointer, we do not set def for any SVFIR node
|
|
583
|
+
void addStoreVFGNode(const StoreStmt* store)
|
|
584
|
+
{
|
|
585
|
+
StoreVFGNode* sNode = new StoreVFGNode(totalVFGNode++,store);
|
|
586
|
+
addStmtVFGNode(sNode, store);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/// Add an actual parameter VFG node
|
|
590
|
+
/// To be noted that multiple actual parameters may have same value (PAGNode)
|
|
591
|
+
/// So we need to make a pair <PAGNodeID,CallSiteID> to find the right VFGParmNode
|
|
592
|
+
inline void addActualParmVFGNode(const PAGNode* aparm, const CallICFGNode* cs)
|
|
593
|
+
{
|
|
594
|
+
ActualParmVFGNode* sNode = new ActualParmVFGNode(totalVFGNode++,aparm,cs);
|
|
595
|
+
addVFGNode(sNode, const_cast<CallICFGNode*>(cs));
|
|
596
|
+
PAGNodeToActualParmMap[std::make_pair(aparm->getId(),cs)] = sNode;
|
|
597
|
+
/// do not set def here, this node is not a variable definition
|
|
598
|
+
}
|
|
599
|
+
/// Add a formal parameter VFG node
|
|
600
|
+
inline void addFormalParmVFGNode(const PAGNode* fparm, const FunObjVar* fun, CallPESet& callPEs)
|
|
601
|
+
{
|
|
602
|
+
FormalParmVFGNode* sNode = new FormalParmVFGNode(totalVFGNode++,fparm,fun);
|
|
603
|
+
addVFGNode(sNode, pag->getICFG()->getFunEntryICFGNode(fun));
|
|
604
|
+
for(CallPESet::const_iterator it = callPEs.begin(), eit=callPEs.end();
|
|
605
|
+
it!=eit; ++it)
|
|
606
|
+
sNode->addCallPE(*it);
|
|
607
|
+
|
|
608
|
+
setDef(fparm,sNode);
|
|
609
|
+
PAGNodeToFormalParmMap[fparm] = sNode;
|
|
610
|
+
}
|
|
611
|
+
/// Add a callee Return VFG node
|
|
612
|
+
/// To be noted that here we assume returns of a procedure have already been unified into one
|
|
613
|
+
/// Otherwise, we need to handle formalRet using <PAGNodeID,CallSiteID> pair to find FormalRetVFG node same as handling actual parameters
|
|
614
|
+
inline void addFormalRetVFGNode(const PAGNode* uniqueFunRet, const FunObjVar* fun, RetPESet& retPEs)
|
|
615
|
+
{
|
|
616
|
+
FormalRetVFGNode *sNode = new FormalRetVFGNode(totalVFGNode++, uniqueFunRet, fun);
|
|
617
|
+
addVFGNode(sNode, pag->getICFG()->getFunExitICFGNode(fun));
|
|
618
|
+
for (RetPESet::const_iterator it = retPEs.begin(), eit = retPEs.end(); it != eit; ++it)
|
|
619
|
+
sNode->addRetPE(*it);
|
|
620
|
+
|
|
621
|
+
PAGNodeToFormalRetMap[uniqueFunRet] = sNode;
|
|
622
|
+
/// if this uniqueFunRet is a phi node, which means it will receive values from multiple return instructions of fun
|
|
623
|
+
/// we will set this phi node's def later
|
|
624
|
+
/// Ideally, every function uniqueFunRet should be a PhiNode (SVFIRBuilder.cpp), unless it does not have ret instruction
|
|
625
|
+
if (!pag->isPhiNode(uniqueFunRet))
|
|
626
|
+
{
|
|
627
|
+
std::string warn = fun->getName();
|
|
628
|
+
SVFUtil::writeWrnMsg(warn + " does not have any ret instruction!");
|
|
629
|
+
setDef(uniqueFunRet, sNode);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
/// Add a callsite Receive VFG node
|
|
633
|
+
inline void addActualRetVFGNode(const PAGNode* ret,const CallICFGNode* cs)
|
|
634
|
+
{
|
|
635
|
+
ActualRetVFGNode* sNode = new ActualRetVFGNode(totalVFGNode++,ret,cs);
|
|
636
|
+
addVFGNode(sNode, const_cast<RetICFGNode*>(cs->getRetICFGNode()));
|
|
637
|
+
setDef(ret,sNode);
|
|
638
|
+
PAGNodeToActualRetMap[ret] = sNode;
|
|
639
|
+
}
|
|
640
|
+
/// Add an llvm PHI VFG node
|
|
641
|
+
inline void addIntraPHIVFGNode(const MultiOpndStmt* edge)
|
|
642
|
+
{
|
|
643
|
+
IntraPHIVFGNode* sNode = new IntraPHIVFGNode(totalVFGNode++,edge->getRes());
|
|
644
|
+
u32_t pos = 0;
|
|
645
|
+
for(auto var : edge->getOpndVars())
|
|
646
|
+
{
|
|
647
|
+
sNode->setOpVerAndBB(pos, var, edge->getICFGNode());
|
|
648
|
+
pos++;
|
|
649
|
+
}
|
|
650
|
+
addVFGNode(sNode,edge->getICFGNode());
|
|
651
|
+
setDef(edge->getRes(),sNode);
|
|
652
|
+
PAGNodeToIntraPHIVFGNodeMap[edge->getRes()] = sNode;
|
|
653
|
+
}
|
|
654
|
+
/// Add a Compare VFG node
|
|
655
|
+
inline void addCmpVFGNode(const CmpStmt* edge)
|
|
656
|
+
{
|
|
657
|
+
CmpVFGNode* sNode = new CmpVFGNode(totalVFGNode++, edge->getRes());
|
|
658
|
+
u32_t pos = 0;
|
|
659
|
+
for(auto var : edge->getOpndVars())
|
|
660
|
+
{
|
|
661
|
+
sNode->setOpVer(pos, var);
|
|
662
|
+
pos++;
|
|
663
|
+
}
|
|
664
|
+
addVFGNode(sNode,edge->getICFGNode());
|
|
665
|
+
setDef(edge->getRes(),sNode);
|
|
666
|
+
PAGNodeToCmpVFGNodeMap[edge->getRes()] = sNode;
|
|
667
|
+
}
|
|
668
|
+
/// Add a BinaryOperator VFG node
|
|
669
|
+
inline void addBinaryOPVFGNode(const BinaryOPStmt* edge)
|
|
670
|
+
{
|
|
671
|
+
BinaryOPVFGNode* sNode = new BinaryOPVFGNode(totalVFGNode++, edge->getRes());
|
|
672
|
+
u32_t pos = 0;
|
|
673
|
+
for(auto var : edge->getOpndVars())
|
|
674
|
+
{
|
|
675
|
+
sNode->setOpVer(pos, var);
|
|
676
|
+
pos++;
|
|
677
|
+
}
|
|
678
|
+
addVFGNode(sNode,edge->getICFGNode());
|
|
679
|
+
setDef(edge->getRes(),sNode);
|
|
680
|
+
PAGNodeToBinaryOPVFGNodeMap[edge->getRes()] = sNode;
|
|
681
|
+
}
|
|
682
|
+
/// Add a UnaryOperator VFG node
|
|
683
|
+
inline void addUnaryOPVFGNode(const UnaryOPStmt* edge)
|
|
684
|
+
{
|
|
685
|
+
UnaryOPVFGNode* sNode = new UnaryOPVFGNode(totalVFGNode++, edge->getRes());
|
|
686
|
+
sNode->setOpVer(0, edge->getOpVar());
|
|
687
|
+
addVFGNode(sNode,edge->getICFGNode());
|
|
688
|
+
setDef(edge->getRes(),sNode);
|
|
689
|
+
PAGNodeToUnaryOPVFGNodeMap[edge->getRes()] = sNode;
|
|
690
|
+
}
|
|
691
|
+
/// Add a BranchVFGNode
|
|
692
|
+
inline void addBranchVFGNode(const BranchStmt* edge)
|
|
693
|
+
{
|
|
694
|
+
BranchVFGNode* sNode = new BranchVFGNode(totalVFGNode++, edge);
|
|
695
|
+
addVFGNode(sNode,edge->getICFGNode());
|
|
696
|
+
setDef(edge->getBranchInst(),sNode);
|
|
697
|
+
PAGNodeToBranchVFGNodeMap[edge->getBranchInst()] = sNode;
|
|
698
|
+
}
|
|
699
|
+
};
|
|
700
|
+
|
|
701
|
+
} // End namespace SVF
|
|
702
|
+
|
|
703
|
+
namespace SVF
|
|
704
|
+
{
|
|
705
|
+
/* !
|
|
706
|
+
* GenericGraphTraits specializations for generic graph algorithms.
|
|
707
|
+
* Provide graph traits for traversing from a constraint node using standard graph traversals.
|
|
708
|
+
*/
|
|
709
|
+
template<> struct GenericGraphTraits<SVF::VFGNode*> : public GenericGraphTraits<SVF::GenericNode<SVF::VFGNode,SVF::VFGEdge>* >
|
|
710
|
+
{
|
|
711
|
+
};
|
|
712
|
+
|
|
713
|
+
/// Inverse GenericGraphTraits specializations for call graph node, it is used for inverse traversal.
|
|
714
|
+
template<>
|
|
715
|
+
struct GenericGraphTraits<Inverse<SVF::VFGNode *> > : public GenericGraphTraits<Inverse<SVF::GenericNode<SVF::VFGNode,SVF::VFGEdge>* > >
|
|
716
|
+
{
|
|
717
|
+
};
|
|
718
|
+
|
|
719
|
+
template<> struct GenericGraphTraits<SVF::VFG*> : public GenericGraphTraits<SVF::GenericGraph<SVF::VFGNode,SVF::VFGEdge>* >
|
|
720
|
+
{
|
|
721
|
+
typedef SVF::VFGNode *NodeRef;
|
|
722
|
+
};
|
|
723
|
+
|
|
724
|
+
} // End namespace llvm
|
|
725
|
+
|
|
726
|
+
#endif /* INCLUDE_UTIL_VFG_H_ */
|