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,73 @@
|
|
|
1
|
+
//===- MTAStat.h -- Statistics for MTA-------------//
|
|
2
|
+
//
|
|
3
|
+
// SVF: Static Value-Flow Analysis
|
|
4
|
+
//
|
|
5
|
+
// Copyright (C) <2013-> <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
|
+
* MTAStat.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: Jun 23, 2015
|
|
27
|
+
* Author: Yulei Sui, Peng Di
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
#ifndef MTASTAT_H_
|
|
31
|
+
#define MTASTAT_H_
|
|
32
|
+
|
|
33
|
+
#include "Util/PTAStat.h"
|
|
34
|
+
|
|
35
|
+
namespace SVF
|
|
36
|
+
{
|
|
37
|
+
|
|
38
|
+
class Instruction;
|
|
39
|
+
class ThreadCallGraph;
|
|
40
|
+
class TCT;
|
|
41
|
+
class MHP;
|
|
42
|
+
class LockAnalysis;
|
|
43
|
+
class MTAAnnotator;
|
|
44
|
+
/*!
|
|
45
|
+
* Statistics for MTA
|
|
46
|
+
*/
|
|
47
|
+
class MTAStat : public PTAStat
|
|
48
|
+
{
|
|
49
|
+
|
|
50
|
+
public:
|
|
51
|
+
typedef Set<const Instruction*> InstSet;
|
|
52
|
+
|
|
53
|
+
/// Constructor
|
|
54
|
+
MTAStat():PTAStat(nullptr),TCTTime(0),MHPTime(0),AnnotationTime(0)
|
|
55
|
+
{
|
|
56
|
+
}
|
|
57
|
+
/// Statistics for thread call graph
|
|
58
|
+
void performThreadCallGraphStat(ThreadCallGraph* tcg);
|
|
59
|
+
/// Statistics for thread creation tree
|
|
60
|
+
void performTCTStat(TCT* tct);
|
|
61
|
+
/// Statistics for MHP statement pairs
|
|
62
|
+
void performMHPPairStat(MHP* mhp, LockAnalysis* lsa);
|
|
63
|
+
/// Statistics for annotation
|
|
64
|
+
//void performAnnotationStat(MTAAnnotator* anno);
|
|
65
|
+
|
|
66
|
+
double TCTTime;
|
|
67
|
+
double MHPTime;
|
|
68
|
+
double AnnotationTime;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
} // End namespace SVF
|
|
72
|
+
|
|
73
|
+
#endif /* MTASTAT_H_ */
|
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
//===- TCT.h -- Thread creation tree-------------//
|
|
2
|
+
//
|
|
3
|
+
// SVF: Static Value-Flow Analysis
|
|
4
|
+
//
|
|
5
|
+
// Copyright (C) <2013-> <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
|
+
* TCT.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: Jun 24, 2015
|
|
27
|
+
* Author: Yulei Sui, Peng Di
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
#ifndef TCTNodeDetector_H_
|
|
31
|
+
#define TCTNodeDetector_H_
|
|
32
|
+
|
|
33
|
+
#include "Graphs/SCC.h"
|
|
34
|
+
#include "Graphs/ThreadCallGraph.h"
|
|
35
|
+
#include "Util/CxtStmt.h"
|
|
36
|
+
#include "Util/SVFUtil.h"
|
|
37
|
+
#include <set>
|
|
38
|
+
#include <vector>
|
|
39
|
+
|
|
40
|
+
namespace SVF
|
|
41
|
+
{
|
|
42
|
+
|
|
43
|
+
class TCTNode;
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* Thread creation edge represents a spawning relation between two context sensitive threads
|
|
48
|
+
*/
|
|
49
|
+
typedef GenericEdge<TCTNode> GenericTCTEdgeTy;
|
|
50
|
+
class TCTEdge: public GenericTCTEdgeTy
|
|
51
|
+
{
|
|
52
|
+
public:
|
|
53
|
+
enum CEDGEK
|
|
54
|
+
{
|
|
55
|
+
ThreadCreateEdge
|
|
56
|
+
};
|
|
57
|
+
/// Constructor
|
|
58
|
+
TCTEdge(TCTNode* s, TCTNode* d, CEDGEK kind) :
|
|
59
|
+
GenericTCTEdgeTy(s, d, kind)
|
|
60
|
+
{
|
|
61
|
+
}
|
|
62
|
+
/// Destructor
|
|
63
|
+
virtual ~TCTEdge()
|
|
64
|
+
{
|
|
65
|
+
}
|
|
66
|
+
/// Classof
|
|
67
|
+
//@{
|
|
68
|
+
static inline bool classof(const TCTEdge*)
|
|
69
|
+
{
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
static inline bool classof(const GenericTCTEdgeTy *edge)
|
|
73
|
+
{
|
|
74
|
+
return edge->getEdgeKind() == TCTEdge::ThreadCreateEdge;
|
|
75
|
+
}
|
|
76
|
+
///@}
|
|
77
|
+
typedef GenericNode<TCTNode, TCTEdge>::GEdgeSetTy ThreadCreateEdgeSet;
|
|
78
|
+
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* Each node represents a context-sensitive thread
|
|
83
|
+
*/
|
|
84
|
+
typedef GenericNode<TCTNode, TCTEdge> GenericTCTNodeTy;
|
|
85
|
+
class TCTNode: public GenericTCTNodeTy
|
|
86
|
+
{
|
|
87
|
+
|
|
88
|
+
public:
|
|
89
|
+
/// Constructor
|
|
90
|
+
TCTNode(NodeID i, const CxtThread& cctx) :
|
|
91
|
+
GenericTCTNodeTy(i, TCTNodeKd), ctx(cctx), multiforked(false)
|
|
92
|
+
{
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
void dump()
|
|
96
|
+
{
|
|
97
|
+
SVFUtil::outs() << "---\ntid: " << this->getId() << " inloop:" << ctx.isInloop() << " incycle:" << ctx.isIncycle() << " multiforked:"<< isMultiforked();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// Get CxtThread
|
|
101
|
+
inline const CxtThread& getCxtThread() const
|
|
102
|
+
{
|
|
103
|
+
return ctx;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/// inloop, incycle attributes
|
|
107
|
+
//@{
|
|
108
|
+
inline bool isInloop() const
|
|
109
|
+
{
|
|
110
|
+
return ctx.isInloop();
|
|
111
|
+
}
|
|
112
|
+
inline bool isIncycle() const
|
|
113
|
+
{
|
|
114
|
+
return ctx.isIncycle();
|
|
115
|
+
}
|
|
116
|
+
inline void setMultiforked(bool value)
|
|
117
|
+
{
|
|
118
|
+
multiforked = value;
|
|
119
|
+
}
|
|
120
|
+
inline bool isMultiforked() const
|
|
121
|
+
{
|
|
122
|
+
return multiforked;
|
|
123
|
+
}
|
|
124
|
+
//@}
|
|
125
|
+
|
|
126
|
+
///Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
127
|
+
//@{
|
|
128
|
+
static inline bool classof(const TCTNode *)
|
|
129
|
+
{
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
static inline bool classof(const GenericTCTNodeTy *node)
|
|
134
|
+
{
|
|
135
|
+
return node->getNodeKind() == TCTNodeKd;
|
|
136
|
+
}
|
|
137
|
+
static inline bool classof(const SVFValue*node)
|
|
138
|
+
{
|
|
139
|
+
return node->getNodeKind() == TCTNodeKd;
|
|
140
|
+
}
|
|
141
|
+
//@}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
private:
|
|
145
|
+
const CxtThread ctx;
|
|
146
|
+
bool multiforked;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/*!
|
|
150
|
+
* Pointer Analysis Call Graph used internally for various pointer analysis
|
|
151
|
+
*/
|
|
152
|
+
typedef GenericGraph<TCTNode, TCTEdge> GenericThreadCreateTreeTy;
|
|
153
|
+
class TCT: public GenericThreadCreateTreeTy
|
|
154
|
+
{
|
|
155
|
+
|
|
156
|
+
public:
|
|
157
|
+
typedef SVFLoopAndDomInfo::LoopBBs LoopBBs;
|
|
158
|
+
typedef TCTEdge::ThreadCreateEdgeSet ThreadCreateEdgeSet;
|
|
159
|
+
typedef ThreadCreateEdgeSet::iterator TCTNodeIter;
|
|
160
|
+
typedef Set<const FunObjVar*> FunSet;
|
|
161
|
+
typedef std::vector<const ICFGNode*> InstVec;
|
|
162
|
+
typedef Set<const ICFGNode*> InstSet;
|
|
163
|
+
typedef Set<const CallGraphNode*> PTACGNodeSet;
|
|
164
|
+
typedef Map<CxtThread,TCTNode*> CxtThreadToNodeMap;
|
|
165
|
+
typedef Map<CxtThread,CallStrCxt> CxtThreadToForkCxt;
|
|
166
|
+
typedef Map<CxtThread,const FunObjVar*> CxtThreadToFun;
|
|
167
|
+
typedef Map<const ICFGNode*, LoopBBs> InstToLoopMap;
|
|
168
|
+
typedef FIFOWorkList<CxtThreadProc> CxtThreadProcVec;
|
|
169
|
+
typedef Set<CxtThreadProc> CxtThreadProcSet;
|
|
170
|
+
typedef SCCDetection<CallGraph*> ThreadCallGraphSCC;
|
|
171
|
+
|
|
172
|
+
/// Constructor
|
|
173
|
+
TCT(PointerAnalysis* p) :pta(p),TCTNodeNum(0),TCTEdgeNum(0),MaxCxtSize(0)
|
|
174
|
+
{
|
|
175
|
+
tcg = SVFUtil::cast<ThreadCallGraph>(pta->getCallGraph());
|
|
176
|
+
tcg->updateCallGraph(pta);
|
|
177
|
+
//tcg->updateJoinEdge(pta);
|
|
178
|
+
tcgSCC = pta->getCallGraphSCC();
|
|
179
|
+
tcgSCC->find();
|
|
180
|
+
build();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/// Destructor
|
|
184
|
+
virtual ~TCT()
|
|
185
|
+
{
|
|
186
|
+
destroy();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/// Get TCG
|
|
190
|
+
inline ThreadCallGraph* getThreadCallGraph() const
|
|
191
|
+
{
|
|
192
|
+
return tcg;
|
|
193
|
+
}
|
|
194
|
+
/// Get PTA
|
|
195
|
+
inline PointerAnalysis* getPTA() const
|
|
196
|
+
{
|
|
197
|
+
return pta;
|
|
198
|
+
}
|
|
199
|
+
/// Get TCT node
|
|
200
|
+
inline TCTNode* getTCTNode(NodeID id) const
|
|
201
|
+
{
|
|
202
|
+
return getGNode(id);
|
|
203
|
+
}
|
|
204
|
+
/// Whether we have already created this call graph edge
|
|
205
|
+
TCTEdge* hasGraphEdge(TCTNode* src, TCTNode* dst, TCTEdge::CEDGEK kind) const;
|
|
206
|
+
/// Get call graph edge via nodes
|
|
207
|
+
TCTEdge* getGraphEdge(TCTNode* src, TCTNode* dst, TCTEdge::CEDGEK kind);
|
|
208
|
+
|
|
209
|
+
/// Get children and parent nodes
|
|
210
|
+
//@{
|
|
211
|
+
inline ThreadCreateEdgeSet::const_iterator getChildrenBegin(const TCTNode* node) const
|
|
212
|
+
{
|
|
213
|
+
return node->OutEdgeBegin();
|
|
214
|
+
}
|
|
215
|
+
inline ThreadCreateEdgeSet::const_iterator getChildrenEnd(const TCTNode* node) const
|
|
216
|
+
{
|
|
217
|
+
return node->OutEdgeEnd();
|
|
218
|
+
}
|
|
219
|
+
inline ThreadCreateEdgeSet::const_iterator getParentsBegin(const TCTNode* node) const
|
|
220
|
+
{
|
|
221
|
+
return node->InEdgeBegin();
|
|
222
|
+
}
|
|
223
|
+
inline ThreadCreateEdgeSet::const_iterator getParentsEnd(const TCTNode* node) const
|
|
224
|
+
{
|
|
225
|
+
return node->InEdgeEnd();
|
|
226
|
+
}
|
|
227
|
+
//@}
|
|
228
|
+
|
|
229
|
+
/// Get marked candidate functions
|
|
230
|
+
inline const FunSet& getMakredProcs() const
|
|
231
|
+
{
|
|
232
|
+
return candidateFuncSet;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/// Get marked candidate functions
|
|
236
|
+
inline const FunSet& getEntryProcs() const
|
|
237
|
+
{
|
|
238
|
+
return entryFuncSet;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/// Get Statistics
|
|
242
|
+
//@{
|
|
243
|
+
inline u32_t getTCTNodeNum() const
|
|
244
|
+
{
|
|
245
|
+
return TCTNodeNum;
|
|
246
|
+
}
|
|
247
|
+
inline u32_t getTCTEdgeNum() const
|
|
248
|
+
{
|
|
249
|
+
return TCTEdgeNum;
|
|
250
|
+
}
|
|
251
|
+
inline u32_t getMaxCxtSize() const
|
|
252
|
+
{
|
|
253
|
+
return MaxCxtSize;
|
|
254
|
+
}
|
|
255
|
+
//@}
|
|
256
|
+
|
|
257
|
+
/// Whether it is calling an external function
|
|
258
|
+
inline bool isExtCall(const ICFGNode* inst)
|
|
259
|
+
{
|
|
260
|
+
if(const CallICFGNode* call = SVFUtil::dyn_cast<CallICFGNode>(inst))
|
|
261
|
+
return SVFUtil::isExtCall(call);
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
/// Whether it is a callsite
|
|
265
|
+
inline bool isCallSite(const ICFGNode* inst)
|
|
266
|
+
{
|
|
267
|
+
return SVFUtil::isa<CallICFGNode>(inst);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/// Find/Get TCT node
|
|
271
|
+
//@{
|
|
272
|
+
inline bool hasTCTNode(const CxtThread& ct) const
|
|
273
|
+
{
|
|
274
|
+
return ctpToNodeMap.find(ct)!=ctpToNodeMap.end();
|
|
275
|
+
}
|
|
276
|
+
inline TCTNode* getTCTNode(const CxtThread& ct) const
|
|
277
|
+
{
|
|
278
|
+
CxtThreadToNodeMap::const_iterator it = ctpToNodeMap.find(ct);
|
|
279
|
+
assert(it!=ctpToNodeMap.end() && "TCT node not found??");
|
|
280
|
+
return it->second;
|
|
281
|
+
}
|
|
282
|
+
//@}
|
|
283
|
+
|
|
284
|
+
/// Whether it is a candidate function for indirect call
|
|
285
|
+
inline bool isCandidateFun(const CallGraph::FunctionSet& callees) const
|
|
286
|
+
{
|
|
287
|
+
for(CallGraph::FunctionSet::const_iterator cit = callees.begin(),
|
|
288
|
+
ecit = callees.end(); cit!=ecit; cit++)
|
|
289
|
+
{
|
|
290
|
+
if(candidateFuncSet.find((*cit))!=candidateFuncSet.end())
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
inline bool isCandidateFun(const FunObjVar* fun) const
|
|
296
|
+
{
|
|
297
|
+
return candidateFuncSet.find(fun)!=candidateFuncSet.end();
|
|
298
|
+
}
|
|
299
|
+
/// Whether two functions in the same callgraph scc
|
|
300
|
+
inline bool inSameCallGraphSCC(const CallGraphNode* src,const CallGraphNode* dst)
|
|
301
|
+
{
|
|
302
|
+
return (tcgSCC->repNode(src->getId()) == tcgSCC->repNode(dst->getId()));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/// Get parent and sibling threads
|
|
306
|
+
//@{
|
|
307
|
+
/// Has parent thread
|
|
308
|
+
inline bool hasParentThread(NodeID tid) const
|
|
309
|
+
{
|
|
310
|
+
const TCTNode* node = getTCTNode(tid);
|
|
311
|
+
return node->getInEdges().size()==1;
|
|
312
|
+
}
|
|
313
|
+
/// Get parent thread
|
|
314
|
+
inline NodeID getParentThread(NodeID tid) const
|
|
315
|
+
{
|
|
316
|
+
const TCTNode* node = getTCTNode(tid);
|
|
317
|
+
assert(node->getInEdges().size()<=1 && "should have at most one parent thread");
|
|
318
|
+
assert(node->getInEdges().size()==1 && "does not have a parent thread");
|
|
319
|
+
const TCTEdge* edge = *(node->getInEdges().begin());
|
|
320
|
+
return edge->getSrcID();
|
|
321
|
+
}
|
|
322
|
+
/// Get all ancestor threads
|
|
323
|
+
const NodeBS getAncestorThread(NodeID tid) const
|
|
324
|
+
{
|
|
325
|
+
NodeBS tds;
|
|
326
|
+
if(hasParentThread(tid) == false)
|
|
327
|
+
return tds;
|
|
328
|
+
|
|
329
|
+
FIFOWorkList<NodeID> worklist;
|
|
330
|
+
worklist.push(getParentThread(tid));
|
|
331
|
+
|
|
332
|
+
while(!worklist.empty())
|
|
333
|
+
{
|
|
334
|
+
NodeID t = worklist.pop();
|
|
335
|
+
if(tds.test_and_set(t))
|
|
336
|
+
{
|
|
337
|
+
if(hasParentThread(t))
|
|
338
|
+
worklist.push(getParentThread(t));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return tds;
|
|
342
|
+
}
|
|
343
|
+
/// Get sibling threads
|
|
344
|
+
inline const NodeBS getSiblingThread(NodeID tid) const
|
|
345
|
+
{
|
|
346
|
+
NodeBS tds;
|
|
347
|
+
if(hasParentThread(tid) == false)
|
|
348
|
+
return tds;
|
|
349
|
+
|
|
350
|
+
const TCTNode* node = getTCTNode(getParentThread(tid));
|
|
351
|
+
for(ThreadCreateEdgeSet::const_iterator it = getChildrenBegin(node), eit = getChildrenEnd(node); it!=eit; ++it)
|
|
352
|
+
{
|
|
353
|
+
NodeID child = (*it)->getDstNode()->getId();
|
|
354
|
+
if(child!=tid)
|
|
355
|
+
tds.set(child);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return tds;
|
|
359
|
+
}
|
|
360
|
+
//@}
|
|
361
|
+
|
|
362
|
+
/// get the context of a thread at its spawning site (fork site)
|
|
363
|
+
const CallStrCxt& getCxtOfCxtThread(const CxtThread& ct) const
|
|
364
|
+
{
|
|
365
|
+
CxtThreadToForkCxt::const_iterator it = ctToForkCxtMap.find(ct);
|
|
366
|
+
assert(it!=ctToForkCxtMap.end() && "Cxt Thread not found!!");
|
|
367
|
+
return it->second;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/// get the start routine function of a thread
|
|
371
|
+
const FunObjVar* getStartRoutineOfCxtThread(const CxtThread& ct) const
|
|
372
|
+
{
|
|
373
|
+
CxtThreadToFun::const_iterator it = ctToRoutineFunMap.find(ct);
|
|
374
|
+
assert(it!=ctToRoutineFunMap.end() && "Cxt Thread not found!!");
|
|
375
|
+
return it->second;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/// Get loop for join site
|
|
379
|
+
inline LoopBBs& getJoinLoop(const CallICFGNode* join)
|
|
380
|
+
{
|
|
381
|
+
assert(tcg->getThreadAPI()->isTDJoin(join) && "not a join site");
|
|
382
|
+
InstToLoopMap::iterator it = joinSiteToLoopMap.find(join);
|
|
383
|
+
assert(it!=joinSiteToLoopMap.end() && "loop not found");
|
|
384
|
+
return it->second;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
inline bool hasJoinLoop(const CallICFGNode* join) const
|
|
388
|
+
{
|
|
389
|
+
assert(tcg->getThreadAPI()->isTDJoin(join) && "not a join site");
|
|
390
|
+
InstToLoopMap::const_iterator it = joinSiteToLoopMap.find(join);
|
|
391
|
+
return it!=joinSiteToLoopMap.end();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
bool hasLoop(const SVFBasicBlock* bb) const
|
|
395
|
+
{
|
|
396
|
+
const FunObjVar* fun = bb->getFunction();
|
|
397
|
+
return fun->hasLoopInfo(bb);
|
|
398
|
+
}
|
|
399
|
+
bool hasLoop(const ICFGNode* inst) const
|
|
400
|
+
{
|
|
401
|
+
return hasLoop(inst->getBB());
|
|
402
|
+
}
|
|
403
|
+
/// Return true if a join instruction must be executed inside a loop
|
|
404
|
+
bool isJoinMustExecutedInLoop(const LoopBBs& lp,const ICFGNode* join);
|
|
405
|
+
/// Get loop for an instruction
|
|
406
|
+
const LoopBBs& getLoop(const ICFGNode* inst);
|
|
407
|
+
/// Get loop for fork/join site
|
|
408
|
+
const LoopBBs& getLoop(const SVFBasicBlock* bb);
|
|
409
|
+
|
|
410
|
+
/// Push calling context
|
|
411
|
+
void pushCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee);
|
|
412
|
+
/// Match context
|
|
413
|
+
bool matchCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee);
|
|
414
|
+
|
|
415
|
+
inline void pushCxt(CallStrCxt& cxt, CallSiteID csId)
|
|
416
|
+
{
|
|
417
|
+
cxt.push_back(csId);
|
|
418
|
+
if (cxt.size() > MaxCxtSize)
|
|
419
|
+
MaxCxtSize = cxt.size();
|
|
420
|
+
}
|
|
421
|
+
/// Whether a join site is in recursion
|
|
422
|
+
inline bool isJoinSiteInRecursion(const CallICFGNode* join) const
|
|
423
|
+
{
|
|
424
|
+
assert(tcg->getThreadAPI()->isTDJoin(join) && "not a join site");
|
|
425
|
+
return inRecurJoinSites.find(join)!=inRecurJoinSites.end();
|
|
426
|
+
}
|
|
427
|
+
/// Dump calling context
|
|
428
|
+
void dumpCxt(CallStrCxt& cxt);
|
|
429
|
+
|
|
430
|
+
/// Dump the graph
|
|
431
|
+
void dump(const std::string& filename);
|
|
432
|
+
|
|
433
|
+
/// Print TCT information
|
|
434
|
+
void print() const;
|
|
435
|
+
|
|
436
|
+
private:
|
|
437
|
+
ThreadCallGraph* tcg;
|
|
438
|
+
PointerAnalysis* pta;
|
|
439
|
+
u32_t TCTNodeNum;
|
|
440
|
+
u32_t TCTEdgeNum;
|
|
441
|
+
u32_t MaxCxtSize;
|
|
442
|
+
|
|
443
|
+
/// Add TCT node
|
|
444
|
+
inline TCTNode* addTCTNode(const CxtThread& ct)
|
|
445
|
+
{
|
|
446
|
+
assert(ctpToNodeMap.find(ct)==ctpToNodeMap.end() && "Already has this node!!");
|
|
447
|
+
NodeID id = TCTNodeNum;
|
|
448
|
+
TCTNode* node = new TCTNode(id, ct);
|
|
449
|
+
addGNode(id, node);
|
|
450
|
+
TCTNodeNum++;
|
|
451
|
+
ctpToNodeMap[ct] = node;
|
|
452
|
+
return node;
|
|
453
|
+
}
|
|
454
|
+
/// Add TCT edge
|
|
455
|
+
inline bool addTCTEdge(TCTNode* src, TCTNode* dst)
|
|
456
|
+
{
|
|
457
|
+
if (!hasGraphEdge(src, dst, TCTEdge::ThreadCreateEdge))
|
|
458
|
+
{
|
|
459
|
+
TCTEdge* edge = new TCTEdge(src, dst, TCTEdge::ThreadCreateEdge);
|
|
460
|
+
dst->addIncomingEdge(edge);
|
|
461
|
+
src->addOutgoingEdge(edge);
|
|
462
|
+
TCTEdgeNum++;
|
|
463
|
+
return true;
|
|
464
|
+
}
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/// Build TCT
|
|
469
|
+
void build();
|
|
470
|
+
|
|
471
|
+
/// Mark relevant procedures that are backward reachable from any fork/join site
|
|
472
|
+
//@{
|
|
473
|
+
void markRelProcs();
|
|
474
|
+
void markRelProcs(const FunObjVar* fun);
|
|
475
|
+
//@}
|
|
476
|
+
|
|
477
|
+
/// Get entry functions that are neither called by other functions nor extern functions
|
|
478
|
+
void collectEntryFunInCallGraph();
|
|
479
|
+
|
|
480
|
+
/// Collect multi-forked threads whose 1, cxt is in loop or recursion;
|
|
481
|
+
/// 2, parent thread is a multi-forked thread.
|
|
482
|
+
void collectMultiForkedThreads();
|
|
483
|
+
|
|
484
|
+
/// Handle join site in loop
|
|
485
|
+
//@{
|
|
486
|
+
/// collect loop info for join sites
|
|
487
|
+
void collectLoopInfoForJoin();
|
|
488
|
+
/// Whether a given bb is a loop head of a inloop join site
|
|
489
|
+
bool isLoopHeaderOfJoinLoop(const SVFBasicBlock* bb);
|
|
490
|
+
/// Whether a given bb is an exit of a inloop join site
|
|
491
|
+
bool isLoopExitOfJoinLoop(const SVFBasicBlock* bb);
|
|
492
|
+
//@}
|
|
493
|
+
|
|
494
|
+
/// Multi-forked threads
|
|
495
|
+
//@{
|
|
496
|
+
/// Whether an instruction is in a loop
|
|
497
|
+
bool isInLoopInstruction(const ICFGNode* inst);
|
|
498
|
+
/// Whether an instruction is in a recursion
|
|
499
|
+
bool isInRecursion(const ICFGNode* inst) const;
|
|
500
|
+
//@}
|
|
501
|
+
|
|
502
|
+
/// Handle call relations
|
|
503
|
+
void handleCallRelation(CxtThreadProc& ctp, const CallGraphEdge* cgEdge, const CallICFGNode* call);
|
|
504
|
+
|
|
505
|
+
/// Get or create a tct node based on CxtThread
|
|
506
|
+
//@{
|
|
507
|
+
inline TCTNode* getOrCreateTCTNode(const CallStrCxt& cxt, const ICFGNode* fork,const CallStrCxt& oldCxt, const FunObjVar* routine)
|
|
508
|
+
{
|
|
509
|
+
CxtThread ct(cxt,fork);
|
|
510
|
+
CxtThreadToNodeMap::const_iterator it = ctpToNodeMap.find(ct);
|
|
511
|
+
if(it!=ctpToNodeMap.end())
|
|
512
|
+
{
|
|
513
|
+
return it->second;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
addCxtOfCxtThread(oldCxt,ct);
|
|
517
|
+
addStartRoutineOfCxtThread(routine,ct);
|
|
518
|
+
|
|
519
|
+
setMultiForkedAttrs(ct);
|
|
520
|
+
return addTCTNode(ct);
|
|
521
|
+
}
|
|
522
|
+
//@}
|
|
523
|
+
|
|
524
|
+
/// Set multi-forked thread attributes
|
|
525
|
+
void setMultiForkedAttrs(CxtThread& ct)
|
|
526
|
+
{
|
|
527
|
+
/// non-main thread
|
|
528
|
+
if(ct.getThread() != nullptr)
|
|
529
|
+
{
|
|
530
|
+
const ICFGNode* svfInst = ct.getThread();
|
|
531
|
+
ct.setInloop(isInLoopInstruction(svfInst));
|
|
532
|
+
ct.setIncycle(isInRecursion(svfInst));
|
|
533
|
+
}
|
|
534
|
+
/// main thread
|
|
535
|
+
else
|
|
536
|
+
{
|
|
537
|
+
ct.setInloop(false);
|
|
538
|
+
ct.setIncycle(false);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/// Add context for a thread at its spawning site (fork site)
|
|
543
|
+
void addCxtOfCxtThread(const CallStrCxt& cxt, const CxtThread& ct)
|
|
544
|
+
{
|
|
545
|
+
ctToForkCxtMap[ct] = cxt;
|
|
546
|
+
}
|
|
547
|
+
/// Add start routine function of a cxt thread
|
|
548
|
+
void addStartRoutineOfCxtThread(const FunObjVar* fun, const CxtThread& ct)
|
|
549
|
+
{
|
|
550
|
+
ctToRoutineFunMap[ct] = fun;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/// WorkList helper functions
|
|
554
|
+
//@{
|
|
555
|
+
inline bool pushToCTPWorkList(const CxtThreadProc& ctp)
|
|
556
|
+
{
|
|
557
|
+
if(isVisitedCTPs(ctp)==false)
|
|
558
|
+
{
|
|
559
|
+
visitedCTPs.insert(ctp);
|
|
560
|
+
return ctpList.push(ctp);
|
|
561
|
+
}
|
|
562
|
+
return false;
|
|
563
|
+
}
|
|
564
|
+
inline CxtThreadProc popFromCTPWorkList()
|
|
565
|
+
{
|
|
566
|
+
CxtThreadProc ctp = ctpList.pop();
|
|
567
|
+
return ctp;
|
|
568
|
+
}
|
|
569
|
+
inline bool isVisitedCTPs(const CxtThreadProc& ctp) const
|
|
570
|
+
{
|
|
571
|
+
return visitedCTPs.find(ctp)!=visitedCTPs.end();
|
|
572
|
+
}
|
|
573
|
+
//@}
|
|
574
|
+
/// Clean up memory
|
|
575
|
+
inline void destroy()
|
|
576
|
+
{
|
|
577
|
+
if(tcgSCC)
|
|
578
|
+
delete tcgSCC;
|
|
579
|
+
tcgSCC=nullptr;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
FunSet entryFuncSet; /// Procedures that are neither called by other functions nor extern functions
|
|
583
|
+
FunSet candidateFuncSet; /// Procedures we care about during call graph traversing when creating TCT
|
|
584
|
+
ThreadCallGraphSCC* tcgSCC; /// Thread call graph SCC
|
|
585
|
+
CxtThreadProcVec ctpList; /// CxtThreadProc List
|
|
586
|
+
CxtThreadProcSet visitedCTPs; /// Record all visited ctps
|
|
587
|
+
CxtThreadToNodeMap ctpToNodeMap; /// Map a ctp to its graph node
|
|
588
|
+
CxtThreadToForkCxt ctToForkCxtMap; /// Map a CxtThread to the context at its spawning site (fork site).
|
|
589
|
+
CxtThreadToFun ctToRoutineFunMap; /// Map a CxtThread to its start routine function.
|
|
590
|
+
InstToLoopMap joinSiteToLoopMap; ///< map an inloop join to its loop class
|
|
591
|
+
Set<const ICFGNode*> inRecurJoinSites; ///< Fork or Join sites in recursions
|
|
592
|
+
};
|
|
593
|
+
|
|
594
|
+
} // End namespace SVF
|
|
595
|
+
|
|
596
|
+
namespace SVF
|
|
597
|
+
{
|
|
598
|
+
/* !
|
|
599
|
+
* GenericGraphTraits specializations for constraint graph so that they can be treated as
|
|
600
|
+
* graphs by the generic graph algorithms.
|
|
601
|
+
* Provide graph traits for traversing from a constraint node using standard graph traversals.
|
|
602
|
+
*/
|
|
603
|
+
template<> struct GenericGraphTraits<SVF::TCTNode*> : public GenericGraphTraits<SVF::GenericNode<SVF::TCTNode,SVF::TCTEdge>* >
|
|
604
|
+
{
|
|
605
|
+
};
|
|
606
|
+
|
|
607
|
+
/// Inverse GenericGraphTraits specializations for Value flow node, it is used for inverse traversal.
|
|
608
|
+
template<>
|
|
609
|
+
struct GenericGraphTraits<Inverse<SVF::TCTNode *> > : public GenericGraphTraits<Inverse<SVF::GenericNode<SVF::TCTNode,SVF::TCTEdge>* > >
|
|
610
|
+
{
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
template<> struct GenericGraphTraits<SVF::TCT*> : public GenericGraphTraits<SVF::GenericGraph<SVF::TCTNode,SVF::TCTEdge>* >
|
|
614
|
+
{
|
|
615
|
+
typedef SVF::TCTNode *NodeRef;
|
|
616
|
+
};
|
|
617
|
+
|
|
618
|
+
} // End namespace llvm
|
|
619
|
+
|
|
620
|
+
#endif /* TCTNodeDetector_H_ */
|