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,372 @@
|
|
|
1
|
+
//===- SVFGOPT.h -- SVFG optimizer--------------------------------------------//
|
|
2
|
+
//
|
|
3
|
+
// SVF: Static Value-Flow Analysis
|
|
4
|
+
//
|
|
5
|
+
// Copyright (C) <2013-2017> <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
|
+
* @file: SVFGOPT.h
|
|
25
|
+
* @author: yesen
|
|
26
|
+
* @date: 20/03/2014
|
|
27
|
+
* @version: 1.0
|
|
28
|
+
*
|
|
29
|
+
* @section LICENSE
|
|
30
|
+
*
|
|
31
|
+
* @section DESCRIPTION
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
#ifndef SVFGOPT_H_
|
|
37
|
+
#define SVFGOPT_H_
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
#include "Graphs/SVFG.h"
|
|
41
|
+
#include "Util/WorkList.h"
|
|
42
|
+
|
|
43
|
+
namespace SVF
|
|
44
|
+
{
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Optimised SVFG.
|
|
48
|
+
* 1. FormalParam/ActualRet is converted into Phi. ActualParam/FormalRet becomes the
|
|
49
|
+
* operands of Phi nodes created at callee/caller's entry/callsite.
|
|
50
|
+
* 2. ActualIns/ActualOuts resides at direct call sites id removed. Sources of its incoming
|
|
51
|
+
* edges are connected with the destinations of its outgoing edges directly.
|
|
52
|
+
* 3. FormalIns/FormalOuts reside at the entry/exit of non-address-taken functions is
|
|
53
|
+
* removed as ActualIn/ActualOuts.
|
|
54
|
+
* 4. MSSAPHI nodes are removed if it have no self cycle. Otherwise depends on user option.
|
|
55
|
+
*/
|
|
56
|
+
class SVFGOPT : public SVFG
|
|
57
|
+
{
|
|
58
|
+
typedef Set<SVFGNode*> SVFGNodeSet;
|
|
59
|
+
typedef Map<NodeID, NodeID> NodeIDToNodeIDMap;
|
|
60
|
+
typedef FIFOWorkList<const MSSAPHISVFGNode*> WorkList;
|
|
61
|
+
|
|
62
|
+
public:
|
|
63
|
+
/// Constructor
|
|
64
|
+
SVFGOPT(std::unique_ptr<MemSSA> mssa, VFGK kind) : SVFG(std::move(mssa), kind)
|
|
65
|
+
{
|
|
66
|
+
keepAllSelfCycle = keepContextSelfCycle = keepActualOutFormalIn = false;
|
|
67
|
+
}
|
|
68
|
+
/// Destructor
|
|
69
|
+
~SVFGOPT() override = default;
|
|
70
|
+
|
|
71
|
+
inline void setTokeepActualOutFormalIn()
|
|
72
|
+
{
|
|
73
|
+
keepActualOutFormalIn = true;
|
|
74
|
+
}
|
|
75
|
+
inline void setTokeepAllSelfCycle()
|
|
76
|
+
{
|
|
77
|
+
keepAllSelfCycle = true;
|
|
78
|
+
}
|
|
79
|
+
inline void setTokeepContextSelfCycle()
|
|
80
|
+
{
|
|
81
|
+
keepContextSelfCycle = true;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/// Optimised SVFG's aren't written in their optimised form; read full SVFG and optimise it
|
|
85
|
+
void readAndOptSVFG(const std::string &filename);
|
|
86
|
+
|
|
87
|
+
/// Optimised SVFG's shouldn't be written in their optimised form; writes the full SVFG to file before optimising
|
|
88
|
+
void buildAndWriteSVFG(const std::string &filename);
|
|
89
|
+
|
|
90
|
+
protected:
|
|
91
|
+
void buildSVFG() override;
|
|
92
|
+
|
|
93
|
+
/// Separate optimisation function to avoid duplicate code
|
|
94
|
+
void optimiseSVFG();
|
|
95
|
+
|
|
96
|
+
/// Connect SVFG nodes between caller and callee for indirect call sites
|
|
97
|
+
//@{
|
|
98
|
+
inline void connectAParamAndFParam(const PAGNode* cs_arg, const PAGNode* fun_arg, const CallICFGNode*, CallSiteID csId, SVFGEdgeSetTy& edges) override
|
|
99
|
+
{
|
|
100
|
+
NodeID phiId = getDef(fun_arg);
|
|
101
|
+
SVFGEdge* edge = addCallEdge(getDef(cs_arg), phiId, csId);
|
|
102
|
+
if (edge != nullptr)
|
|
103
|
+
{
|
|
104
|
+
PHISVFGNode* phi = SVFUtil::cast<PHISVFGNode>(getSVFGNode(phiId));
|
|
105
|
+
addInterPHIOperands(phi, cs_arg);
|
|
106
|
+
edges.insert(edge);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/// Connect formal-ret and actual ret
|
|
110
|
+
inline void connectFRetAndARet(const PAGNode* fun_ret, const PAGNode* cs_ret, CallSiteID csId, SVFGEdgeSetTy& edges) override
|
|
111
|
+
{
|
|
112
|
+
NodeID phiId = getDef(cs_ret);
|
|
113
|
+
NodeID retdef = getDef(fun_ret);
|
|
114
|
+
/// If a function does not have any return instruction. The def of a FormalRetVFGNode is itself (see VFG.h: addFormalRetVFGNode).
|
|
115
|
+
/// Therefore, we do not connect return edge from a function without any return instruction (i.e., pag->isPhiNode(fun_ret)==false)
|
|
116
|
+
/// because unique fun_ret PAGNode was not collected as a PhiNode in SVFIRBuilder::visitReturnInst
|
|
117
|
+
if (pag->isPhiNode(fun_ret)==false)
|
|
118
|
+
return;
|
|
119
|
+
|
|
120
|
+
SVFGEdge* edge = addRetEdge(retdef, phiId, csId);
|
|
121
|
+
if (edge != nullptr)
|
|
122
|
+
{
|
|
123
|
+
PHISVFGNode* phi = SVFUtil::cast<PHISVFGNode>(getSVFGNode(phiId));
|
|
124
|
+
addInterPHIOperands(phi, fun_ret);
|
|
125
|
+
edges.insert(edge);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/// Connect actual-in and formal-in
|
|
129
|
+
inline void connectAInAndFIn(const ActualINSVFGNode* actualIn, const FormalINSVFGNode* formalIn, CallSiteID csId, SVFGEdgeSetTy& edges) override
|
|
130
|
+
{
|
|
131
|
+
NodeBS intersection = actualIn->getPointsTo();
|
|
132
|
+
intersection &= formalIn->getPointsTo();
|
|
133
|
+
if (intersection.empty() == false)
|
|
134
|
+
{
|
|
135
|
+
NodeID aiDef = getActualINDef(actualIn->getId());
|
|
136
|
+
SVFGEdge* edge = addCallIndirectSVFGEdge(aiDef,formalIn->getId(),csId,intersection);
|
|
137
|
+
if (edge != nullptr)
|
|
138
|
+
edges.insert(edge);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/// Connect formal-out and actual-out
|
|
142
|
+
inline void connectFOutAndAOut(const FormalOUTSVFGNode* formalOut, const ActualOUTSVFGNode* actualOut, CallSiteID csId, SVFGEdgeSetTy& edges) override
|
|
143
|
+
{
|
|
144
|
+
NodeBS intersection = formalOut->getPointsTo();
|
|
145
|
+
intersection &= actualOut->getPointsTo();
|
|
146
|
+
if (intersection.empty() == false)
|
|
147
|
+
{
|
|
148
|
+
NodeID foDef = getFormalOUTDef(formalOut->getId());
|
|
149
|
+
SVFGEdge* edge = addRetIndirectSVFGEdge(foDef,actualOut->getId(),csId,intersection);
|
|
150
|
+
if (edge != nullptr)
|
|
151
|
+
edges.insert(edge);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//@}
|
|
155
|
+
|
|
156
|
+
/// Get def-site of actual-in/formal-out.
|
|
157
|
+
//@{
|
|
158
|
+
inline NodeID getActualINDef(NodeID ai) const
|
|
159
|
+
{
|
|
160
|
+
NodeIDToNodeIDMap::const_iterator it = actualInToDefMap.find(ai);
|
|
161
|
+
assert(it != actualInToDefMap.end() && "can not find actual-in's def");
|
|
162
|
+
return it->second;
|
|
163
|
+
}
|
|
164
|
+
inline NodeID getFormalOUTDef(NodeID fo) const
|
|
165
|
+
{
|
|
166
|
+
NodeIDToNodeIDMap::const_iterator it = formalOutToDefMap.find(fo);
|
|
167
|
+
assert(it != formalOutToDefMap.end() && "can not find formal-out's def");
|
|
168
|
+
return it->second;
|
|
169
|
+
}
|
|
170
|
+
//@}
|
|
171
|
+
|
|
172
|
+
private:
|
|
173
|
+
void parseSelfCycleHandleOption();
|
|
174
|
+
|
|
175
|
+
/// Add inter-procedural value flow edge
|
|
176
|
+
//@{
|
|
177
|
+
/// Add indirect call edge from src to dst with one call site ID.
|
|
178
|
+
SVFGEdge* addCallIndirectSVFGEdge(NodeID srcId, NodeID dstId, CallSiteID csid, const NodeBS& cpts);
|
|
179
|
+
/// Add indirect ret edge from src to dst with one call site ID.
|
|
180
|
+
SVFGEdge* addRetIndirectSVFGEdge(NodeID srcId, NodeID dstId, CallSiteID csid, const NodeBS& cpts);
|
|
181
|
+
//@}
|
|
182
|
+
|
|
183
|
+
/// 1. Convert FormalParmSVFGNode into PHISVFGNode and add all ActualParmSVFGNoe which may
|
|
184
|
+
/// propagate pts to it as phi's operands.
|
|
185
|
+
/// 2. Do the same thing for ActualRetSVFGNode and FormalRetSVFGNode.
|
|
186
|
+
/// 3. Record def site of ActualINSVFGNode. Remove all its edges and connect its predecessors
|
|
187
|
+
/// and successors.
|
|
188
|
+
/// 4. Do the same thing for FormalOUTSVFGNode as 3.
|
|
189
|
+
/// 5. Remove ActualINSVFGNode/FormalINSVFGNode/ActualOUTSVFGNode/FormalOUTSVFGNode if they
|
|
190
|
+
/// will not be used when updating call graph.
|
|
191
|
+
void handleInterValueFlow();
|
|
192
|
+
|
|
193
|
+
/// Replace FormalParam/ActualRet node with PHI node.
|
|
194
|
+
//@{
|
|
195
|
+
void replaceFParamARetWithPHI(PHISVFGNode* phi, SVFGNode* svfgNode);
|
|
196
|
+
//@}
|
|
197
|
+
|
|
198
|
+
/// Retarget edges related to actual-in/-out and formal-in/-out.
|
|
199
|
+
//@{
|
|
200
|
+
/// Record def sites of actual-in/formal-out and connect from those def-sites
|
|
201
|
+
/// to formal-in/actual-out directly if they exist.
|
|
202
|
+
void retargetEdgesOfAInFOut(SVFGNode* node);
|
|
203
|
+
/// Connect actual-out/formal-in's predecessors to their successors directly.
|
|
204
|
+
void retargetEdgesOfAOutFIn(SVFGNode* node);
|
|
205
|
+
//@}
|
|
206
|
+
|
|
207
|
+
/// Remove MSSAPHI SVFG nodes.
|
|
208
|
+
void handleIntraValueFlow();
|
|
209
|
+
|
|
210
|
+
/// Initial work list with MSSAPHI nodes which may be removed.
|
|
211
|
+
inline void initialWorkList()
|
|
212
|
+
{
|
|
213
|
+
for (SVFG::const_iterator it = begin(), eit = end(); it != eit; ++it)
|
|
214
|
+
addIntoWorklist(it->second);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/// Only MSSAPHI node which satisfy following conditions will be removed:
|
|
218
|
+
/// 1. it's not def-site of actual-in/formal-out;
|
|
219
|
+
/// 2. it doesn't have incoming and outgoing call/ret at the same time.
|
|
220
|
+
inline bool addIntoWorklist(const SVFGNode* node)
|
|
221
|
+
{
|
|
222
|
+
if (const MSSAPHISVFGNode* phi = SVFUtil::dyn_cast<MSSAPHISVFGNode>(node))
|
|
223
|
+
{
|
|
224
|
+
if (isConnectingTwoCallSites(phi) == false && isDefOfAInFOut(phi) == false)
|
|
225
|
+
return worklist.push(phi);
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/// Remove MSSAPHI node if possible
|
|
231
|
+
void bypassMSSAPHINode(const MSSAPHISVFGNode* node);
|
|
232
|
+
|
|
233
|
+
/// Remove self cycle edges if needed. Return TRUE if some self cycle edges remained.
|
|
234
|
+
bool checkSelfCycleEdges(const MSSAPHISVFGNode* node);
|
|
235
|
+
|
|
236
|
+
/// Add new SVFG edge from src to dst.
|
|
237
|
+
bool addNewSVFGEdge(NodeID srcId, NodeID dstId, const SVFGEdge* preEdge, const SVFGEdge* succEdge);
|
|
238
|
+
|
|
239
|
+
/// Return TRUE if both edges are indirect call/ret edges.
|
|
240
|
+
inline bool bothInterEdges(const SVFGEdge* edge1, const SVFGEdge* edge2) const
|
|
241
|
+
{
|
|
242
|
+
bool inter1 = SVFUtil::isa<CallIndSVFGEdge, RetIndSVFGEdge>(edge1);
|
|
243
|
+
bool inter2 = SVFUtil::isa<CallIndSVFGEdge, RetIndSVFGEdge>(edge2);
|
|
244
|
+
return (inter1 && inter2);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
inline void addInterPHIOperands(PHISVFGNode* phi, const PAGNode* operand)
|
|
248
|
+
{
|
|
249
|
+
phi->setOpVer(phi->getOpVerNum(), operand);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/// Add inter PHI SVFG node for formal parameter
|
|
253
|
+
inline InterPHISVFGNode* addInterPHIForFP(const FormalParmSVFGNode* fp)
|
|
254
|
+
{
|
|
255
|
+
InterPHISVFGNode* sNode = new InterPHISVFGNode(totalVFGNode++,fp);
|
|
256
|
+
addSVFGNode(sNode, pag->getICFG()->getFunEntryICFGNode(fp->getFun()));
|
|
257
|
+
resetDef(fp->getParam(),sNode);
|
|
258
|
+
return sNode;
|
|
259
|
+
}
|
|
260
|
+
/// Add inter PHI SVFG node for actual return
|
|
261
|
+
inline InterPHISVFGNode* addInterPHIForAR(const ActualRetSVFGNode* ar)
|
|
262
|
+
{
|
|
263
|
+
InterPHISVFGNode* sNode = new InterPHISVFGNode(totalVFGNode++,ar);
|
|
264
|
+
addSVFGNode(sNode, const_cast<RetICFGNode*>(
|
|
265
|
+
ar->getCallSite()->getRetICFGNode()));
|
|
266
|
+
resetDef(ar->getRev(),sNode);
|
|
267
|
+
return sNode;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
inline void resetDef(const PAGNode* pagNode, const SVFGNode* node)
|
|
271
|
+
{
|
|
272
|
+
PAGNodeToDefMapTy::iterator it = PAGNodeToDefMap.find(pagNode);
|
|
273
|
+
assert(it != PAGNodeToDefMap.end() && "a SVFIR node doesn't have definition before");
|
|
274
|
+
it->second = node->getId();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/// Set def-site of actual-in/formal-out.
|
|
278
|
+
///@{
|
|
279
|
+
inline void setActualINDef(NodeID ai, NodeID def)
|
|
280
|
+
{
|
|
281
|
+
bool inserted = actualInToDefMap.emplace(ai, def).second;
|
|
282
|
+
(void)inserted; // Suppress warning of unused variable under release build
|
|
283
|
+
assert(inserted && "can not set actual-in's def twice");
|
|
284
|
+
defNodes.set(def);
|
|
285
|
+
}
|
|
286
|
+
inline void setFormalOUTDef(NodeID fo, NodeID def)
|
|
287
|
+
{
|
|
288
|
+
bool inserted = formalOutToDefMap.emplace(fo, def).second;
|
|
289
|
+
(void) inserted;
|
|
290
|
+
assert(inserted && "can not set formal-out's def twice");
|
|
291
|
+
defNodes.set(def);
|
|
292
|
+
}
|
|
293
|
+
///@}
|
|
294
|
+
|
|
295
|
+
inline bool isDefOfAInFOut(const SVFGNode* node)
|
|
296
|
+
{
|
|
297
|
+
return defNodes.test(node->getId());
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/// Check if actual-in/actual-out exist at indirect call site.
|
|
301
|
+
//@{
|
|
302
|
+
inline bool actualInOfIndCS(const ActualINSVFGNode* ai) const
|
|
303
|
+
{
|
|
304
|
+
return (SVFIR::getPAG()->isIndirectCallSites(ai->getCallSite()));
|
|
305
|
+
}
|
|
306
|
+
inline bool actualOutOfIndCS(const ActualOUTSVFGNode* ao) const
|
|
307
|
+
{
|
|
308
|
+
return (SVFIR::getPAG()->isIndirectCallSites(ao->getCallSite()));
|
|
309
|
+
}
|
|
310
|
+
//@}
|
|
311
|
+
|
|
312
|
+
/// Check if formal-in/formal-out reside in address-taken function.
|
|
313
|
+
//@{
|
|
314
|
+
inline bool formalInOfAddressTakenFunc(const FormalINSVFGNode* fi) const
|
|
315
|
+
{
|
|
316
|
+
return (fi->getFun()->hasAddressTaken());
|
|
317
|
+
}
|
|
318
|
+
inline bool formalOutOfAddressTakenFunc(const FormalOUTSVFGNode* fo) const
|
|
319
|
+
{
|
|
320
|
+
return (fo->getFun()->hasAddressTaken());
|
|
321
|
+
}
|
|
322
|
+
//@}
|
|
323
|
+
|
|
324
|
+
/// Return TRUE if this node has both incoming call/ret and outgoing call/ret edges.
|
|
325
|
+
bool isConnectingTwoCallSites(const SVFGNode* node) const;
|
|
326
|
+
|
|
327
|
+
/// Return TRUE if this SVFGNode can be removed.
|
|
328
|
+
/// Nodes can be removed if it is:
|
|
329
|
+
/// 1. ActualParam/FormalParam/ActualRet/FormalRet
|
|
330
|
+
/// 2. ActualIN if it doesn't reside at indirect call site
|
|
331
|
+
/// 3. FormalIN if it doesn't reside at the entry of address-taken function and it's not
|
|
332
|
+
/// definition site of ActualIN
|
|
333
|
+
/// 4. ActualOUT if it doesn't reside at indirect call site and it's not definition site
|
|
334
|
+
/// of FormalOUT
|
|
335
|
+
/// 5. FormalOUT if it doesn't reside at the exit of address-taken function
|
|
336
|
+
bool canBeRemoved(const SVFGNode * node);
|
|
337
|
+
|
|
338
|
+
/// Remove edges of a SVFG node
|
|
339
|
+
//@{
|
|
340
|
+
inline void removeAllEdges(const SVFGNode* node)
|
|
341
|
+
{
|
|
342
|
+
removeInEdges(node);
|
|
343
|
+
removeOutEdges(node);
|
|
344
|
+
}
|
|
345
|
+
inline void removeInEdges(const SVFGNode* node)
|
|
346
|
+
{
|
|
347
|
+
/// remove incoming edges
|
|
348
|
+
while (node->hasIncomingEdge())
|
|
349
|
+
removeSVFGEdge(*(node->InEdgeBegin()));
|
|
350
|
+
}
|
|
351
|
+
inline void removeOutEdges(const SVFGNode* node)
|
|
352
|
+
{
|
|
353
|
+
while (node->hasOutgoingEdge())
|
|
354
|
+
removeSVFGEdge(*(node->OutEdgeBegin()));
|
|
355
|
+
}
|
|
356
|
+
//@}
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
NodeIDToNodeIDMap actualInToDefMap; ///< map actual-in to its def-site node
|
|
360
|
+
NodeIDToNodeIDMap formalOutToDefMap; ///< map formal-out to its def-site node
|
|
361
|
+
NodeBS defNodes; ///< preserved def nodes of formal-in/actual-out
|
|
362
|
+
|
|
363
|
+
WorkList worklist; ///< storing MSSAPHI nodes which may be removed.
|
|
364
|
+
|
|
365
|
+
bool keepActualOutFormalIn;
|
|
366
|
+
bool keepAllSelfCycle;
|
|
367
|
+
bool keepContextSelfCycle;
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
} // End namespace SVF
|
|
371
|
+
|
|
372
|
+
#endif /* SVFGOPT_H_ */
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
//===- SVFGStat.h -- Statistics of SVFG---------------------------------------//
|
|
2
|
+
//
|
|
3
|
+
// SVF: Static Value-Flow Analysis
|
|
4
|
+
//
|
|
5
|
+
// Copyright (C) <2013-2017> <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
|
+
* @file: SVFGStat.h
|
|
25
|
+
* @author: yesen
|
|
26
|
+
* @date: 10/12/2013
|
|
27
|
+
* @version: 1.0
|
|
28
|
+
*
|
|
29
|
+
* @section LICENSE
|
|
30
|
+
*
|
|
31
|
+
* @section DESCRIPTION
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
#ifndef SVFGSTAT_H_
|
|
37
|
+
#define SVFGSTAT_H_
|
|
38
|
+
|
|
39
|
+
#include "Graphs/SVFG.h"
|
|
40
|
+
#include "SCC.h"
|
|
41
|
+
#include "Util/PTAStat.h"
|
|
42
|
+
|
|
43
|
+
namespace SVF
|
|
44
|
+
{
|
|
45
|
+
|
|
46
|
+
class MemSSA;
|
|
47
|
+
|
|
48
|
+
class MemSSAStat : public PTAStat
|
|
49
|
+
{
|
|
50
|
+
|
|
51
|
+
public:
|
|
52
|
+
static const char* TotalTimeOfConstructMemSSA; ///< Total time for constructing memory SSA
|
|
53
|
+
static const char* TimeOfGeneratingMemRegions; ///< Time for allocating regions
|
|
54
|
+
static const char* TimeOfCreateMUCHI; ///< Time for generating mu/chi for load/store/calls
|
|
55
|
+
static const char* TimeOfInsertingPHI; ///< Time for inserting phis
|
|
56
|
+
static const char* TimeOfSSARenaming; ///< Time for SSA rename
|
|
57
|
+
|
|
58
|
+
static const char* NumOfMaxRegion; ///< Number of max points-to set in region.
|
|
59
|
+
static const char* NumOfAveragePtsInRegion; ///< Number of average points-to set in region.
|
|
60
|
+
static const char* NumOfMemRegions; ///< Number of memory regions
|
|
61
|
+
static const char* NumOfEntryChi; ///< Number of function entry chi
|
|
62
|
+
static const char* NumOfRetMu; ///< Number of function return mu
|
|
63
|
+
static const char* NumOfCSChi; ///< Number of call site chi
|
|
64
|
+
static const char* NumOfCSMu; ///< Number of call site mu
|
|
65
|
+
static const char* NumOfLoadMu; ///< Number of load mu
|
|
66
|
+
static const char* NumOfStoreChi; ///< Number of store chi
|
|
67
|
+
static const char* NumOfMSSAPhi; ///< Number of mssa phi
|
|
68
|
+
|
|
69
|
+
static const char* NumOfFunHasEntryChi; ///< Number of functions which have entry chi
|
|
70
|
+
static const char* NumOfFunHasRetMu; ///< Number of functions which have return mu
|
|
71
|
+
static const char* NumOfCSHasChi; ///< Number of call sites which have chi
|
|
72
|
+
static const char* NumOfCSHasMu; ///< Number of call sites which have mu
|
|
73
|
+
static const char* NumOfLoadHasMu; ///< Number of loads which have mu
|
|
74
|
+
static const char* NumOfStoreHasChi; ///< Number of stores which have chi
|
|
75
|
+
static const char* NumOfBBHasMSSAPhi; ///< Number of basic blocks which have mssa phi
|
|
76
|
+
|
|
77
|
+
MemSSAStat(MemSSA*);
|
|
78
|
+
|
|
79
|
+
virtual ~MemSSAStat()
|
|
80
|
+
{
|
|
81
|
+
|
|
82
|
+
}
|
|
83
|
+
virtual void performStat() override;
|
|
84
|
+
|
|
85
|
+
virtual void printStat(std::string str = "") override;
|
|
86
|
+
|
|
87
|
+
private:
|
|
88
|
+
MemSSA* mssa;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class SVFGStat : public PTAStat
|
|
93
|
+
{
|
|
94
|
+
public:
|
|
95
|
+
typedef Set<const SVFGNode*> SVFGNodeSet;
|
|
96
|
+
typedef OrderedSet<const SVFGEdge*> SVFGEdgeSet;
|
|
97
|
+
typedef SCCDetection<SVFG*> SVFGSCC;
|
|
98
|
+
|
|
99
|
+
SVFGStat(SVFG* g);
|
|
100
|
+
|
|
101
|
+
virtual ~SVFGStat() {}
|
|
102
|
+
|
|
103
|
+
virtual void performStat() override;
|
|
104
|
+
|
|
105
|
+
virtual void printStat(std::string str = "") override;
|
|
106
|
+
|
|
107
|
+
virtual void performSCCStat(SVFGEdgeSet insensitiveCalRetEdges);
|
|
108
|
+
|
|
109
|
+
void dirVFEdgeStart()
|
|
110
|
+
{
|
|
111
|
+
connectDirSVFGEdgeTimeStart = PTAStat::getClk(true);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
void dirVFEdgeEnd()
|
|
115
|
+
{
|
|
116
|
+
connectDirSVFGEdgeTimeEnd = PTAStat::getClk(true);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
void indVFEdgeStart()
|
|
120
|
+
{
|
|
121
|
+
connectIndSVFGEdgeTimeStart = PTAStat::getClk(true);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
void indVFEdgeEnd()
|
|
125
|
+
{
|
|
126
|
+
connectIndSVFGEdgeTimeEnd = PTAStat::getClk(true);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
void TLVFNodeStart()
|
|
130
|
+
{
|
|
131
|
+
addTopLevelNodeTimeStart = PTAStat::getClk(true);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void TLVFNodeEnd()
|
|
135
|
+
{
|
|
136
|
+
addTopLevelNodeTimeEnd = PTAStat::getClk(true);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
void ATVFNodeStart()
|
|
140
|
+
{
|
|
141
|
+
addAddrTakenNodeTimeStart = PTAStat::getClk(true);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
void ATVFNodeEnd()
|
|
145
|
+
{
|
|
146
|
+
addAddrTakenNodeTimeEnd = PTAStat::getClk(true);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
void sfvgOptStart()
|
|
150
|
+
{
|
|
151
|
+
svfgOptTimeStart = PTAStat::getClk(true);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
void sfvgOptEnd()
|
|
155
|
+
{
|
|
156
|
+
svfgOptTimeEnd = PTAStat::getClk(true);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private:
|
|
160
|
+
void clear();
|
|
161
|
+
|
|
162
|
+
void processGraph();
|
|
163
|
+
|
|
164
|
+
void calculateNodeDegrees(SVFGNode* node, NodeSet& nodeHasIndInEdge, NodeSet& nodeHasIndOutEdge);
|
|
165
|
+
|
|
166
|
+
NodeID getSCCRep(SVFGSCC* scc, NodeID id) const;
|
|
167
|
+
|
|
168
|
+
NodeID nodeInCycle(SVFGSCC* scc, NodeID id) const;
|
|
169
|
+
|
|
170
|
+
SVFG* graph;
|
|
171
|
+
|
|
172
|
+
int numOfNodes; ///< number of svfg nodes.
|
|
173
|
+
|
|
174
|
+
int numOfFormalIn; ///< number of formal in svfg nodes.
|
|
175
|
+
int numOfFormalOut; ///< number of formal out svfg nodes.
|
|
176
|
+
int numOfFormalParam;
|
|
177
|
+
int numOfFormalRet;
|
|
178
|
+
|
|
179
|
+
int numOfActualIn; ///< number of actual in svfg nodes.
|
|
180
|
+
int numOfActualOut; ///< number of actual out svfg nodes.
|
|
181
|
+
int numOfActualParam;
|
|
182
|
+
int numOfActualRet;
|
|
183
|
+
|
|
184
|
+
int numOfLoad; ///< number of load svfg nodes.
|
|
185
|
+
int numOfStore; ///< number of store svfg nodes.
|
|
186
|
+
int numOfCopy;
|
|
187
|
+
int numOfGep;
|
|
188
|
+
int numOfAddr;
|
|
189
|
+
|
|
190
|
+
int numOfMSSAPhi; ///< number of mssa phi svfg nodes.
|
|
191
|
+
int numOfPhi;
|
|
192
|
+
|
|
193
|
+
int totalInEdge; ///< Total number of incoming SVFG edges
|
|
194
|
+
int totalOutEdge; ///< Total number of outgoing SVFG edges
|
|
195
|
+
int totalIndInEdge; ///< Total number of indirect SVFG edges
|
|
196
|
+
int totalIndOutEdge;
|
|
197
|
+
int totalIndEdgeLabels; ///< Total number of l --o--> lp
|
|
198
|
+
|
|
199
|
+
int totalIndCallEdge;
|
|
200
|
+
int totalIndRetEdge;
|
|
201
|
+
int totalDirCallEdge;
|
|
202
|
+
int totalDirRetEdge;
|
|
203
|
+
|
|
204
|
+
int avgWeight; ///< average weight.
|
|
205
|
+
|
|
206
|
+
int avgInDegree; ///< average in degrees of SVFG nodes.
|
|
207
|
+
int avgOutDegree; ///< average out degrees of SVFG nodes.
|
|
208
|
+
u32_t maxInDegree; ///< max in degrees of SVFG nodes.
|
|
209
|
+
u32_t maxOutDegree; ///< max out degrees of SVFG nodes.
|
|
210
|
+
|
|
211
|
+
int avgIndInDegree; ///< average indirect in degrees of SVFG nodes.
|
|
212
|
+
int avgIndOutDegree; ///< average indirect out degrees of SVFG nodes.
|
|
213
|
+
u32_t maxIndInDegree; ///< max indirect in degrees of SVFG nodes.
|
|
214
|
+
u32_t maxIndOutDegree; ///< max indirect out degrees of SVFG nodes.
|
|
215
|
+
|
|
216
|
+
double addTopLevelNodeTimeStart;
|
|
217
|
+
double addTopLevelNodeTimeEnd;
|
|
218
|
+
|
|
219
|
+
double addAddrTakenNodeTimeStart;
|
|
220
|
+
double addAddrTakenNodeTimeEnd;
|
|
221
|
+
|
|
222
|
+
double connectDirSVFGEdgeTimeStart;
|
|
223
|
+
double connectDirSVFGEdgeTimeEnd;
|
|
224
|
+
|
|
225
|
+
double connectIndSVFGEdgeTimeStart;
|
|
226
|
+
double connectIndSVFGEdgeTimeEnd;
|
|
227
|
+
|
|
228
|
+
double svfgOptTimeStart;
|
|
229
|
+
double svfgOptTimeEnd;
|
|
230
|
+
|
|
231
|
+
SVFGNodeSet forwardSlice;
|
|
232
|
+
SVFGNodeSet backwardSlice;
|
|
233
|
+
SVFGNodeSet sources;
|
|
234
|
+
SVFGNodeSet sinks;
|
|
235
|
+
|
|
236
|
+
public:
|
|
237
|
+
inline void addToSources(const SVFGNode* node)
|
|
238
|
+
{
|
|
239
|
+
sources.insert(node);
|
|
240
|
+
}
|
|
241
|
+
inline void addToSinks(const SVFGNode* node)
|
|
242
|
+
{
|
|
243
|
+
sinks.insert(node);
|
|
244
|
+
}
|
|
245
|
+
inline void addToForwardSlice(const SVFGNode* node)
|
|
246
|
+
{
|
|
247
|
+
forwardSlice.insert(node);
|
|
248
|
+
}
|
|
249
|
+
inline void addToBackwardSlice(const SVFGNode* node)
|
|
250
|
+
{
|
|
251
|
+
backwardSlice.insert(node);
|
|
252
|
+
}
|
|
253
|
+
inline bool inForwardSlice(const SVFGNode* node) const
|
|
254
|
+
{
|
|
255
|
+
return forwardSlice.find(node)!=forwardSlice.end();
|
|
256
|
+
}
|
|
257
|
+
inline bool inBackwardSlice(const SVFGNode* node) const
|
|
258
|
+
{
|
|
259
|
+
return backwardSlice.find(node)!=backwardSlice.end();
|
|
260
|
+
}
|
|
261
|
+
inline bool isSource(const SVFGNode* node) const
|
|
262
|
+
{
|
|
263
|
+
return sources.find(node)!=sources.end();
|
|
264
|
+
}
|
|
265
|
+
inline bool isSink(const SVFGNode* node) const
|
|
266
|
+
{
|
|
267
|
+
return sinks.find(node)!=sinks.end();
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
} // End namespace SVF
|
|
272
|
+
|
|
273
|
+
#endif /* SVFGSTAT_H_ */
|