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,331 @@
|
|
|
1
|
+
//===- ICFG.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
|
+
* ICFG.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: 11 Sep. 2018
|
|
27
|
+
* Author: Yulei
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
#ifndef INCLUDE_UTIL_ICFG_H_
|
|
31
|
+
#define INCLUDE_UTIL_ICFG_H_
|
|
32
|
+
|
|
33
|
+
#include "Graphs/ICFGNode.h"
|
|
34
|
+
#include "Graphs/ICFGEdge.h"
|
|
35
|
+
#include "Util/WorkList.h"
|
|
36
|
+
#include "MemoryModel/SVFLoop.h"
|
|
37
|
+
|
|
38
|
+
namespace SVF
|
|
39
|
+
{
|
|
40
|
+
|
|
41
|
+
class CallGraph;
|
|
42
|
+
|
|
43
|
+
/*!
|
|
44
|
+
* Interprocedural Control-Flow Graph (ICFG)
|
|
45
|
+
*/
|
|
46
|
+
typedef GenericGraph<ICFGNode,ICFGEdge> GenericICFGTy;
|
|
47
|
+
class ICFG : public GenericICFGTy
|
|
48
|
+
{
|
|
49
|
+
friend class ICFGBuilder;
|
|
50
|
+
friend class SVFIRWriter;
|
|
51
|
+
friend class SVFIRReader;
|
|
52
|
+
friend class ICFGSimplification;
|
|
53
|
+
|
|
54
|
+
public:
|
|
55
|
+
|
|
56
|
+
typedef OrderedMap<NodeID, ICFGNode *> ICFGNodeIDToNodeMapTy;
|
|
57
|
+
typedef ICFGEdge::ICFGEdgeSetTy ICFGEdgeSetTy;
|
|
58
|
+
typedef ICFGNodeIDToNodeMapTy::iterator iterator;
|
|
59
|
+
typedef ICFGNodeIDToNodeMapTy::const_iterator const_iterator;
|
|
60
|
+
|
|
61
|
+
typedef Map<const FunObjVar*, FunEntryICFGNode *> FunToFunEntryNodeMapTy;
|
|
62
|
+
typedef Map<const FunObjVar*, FunExitICFGNode *> FunToFunExitNodeMapTy;
|
|
63
|
+
typedef std::vector<const SVFLoop *> SVFLoopVec;
|
|
64
|
+
typedef Map<const ICFGNode *, SVFLoopVec> ICFGNodeToSVFLoopVec;
|
|
65
|
+
|
|
66
|
+
NodeID totalICFGNode;
|
|
67
|
+
|
|
68
|
+
private:
|
|
69
|
+
FunToFunEntryNodeMapTy FunToFunEntryNodeMap; ///< map a function to its FunExitICFGNode
|
|
70
|
+
FunToFunExitNodeMapTy FunToFunExitNodeMap; ///< map a function to its FunEntryICFGNode
|
|
71
|
+
GlobalICFGNode* globalBlockNode; ///< unique basic block for all globals
|
|
72
|
+
ICFGNodeToSVFLoopVec icfgNodeToSVFLoopVec; ///< map ICFG node to the SVF loops where it resides
|
|
73
|
+
|
|
74
|
+
Map<const ICFGNode*, std::vector<const ICFGNode*>> _subNodes; ///<map a node(1st node of basicblock) to its subnodes
|
|
75
|
+
Map<const ICFGNode*, const ICFGNode*> _repNode; ///<map a subnode to its representative node(1st node of basicblock)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
public:
|
|
79
|
+
/// Constructor
|
|
80
|
+
ICFG();
|
|
81
|
+
|
|
82
|
+
/// Destructor
|
|
83
|
+
~ICFG() override;
|
|
84
|
+
|
|
85
|
+
/// Get a ICFG node
|
|
86
|
+
inline ICFGNode* getICFGNode(NodeID id) const
|
|
87
|
+
{
|
|
88
|
+
return getGNode(id);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// Whether has the ICFGNode
|
|
92
|
+
inline bool hasICFGNode(NodeID id) const
|
|
93
|
+
{
|
|
94
|
+
return hasGNode(id);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// Whether we has a SVFG edge
|
|
98
|
+
//@{
|
|
99
|
+
ICFGEdge* hasIntraICFGEdge(ICFGNode* src, ICFGNode* dst, ICFGEdge::ICFGEdgeK kind);
|
|
100
|
+
ICFGEdge* hasInterICFGEdge(ICFGNode* src, ICFGNode* dst, ICFGEdge::ICFGEdgeK kind);
|
|
101
|
+
ICFGEdge* hasThreadICFGEdge(ICFGNode* src, ICFGNode* dst, ICFGEdge::ICFGEdgeK kind);
|
|
102
|
+
//@}
|
|
103
|
+
|
|
104
|
+
/// Get a SVFG edge according to src and dst
|
|
105
|
+
ICFGEdge* getICFGEdge(const ICFGNode* src, const ICFGNode* dst, ICFGEdge::ICFGEdgeK kind);
|
|
106
|
+
|
|
107
|
+
/// Dump graph into dot file
|
|
108
|
+
void dump(const std::string& file, bool simple = false);
|
|
109
|
+
|
|
110
|
+
/// View graph from the debugger
|
|
111
|
+
void view();
|
|
112
|
+
|
|
113
|
+
/// update ICFG for indirect calls
|
|
114
|
+
void updateCallGraph(CallGraph* callgraph);
|
|
115
|
+
|
|
116
|
+
/// Whether node is in a loop
|
|
117
|
+
inline bool isInLoop(const ICFGNode *node)
|
|
118
|
+
{
|
|
119
|
+
auto it = icfgNodeToSVFLoopVec.find(node);
|
|
120
|
+
return it != icfgNodeToSVFLoopVec.end();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// Insert (node, loop) to icfgNodeToSVFLoopVec
|
|
124
|
+
inline void addNodeToSVFLoop(const ICFGNode *node, const SVFLoop* loop)
|
|
125
|
+
{
|
|
126
|
+
icfgNodeToSVFLoopVec[node].push_back(loop);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// Get loops where a node resides
|
|
130
|
+
inline SVFLoopVec& getSVFLoops(const ICFGNode *node)
|
|
131
|
+
{
|
|
132
|
+
auto it = icfgNodeToSVFLoopVec.find(node);
|
|
133
|
+
assert(it != icfgNodeToSVFLoopVec.end() && "node not in loop");
|
|
134
|
+
return it->second;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
inline const ICFGNodeToSVFLoopVec& getIcfgNodeToSVFLoopVec() const
|
|
138
|
+
{
|
|
139
|
+
return icfgNodeToSVFLoopVec;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
protected:
|
|
143
|
+
/// Add intraprocedural and interprocedural control-flow edges.
|
|
144
|
+
//@{
|
|
145
|
+
ICFGEdge* addIntraEdge(ICFGNode* srcNode, ICFGNode* dstNode);
|
|
146
|
+
ICFGEdge* addConditionalIntraEdge(ICFGNode* srcNode, ICFGNode* dstNode, s64_t branchCondVal);
|
|
147
|
+
ICFGEdge* addCallEdge(ICFGNode* srcNode, ICFGNode* dstNode);
|
|
148
|
+
ICFGEdge* addRetEdge(ICFGNode* srcNode, ICFGNode* dstNode);
|
|
149
|
+
//@}
|
|
150
|
+
/// Remove a ICFG edge
|
|
151
|
+
inline void removeICFGEdge(ICFGEdge* edge)
|
|
152
|
+
{
|
|
153
|
+
edge->getDstNode()->removeIncomingEdge(edge);
|
|
154
|
+
edge->getSrcNode()->removeOutgoingEdge(edge);
|
|
155
|
+
delete edge;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/// Remove a ICFGNode
|
|
159
|
+
inline void removeICFGNode(ICFGNode* node)
|
|
160
|
+
{
|
|
161
|
+
removeGNode(node);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/// sanitize Intra edges, verify that both nodes belong to the same function.
|
|
165
|
+
inline void checkIntraEdgeParents(const ICFGNode *srcNode, const ICFGNode *dstNode)
|
|
166
|
+
{
|
|
167
|
+
const FunObjVar* srcfun = srcNode->getFun();
|
|
168
|
+
const FunObjVar* dstfun = dstNode->getFun();
|
|
169
|
+
if(srcfun != nullptr && dstfun != nullptr)
|
|
170
|
+
{
|
|
171
|
+
assert((srcfun == dstfun) && "src and dst nodes of an intra edge should in the same function!" );
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
virtual inline IntraICFGNode* addIntraICFGNode(const SVFBasicBlock* bb, bool isRet)
|
|
176
|
+
{
|
|
177
|
+
IntraICFGNode* intraIcfgNode =
|
|
178
|
+
new IntraICFGNode(totalICFGNode++, bb, isRet);
|
|
179
|
+
addICFGNode(intraIcfgNode);
|
|
180
|
+
return intraIcfgNode;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
virtual inline CallICFGNode* addCallICFGNode(
|
|
184
|
+
const SVFBasicBlock* bb, const SVFType* ty,
|
|
185
|
+
const FunObjVar* calledFunc, bool isVararg, bool isvcall,
|
|
186
|
+
s32_t vcallIdx, const std::string& funNameOfVcall)
|
|
187
|
+
{
|
|
188
|
+
|
|
189
|
+
CallICFGNode* callICFGNode =
|
|
190
|
+
new CallICFGNode(totalICFGNode++, bb, ty, calledFunc, isVararg,
|
|
191
|
+
isvcall, vcallIdx, funNameOfVcall);
|
|
192
|
+
addICFGNode(callICFGNode);
|
|
193
|
+
return callICFGNode;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
virtual inline RetICFGNode* addRetICFGNode(CallICFGNode* call)
|
|
197
|
+
{
|
|
198
|
+
RetICFGNode* retICFGNode = new RetICFGNode(totalICFGNode++, call);
|
|
199
|
+
call->setRetICFGNode(retICFGNode);
|
|
200
|
+
addICFGNode(retICFGNode);
|
|
201
|
+
return retICFGNode;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
virtual inline FunEntryICFGNode* addFunEntryICFGNode(const FunObjVar* svfFunc)
|
|
205
|
+
{
|
|
206
|
+
FunEntryICFGNode* sNode = new FunEntryICFGNode(totalICFGNode++,svfFunc);
|
|
207
|
+
addICFGNode(sNode);
|
|
208
|
+
return FunToFunEntryNodeMap[svfFunc] = sNode;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
virtual inline FunExitICFGNode* addFunExitICFGNode(const FunObjVar* svfFunc)
|
|
212
|
+
{
|
|
213
|
+
FunExitICFGNode* sNode = new FunExitICFGNode(totalICFGNode++, svfFunc);
|
|
214
|
+
addICFGNode(sNode);
|
|
215
|
+
return FunToFunExitNodeMap[svfFunc] = sNode;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/// Add a ICFG node
|
|
219
|
+
virtual inline void addICFGNode(ICFGNode* node)
|
|
220
|
+
{
|
|
221
|
+
addGNode(node->getId(),node);
|
|
222
|
+
_repNode[node] = node;
|
|
223
|
+
_subNodes[node].push_back(node);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
public:
|
|
227
|
+
/// Get a basic block ICFGNode
|
|
228
|
+
/// TODO:: need to fix the assertions
|
|
229
|
+
//@{
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
FunEntryICFGNode* getFunEntryICFGNode(const FunObjVar* fun);
|
|
233
|
+
|
|
234
|
+
FunExitICFGNode* getFunExitICFGNode(const FunObjVar* fun);
|
|
235
|
+
|
|
236
|
+
inline GlobalICFGNode* getGlobalICFGNode() const
|
|
237
|
+
{
|
|
238
|
+
return globalBlockNode;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const std::vector<const ICFGNode*>& getSubNodes(const ICFGNode* node) const
|
|
242
|
+
{
|
|
243
|
+
return _subNodes.at(node);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const ICFGNode* getRepNode(const ICFGNode* node) const
|
|
247
|
+
{
|
|
248
|
+
return _repNode.at(node);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
void updateSubAndRep(const ICFGNode* rep, const ICFGNode* sub)
|
|
253
|
+
{
|
|
254
|
+
addSubNode(rep, sub);
|
|
255
|
+
updateRepNode(rep, sub);
|
|
256
|
+
}
|
|
257
|
+
//@}
|
|
258
|
+
|
|
259
|
+
private:
|
|
260
|
+
/// when ICFG is simplified, SubNode would merge repNode, then update the map
|
|
261
|
+
void addSubNode(const ICFGNode* rep, const ICFGNode* sub)
|
|
262
|
+
{
|
|
263
|
+
std::vector<const ICFGNode*>& subNodes = _subNodes[sub];
|
|
264
|
+
if(std::find(subNodes.begin(), subNodes.end(), rep) == subNodes.end())
|
|
265
|
+
{
|
|
266
|
+
subNodes.push_back(rep);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/// when ICFG is simplified, some node would be removed, this map records the removed node to its rep node
|
|
271
|
+
void updateRepNode(const ICFGNode* rep, const ICFGNode* sub)
|
|
272
|
+
{
|
|
273
|
+
_repNode[rep] = sub;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/// Add ICFG edge, only used by addIntraEdge, addCallEdge, addRetEdge etc.
|
|
277
|
+
inline bool addICFGEdge(ICFGEdge* edge)
|
|
278
|
+
{
|
|
279
|
+
bool added1 = edge->getDstNode()->addIncomingEdge(edge);
|
|
280
|
+
bool added2 = edge->getSrcNode()->addOutgoingEdge(edge);
|
|
281
|
+
bool all_added = added1 && added2;
|
|
282
|
+
assert(all_added && "ICFGEdge not added?");
|
|
283
|
+
return all_added;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/// Get/Add a function entry node
|
|
287
|
+
inline FunEntryICFGNode* getFunEntryBlock(const FunObjVar* fun)
|
|
288
|
+
{
|
|
289
|
+
FunToFunEntryNodeMapTy::const_iterator it = FunToFunEntryNodeMap.find(fun);
|
|
290
|
+
if (it == FunToFunEntryNodeMap.end())
|
|
291
|
+
return nullptr;
|
|
292
|
+
return it->second;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/// Get/Add a function exit node
|
|
296
|
+
inline FunExitICFGNode* getFunExitBlock(const FunObjVar* fun)
|
|
297
|
+
{
|
|
298
|
+
FunToFunExitNodeMapTy::const_iterator it = FunToFunExitNodeMap.find(fun);
|
|
299
|
+
if (it == FunToFunExitNodeMap.end())
|
|
300
|
+
return nullptr;
|
|
301
|
+
return it->second;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
} // End namespace SVF
|
|
307
|
+
|
|
308
|
+
namespace SVF
|
|
309
|
+
{
|
|
310
|
+
/* !
|
|
311
|
+
* GenericGraphTraits specializations for generic graph algorithms.
|
|
312
|
+
* Provide graph traits for traversing from a constraint node using standard graph traversals.
|
|
313
|
+
*/
|
|
314
|
+
template<> struct GenericGraphTraits<SVF::ICFGNode*> : public GenericGraphTraits<SVF::GenericNode<SVF::ICFGNode,SVF::ICFGEdge>* >
|
|
315
|
+
{
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/// Inverse GenericGraphTraits specializations for call graph node, it is used for inverse traversal.
|
|
319
|
+
template<>
|
|
320
|
+
struct GenericGraphTraits<Inverse<SVF::ICFGNode *> > : public GenericGraphTraits<Inverse<SVF::GenericNode<SVF::ICFGNode,SVF::ICFGEdge>* > >
|
|
321
|
+
{
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
template<> struct GenericGraphTraits<SVF::ICFG*> : public GenericGraphTraits<SVF::GenericGraph<SVF::ICFGNode,SVF::ICFGEdge>* >
|
|
325
|
+
{
|
|
326
|
+
typedef SVF::ICFGNode *NodeRef;
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
} // End namespace llvm
|
|
330
|
+
|
|
331
|
+
#endif /* INCLUDE_UTIL_ICFG_H_ */
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
//===- ICFGEdge.h -- ICFG edge------------------------------------------------//
|
|
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
|
+
* ICFGEdge.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: Sep 11, 2018
|
|
27
|
+
* Author: Yulei Sui
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
#ifndef ICFGEdge_H_
|
|
31
|
+
#define ICFGEdge_H_
|
|
32
|
+
|
|
33
|
+
namespace SVF
|
|
34
|
+
{
|
|
35
|
+
|
|
36
|
+
class ICFGNode;
|
|
37
|
+
class CallPE;
|
|
38
|
+
class RetPE;
|
|
39
|
+
|
|
40
|
+
/*!
|
|
41
|
+
* Interprocedural control-flow and value-flow edge, representing the control- and value-flow dependence between two nodes
|
|
42
|
+
*/
|
|
43
|
+
typedef GenericEdge<ICFGNode> GenericICFGEdgeTy;
|
|
44
|
+
class ICFGEdge : public GenericICFGEdgeTy
|
|
45
|
+
{
|
|
46
|
+
friend class SVFIRWriter;
|
|
47
|
+
friend class SVFIRReader;
|
|
48
|
+
|
|
49
|
+
public:
|
|
50
|
+
/// ten types of ICFG edge
|
|
51
|
+
/// three types of control-flow edges
|
|
52
|
+
/// seven types of value-flow edges
|
|
53
|
+
enum ICFGEdgeK
|
|
54
|
+
{
|
|
55
|
+
IntraCF,
|
|
56
|
+
CallCF,
|
|
57
|
+
RetCF,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
typedef ICFGEdgeK SVFGEdgeK;
|
|
61
|
+
|
|
62
|
+
public:
|
|
63
|
+
/// Constructor
|
|
64
|
+
ICFGEdge(ICFGNode* s, ICFGNode* d, GEdgeFlag k) : GenericICFGEdgeTy(s, d, k)
|
|
65
|
+
{
|
|
66
|
+
}
|
|
67
|
+
/// Destructor
|
|
68
|
+
~ICFGEdge() {}
|
|
69
|
+
|
|
70
|
+
/// Get methods of the components
|
|
71
|
+
//@{
|
|
72
|
+
inline bool isCFGEdge() const
|
|
73
|
+
{
|
|
74
|
+
return getEdgeKind() == IntraCF || getEdgeKind() == CallCF ||
|
|
75
|
+
getEdgeKind() == RetCF;
|
|
76
|
+
}
|
|
77
|
+
inline bool isCallCFGEdge() const
|
|
78
|
+
{
|
|
79
|
+
return getEdgeKind() == CallCF;
|
|
80
|
+
}
|
|
81
|
+
inline bool isRetCFGEdge() const
|
|
82
|
+
{
|
|
83
|
+
return getEdgeKind() == RetCF;
|
|
84
|
+
}
|
|
85
|
+
inline bool isIntraCFGEdge() const
|
|
86
|
+
{
|
|
87
|
+
return getEdgeKind() == IntraCF;
|
|
88
|
+
}
|
|
89
|
+
//@}
|
|
90
|
+
typedef GenericNode<ICFGNode, ICFGEdge>::GEdgeSetTy ICFGEdgeSetTy;
|
|
91
|
+
typedef ICFGEdgeSetTy SVFGEdgeSetTy;
|
|
92
|
+
/// Compute the unique edgeFlag value from edge kind and CallSiteID.
|
|
93
|
+
static inline GEdgeFlag makeEdgeFlagWithInvokeID(GEdgeKind k, CallSiteID cs)
|
|
94
|
+
{
|
|
95
|
+
return (cs << EdgeKindMaskBits) | k;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/// Overloading operator << for dumping ICFG node ID
|
|
99
|
+
//@{
|
|
100
|
+
friend OutStream& operator<<(OutStream& o, const ICFGEdge& edge)
|
|
101
|
+
{
|
|
102
|
+
o << edge.toString();
|
|
103
|
+
return o;
|
|
104
|
+
}
|
|
105
|
+
//@}
|
|
106
|
+
|
|
107
|
+
virtual const std::string toString() const;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/*!
|
|
111
|
+
* Intra ICFG edge representing control-flows between basic blocks within a function
|
|
112
|
+
*/
|
|
113
|
+
class IntraCFGEdge : public ICFGEdge
|
|
114
|
+
{
|
|
115
|
+
friend class SVFIRWriter;
|
|
116
|
+
friend class SVFIRReader;
|
|
117
|
+
friend class ICFG;
|
|
118
|
+
friend class SVFIRBuilder;
|
|
119
|
+
|
|
120
|
+
public:
|
|
121
|
+
/// Constructor
|
|
122
|
+
IntraCFGEdge(ICFGNode* s, ICFGNode* d)
|
|
123
|
+
: ICFGEdge(s, d, IntraCF), conditionVar(nullptr), branchCondVal(0)
|
|
124
|
+
{
|
|
125
|
+
}
|
|
126
|
+
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
127
|
+
//@{
|
|
128
|
+
static inline bool classof(const IntraCFGEdge*)
|
|
129
|
+
{
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
static inline bool classof(const ICFGEdge* edge)
|
|
133
|
+
{
|
|
134
|
+
return edge->getEdgeKind() == IntraCF;
|
|
135
|
+
}
|
|
136
|
+
static inline bool classof(const GenericICFGEdgeTy* edge)
|
|
137
|
+
{
|
|
138
|
+
return edge->getEdgeKind() == IntraCF;
|
|
139
|
+
}
|
|
140
|
+
//@}
|
|
141
|
+
|
|
142
|
+
const SVFVar* getCondition() const
|
|
143
|
+
{
|
|
144
|
+
return conditionVar;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
s64_t getSuccessorCondValue() const
|
|
148
|
+
{
|
|
149
|
+
assert(getCondition() && "this is not a conditional branch edge");
|
|
150
|
+
return branchCondVal;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
virtual const std::string toString() const;
|
|
154
|
+
|
|
155
|
+
private:
|
|
156
|
+
/// conditionVar is a boolean (for if/else) or numeric condition variable
|
|
157
|
+
/// (for switch).
|
|
158
|
+
/// branchCondVal is the value when this condition should hold to execute
|
|
159
|
+
/// this CFGEdge.
|
|
160
|
+
/// E.g., Inst1: br %cmp label 0, label 1,
|
|
161
|
+
/// Inst2: label 0
|
|
162
|
+
/// Inst3: label 1;
|
|
163
|
+
/// for edge between Inst1 and Inst 2, the first element is %cmp and
|
|
164
|
+
/// the second element is 0
|
|
165
|
+
const SVFVar* conditionVar;
|
|
166
|
+
s64_t branchCondVal;
|
|
167
|
+
|
|
168
|
+
inline void setConditionVar(const SVFVar* c)
|
|
169
|
+
{
|
|
170
|
+
conditionVar = c;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
inline void setBranchCondVal(s64_t bVal)
|
|
174
|
+
{
|
|
175
|
+
branchCondVal = bVal;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/*!
|
|
180
|
+
* Call ICFG edge representing parameter passing/return from a caller to a callee
|
|
181
|
+
*/
|
|
182
|
+
class CallCFGEdge : public ICFGEdge
|
|
183
|
+
{
|
|
184
|
+
friend class SVFIRWriter;
|
|
185
|
+
friend class SVFIRReader;
|
|
186
|
+
|
|
187
|
+
private:
|
|
188
|
+
std::vector<const CallPE*> callPEs;
|
|
189
|
+
|
|
190
|
+
public:
|
|
191
|
+
/// Constructor
|
|
192
|
+
CallCFGEdge(ICFGNode* s, ICFGNode* d)
|
|
193
|
+
: ICFGEdge(s, d, CallCF)
|
|
194
|
+
{
|
|
195
|
+
}
|
|
196
|
+
/// Add call parameter edge to this CallCFGEdge
|
|
197
|
+
inline void addCallPE(const CallPE* callPE)
|
|
198
|
+
{
|
|
199
|
+
callPEs.push_back(callPE);
|
|
200
|
+
}
|
|
201
|
+
/// Return call ICFGNode at the callsite
|
|
202
|
+
inline const CallICFGNode* getCallSite() const
|
|
203
|
+
{
|
|
204
|
+
assert(SVFUtil::isa<CallICFGNode>(getSrcNode()) && "not a CallICFGNode?");
|
|
205
|
+
return SVFUtil::cast<CallICFGNode>(getSrcNode());
|
|
206
|
+
}
|
|
207
|
+
/// Add get parameter edge to this CallCFGEdge
|
|
208
|
+
inline const std::vector<const CallPE*>& getCallPEs() const
|
|
209
|
+
{
|
|
210
|
+
return callPEs;
|
|
211
|
+
}
|
|
212
|
+
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
213
|
+
//@{
|
|
214
|
+
static inline bool classof(const CallCFGEdge*)
|
|
215
|
+
{
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
static inline bool classof(const ICFGEdge* edge)
|
|
219
|
+
{
|
|
220
|
+
return edge->getEdgeKind() == CallCF;
|
|
221
|
+
}
|
|
222
|
+
static inline bool classof(const GenericICFGEdgeTy* edge)
|
|
223
|
+
{
|
|
224
|
+
return edge->getEdgeKind() == CallCF;
|
|
225
|
+
}
|
|
226
|
+
//@}
|
|
227
|
+
virtual const std::string toString() const;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/*!
|
|
231
|
+
* Return ICFG edge representing parameter/return passing from a callee to a caller
|
|
232
|
+
*/
|
|
233
|
+
class RetCFGEdge : public ICFGEdge
|
|
234
|
+
{
|
|
235
|
+
friend class SVFIRWriter;
|
|
236
|
+
friend class SVFIRReader;
|
|
237
|
+
|
|
238
|
+
private:
|
|
239
|
+
const RetPE* retPE;
|
|
240
|
+
|
|
241
|
+
public:
|
|
242
|
+
/// Constructor
|
|
243
|
+
RetCFGEdge(ICFGNode* s, ICFGNode* d)
|
|
244
|
+
: ICFGEdge(s, d, RetCF), retPE(nullptr)
|
|
245
|
+
{
|
|
246
|
+
}
|
|
247
|
+
/// Add call parameter edge to this CallCFGEdge
|
|
248
|
+
inline void addRetPE(const RetPE* ret)
|
|
249
|
+
{
|
|
250
|
+
assert(!retPE && "we can only have one retPE for each RetCFGEdge");
|
|
251
|
+
retPE = ret;
|
|
252
|
+
}
|
|
253
|
+
/// Add get parameter edge to this CallCFGEdge
|
|
254
|
+
inline const RetPE* getRetPE() const
|
|
255
|
+
{
|
|
256
|
+
return retPE;
|
|
257
|
+
}
|
|
258
|
+
/// Return call ICFGNode at the callsite
|
|
259
|
+
const CallICFGNode* getCallSite() const;
|
|
260
|
+
|
|
261
|
+
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
262
|
+
//@{
|
|
263
|
+
static inline bool classof(const RetCFGEdge*)
|
|
264
|
+
{
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
static inline bool classof(const ICFGEdge* edge)
|
|
268
|
+
{
|
|
269
|
+
return edge->getEdgeKind() == RetCF;
|
|
270
|
+
}
|
|
271
|
+
static inline bool classof(const GenericICFGEdgeTy* edge)
|
|
272
|
+
{
|
|
273
|
+
return edge->getEdgeKind() == RetCF;
|
|
274
|
+
}
|
|
275
|
+
//@}
|
|
276
|
+
virtual const std::string toString() const;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
} // End namespace SVF
|
|
280
|
+
|
|
281
|
+
#endif /* ICFGEdge_H_ */
|