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,533 @@
|
|
|
1
|
+
//===- LockAnalysis.h -- Analysis of locksets-------------//
|
|
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
|
+
* LockAnalysis.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: 26 Aug 2015
|
|
27
|
+
* Author: pengd
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
#ifndef INCLUDE_MTA_LockAnalysis_H_
|
|
31
|
+
#define INCLUDE_MTA_LockAnalysis_H_
|
|
32
|
+
|
|
33
|
+
/*!
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
#include "MTA/TCT.h"
|
|
37
|
+
|
|
38
|
+
namespace SVF
|
|
39
|
+
{
|
|
40
|
+
|
|
41
|
+
/*!
|
|
42
|
+
* Lock analysis
|
|
43
|
+
*/
|
|
44
|
+
class LockAnalysis
|
|
45
|
+
{
|
|
46
|
+
|
|
47
|
+
public:
|
|
48
|
+
/// semilattice Empty==>TDUnlocked==>TDLocked
|
|
49
|
+
enum ValDomain
|
|
50
|
+
{
|
|
51
|
+
Empty, // initial(dummy) state
|
|
52
|
+
TDLocked, // stmt is locked
|
|
53
|
+
TDUnlocked, // stmt is unlocked
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
typedef CxtStmt CxtLock;
|
|
57
|
+
typedef CxtProc CxtLockProc;
|
|
58
|
+
|
|
59
|
+
typedef NodeBS LockSet;
|
|
60
|
+
typedef TCT::InstVec InstVec;
|
|
61
|
+
typedef Set<const ICFGNode*> InstSet;
|
|
62
|
+
typedef InstSet CISpan;
|
|
63
|
+
typedef Map<const ICFGNode*, CISpan>CILockToSpan;
|
|
64
|
+
typedef Set<const FunObjVar*> FunSet;
|
|
65
|
+
typedef Map<const ICFGNode*, InstSet> InstToInstSetMap;
|
|
66
|
+
typedef Map<CxtStmt, ValDomain> CxtStmtToLockFlagMap;
|
|
67
|
+
typedef FIFOWorkList<CxtStmt> CxtStmtWorkList;
|
|
68
|
+
typedef Set<CxtStmt> LockSpan;
|
|
69
|
+
typedef Set<CxtStmt> CxtStmtSet;
|
|
70
|
+
typedef Set<CxtLock> CxtLockSet;
|
|
71
|
+
|
|
72
|
+
typedef Map<CxtLock, LockSpan> CxtLockToSpan;
|
|
73
|
+
typedef Map<CxtLock, NodeBS> CxtLockToLockSet;
|
|
74
|
+
typedef Map<const ICFGNode*, NodeBS> LockSiteToLockSet;
|
|
75
|
+
typedef Map<const ICFGNode*, LockSpan> InstToCxtStmtSet;
|
|
76
|
+
typedef Map<CxtStmt, CxtLockSet> CxtStmtToCxtLockSet;
|
|
77
|
+
typedef FIFOWorkList<CxtLockProc> CxtLockProcVec;
|
|
78
|
+
typedef Set<CxtLockProc> CxtLockProcSet;
|
|
79
|
+
|
|
80
|
+
typedef Map<const ICFGNode*, CxtStmtSet> InstToCxtStmt;
|
|
81
|
+
|
|
82
|
+
LockAnalysis(TCT* t) : tct(t), lockTime(0),numOfTotalQueries(0), numOfLockedQueries(0), lockQueriesTime(0)
|
|
83
|
+
{
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// context-sensitive forward traversal from each lock site. Generate following results
|
|
87
|
+
/// (1) context-sensitive lock site,
|
|
88
|
+
/// (2) maps a context-sensitive lock site to its corresponding lock span.
|
|
89
|
+
void analyze();
|
|
90
|
+
void analyzeIntraProcedualLock();
|
|
91
|
+
bool intraForwardTraverse(const ICFGNode* lock, InstSet& unlockset, InstSet& forwardInsts);
|
|
92
|
+
bool intraBackwardTraverse(const InstSet& unlockset, InstSet& backwardInsts);
|
|
93
|
+
|
|
94
|
+
void collectCxtLock();
|
|
95
|
+
void analyzeLockSpanCxtStmt();
|
|
96
|
+
|
|
97
|
+
void collectLockUnlocksites();
|
|
98
|
+
void buildCandidateFuncSetforLock();
|
|
99
|
+
|
|
100
|
+
/// Intraprocedural locks
|
|
101
|
+
//@{
|
|
102
|
+
/// Return true if the lock is an intra-procedural lock
|
|
103
|
+
inline bool isIntraLock(const ICFGNode* lock) const
|
|
104
|
+
{
|
|
105
|
+
assert(locksites.find(lock)!=locksites.end() && "not a lock site?");
|
|
106
|
+
return ciLocktoSpan.find(lock)!=ciLocktoSpan.end();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/// Add intra-procedural lock
|
|
110
|
+
inline void addIntraLock(const ICFGNode* lockSite, const InstSet& stmts)
|
|
111
|
+
{
|
|
112
|
+
for(InstSet::const_iterator it = stmts.begin(), eit = stmts.end(); it!=eit; ++it)
|
|
113
|
+
{
|
|
114
|
+
instCILocksMap[*it].insert(lockSite);
|
|
115
|
+
ciLocktoSpan[lockSite].insert(*it);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// Add intra-procedural lock
|
|
120
|
+
inline void addCondIntraLock(const ICFGNode* lockSite, const InstSet& stmts)
|
|
121
|
+
{
|
|
122
|
+
for(InstSet::const_iterator it = stmts.begin(), eit = stmts.end(); it!=eit; ++it)
|
|
123
|
+
{
|
|
124
|
+
instTocondCILocksMap[*it].insert(lockSite);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/// Return true if a statement is inside an intra-procedural lock
|
|
129
|
+
inline bool isInsideIntraLock(const ICFGNode* stmt) const
|
|
130
|
+
{
|
|
131
|
+
return instCILocksMap.find(stmt)!=instCILocksMap.end() || isInsideCondIntraLock(stmt);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// Return true if a statement is inside a partial lock/unlock pair (conditional lock with unconditional unlock)
|
|
135
|
+
inline bool isInsideCondIntraLock(const ICFGNode* stmt) const
|
|
136
|
+
{
|
|
137
|
+
return instTocondCILocksMap.find(stmt)!=instTocondCILocksMap.end();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
inline const InstSet& getIntraLockSet(const ICFGNode* stmt) const
|
|
141
|
+
{
|
|
142
|
+
InstToInstSetMap::const_iterator it = instCILocksMap.find(stmt);
|
|
143
|
+
assert(it!=instCILocksMap.end() && "intralock not found!");
|
|
144
|
+
return it->second;
|
|
145
|
+
}
|
|
146
|
+
//@}
|
|
147
|
+
|
|
148
|
+
/// Context-sensitive locks
|
|
149
|
+
//@{
|
|
150
|
+
/// Add inter-procedural context-sensitive lock
|
|
151
|
+
inline void addCxtLock(const CallStrCxt& cxt,const ICFGNode* inst)
|
|
152
|
+
{
|
|
153
|
+
CxtLock cxtlock(cxt,inst);
|
|
154
|
+
cxtLockset.insert(cxtlock);
|
|
155
|
+
DBOUT(DMTA, SVFUtil::outs() << "LockAnalysis Process new lock "; cxtlock.dump());
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/// Get context-sensitive lock
|
|
159
|
+
inline bool hasCxtLock(const CxtLock& cxtLock) const
|
|
160
|
+
{
|
|
161
|
+
return cxtLockset.find(cxtLock)!=cxtLockset.end();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/// Return true if the intersection of two locksets is not empty
|
|
165
|
+
inline bool intersects(const CxtLockSet& lockset1,const CxtLockSet& lockset2) const
|
|
166
|
+
{
|
|
167
|
+
for(CxtLockSet::const_iterator it = lockset1.begin(), eit = lockset1.end(); it!=eit; ++it)
|
|
168
|
+
{
|
|
169
|
+
const CxtLock& lock = *it;
|
|
170
|
+
for(CxtLockSet::const_iterator lit = lockset2.begin(), elit = lockset2.end(); lit!=elit; ++lit)
|
|
171
|
+
{
|
|
172
|
+
if(lock==*lit)
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
/// Return true if two locksets has at least one alias lock
|
|
179
|
+
inline bool alias(const CxtLockSet& lockset1,const CxtLockSet& lockset2)
|
|
180
|
+
{
|
|
181
|
+
for(CxtLockSet::const_iterator it = lockset1.begin(), eit = lockset1.end(); it!=eit; ++it)
|
|
182
|
+
{
|
|
183
|
+
const CxtLock& lock = *it;
|
|
184
|
+
for(CxtLockSet::const_iterator lit = lockset2.begin(), elit = lockset2.end(); lit!=elit; ++lit)
|
|
185
|
+
{
|
|
186
|
+
if(isAliasedLocks(lock,*lit))
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
//@}
|
|
193
|
+
|
|
194
|
+
/// Return true if it is a candidate function
|
|
195
|
+
inline bool isLockCandidateFun(const FunObjVar* fun) const
|
|
196
|
+
{
|
|
197
|
+
return lockcandidateFuncSet.find(fun)!=lockcandidateFuncSet.end();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/// Context-sensitive statement and lock spans
|
|
201
|
+
//@{
|
|
202
|
+
/// Get LockSet and LockSpan
|
|
203
|
+
inline bool hasCxtStmtfromInst(const ICFGNode* inst) const
|
|
204
|
+
{
|
|
205
|
+
InstToCxtStmtSet::const_iterator it = instToCxtStmtSet.find(inst);
|
|
206
|
+
return (it != instToCxtStmtSet.end());
|
|
207
|
+
}
|
|
208
|
+
inline const CxtStmtSet& getCxtStmtfromInst(const ICFGNode* inst) const
|
|
209
|
+
{
|
|
210
|
+
InstToCxtStmtSet::const_iterator it = instToCxtStmtSet.find(inst);
|
|
211
|
+
assert(it != instToCxtStmtSet.end());
|
|
212
|
+
return it->second;
|
|
213
|
+
}
|
|
214
|
+
inline bool hasCxtLockfromCxtStmt(const CxtStmt& cts) const
|
|
215
|
+
{
|
|
216
|
+
CxtStmtToCxtLockSet::const_iterator it = cxtStmtToCxtLockSet.find(cts);
|
|
217
|
+
return (it != cxtStmtToCxtLockSet.end());
|
|
218
|
+
}
|
|
219
|
+
inline const CxtLockSet& getCxtLockfromCxtStmt(const CxtStmt& cts) const
|
|
220
|
+
{
|
|
221
|
+
CxtStmtToCxtLockSet::const_iterator it = cxtStmtToCxtLockSet.find(cts);
|
|
222
|
+
assert(it != cxtStmtToCxtLockSet.end());
|
|
223
|
+
return it->second;
|
|
224
|
+
}
|
|
225
|
+
inline CxtLockSet& getCxtLockfromCxtStmt(const CxtStmt& cts)
|
|
226
|
+
{
|
|
227
|
+
CxtStmtToCxtLockSet::iterator it = cxtStmtToCxtLockSet.find(cts);
|
|
228
|
+
assert(it != cxtStmtToCxtLockSet.end());
|
|
229
|
+
return it->second;
|
|
230
|
+
}
|
|
231
|
+
/// Add context-sensitive statement
|
|
232
|
+
inline bool addCxtStmtToSpan(const CxtStmt& cts, const CxtLock& cl)
|
|
233
|
+
{
|
|
234
|
+
cxtLocktoSpan[cl].insert(cts);
|
|
235
|
+
return cxtStmtToCxtLockSet[cts].insert(cl).second;
|
|
236
|
+
}
|
|
237
|
+
/// Add context-sensitive statement
|
|
238
|
+
inline bool removeCxtStmtToSpan(CxtStmt& cts, const CxtLock& cl)
|
|
239
|
+
{
|
|
240
|
+
bool find = cxtStmtToCxtLockSet[cts].find(cl)!=cxtStmtToCxtLockSet[cts].end();
|
|
241
|
+
if(find)
|
|
242
|
+
{
|
|
243
|
+
cxtStmtToCxtLockSet[cts].erase(cl);
|
|
244
|
+
cxtLocktoSpan[cl].erase(cts);
|
|
245
|
+
}
|
|
246
|
+
return find;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
CxtStmtToCxtLockSet getCSTCLS()
|
|
250
|
+
{
|
|
251
|
+
return cxtStmtToCxtLockSet;
|
|
252
|
+
}
|
|
253
|
+
/// Touch this context statement
|
|
254
|
+
inline void touchCxtStmt(CxtStmt& cts)
|
|
255
|
+
{
|
|
256
|
+
cxtStmtToCxtLockSet[cts];
|
|
257
|
+
}
|
|
258
|
+
inline bool hasSpanfromCxtLock(const CxtLock& cl)
|
|
259
|
+
{
|
|
260
|
+
return cxtLocktoSpan.find(cl) != cxtLocktoSpan.end();
|
|
261
|
+
}
|
|
262
|
+
inline LockSpan& getSpanfromCxtLock(const CxtLock& cl)
|
|
263
|
+
{
|
|
264
|
+
assert(cxtLocktoSpan.find(cl) != cxtLocktoSpan.end());
|
|
265
|
+
return cxtLocktoSpan[cl];
|
|
266
|
+
}
|
|
267
|
+
//@}
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
/// Check if one instruction's context stmt is in a lock span
|
|
272
|
+
inline bool hasOneCxtInLockSpan(const ICFGNode *I, LockSpan lspan) const
|
|
273
|
+
{
|
|
274
|
+
if(!hasCxtStmtfromInst(I))
|
|
275
|
+
return false;
|
|
276
|
+
const LockSpan ctsset = getCxtStmtfromInst(I);
|
|
277
|
+
for (LockSpan::const_iterator cts = ctsset.begin(), ects = ctsset.end(); cts != ects; cts++)
|
|
278
|
+
{
|
|
279
|
+
if(lspan.find(*cts) != lspan.end())
|
|
280
|
+
{
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
inline bool hasAllCxtInLockSpan(const ICFGNode *I, LockSpan lspan) const
|
|
288
|
+
{
|
|
289
|
+
if(!hasCxtStmtfromInst(I))
|
|
290
|
+
return false;
|
|
291
|
+
const LockSpan ctsset = getCxtStmtfromInst(I);
|
|
292
|
+
for (LockSpan::const_iterator cts = ctsset.begin(), ects = ctsset.end(); cts != ects; cts++)
|
|
293
|
+
{
|
|
294
|
+
if (lspan.find(*cts) == lspan.end())
|
|
295
|
+
{
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
/// Check if two Instructions are protected by common locks
|
|
304
|
+
/// echo inst may have multiple cxt stmt
|
|
305
|
+
/// we check whether every cxt stmt of instructions is protected by a common lock.
|
|
306
|
+
bool isProtectedByCommonLock(const ICFGNode *i1, const ICFGNode *i2);
|
|
307
|
+
bool isProtectedByCommonCxtLock(const ICFGNode *i1, const ICFGNode *i2);
|
|
308
|
+
bool isProtectedByCommonCxtLock(const CxtStmt& cxtStmt1, const CxtStmt& cxtStmt2);
|
|
309
|
+
bool isProtectedByCommonCILock(const ICFGNode *i1, const ICFGNode *i2);
|
|
310
|
+
|
|
311
|
+
bool isInSameSpan(const ICFGNode *I1, const ICFGNode *I2);
|
|
312
|
+
bool isInSameCSSpan(const ICFGNode *i1, const ICFGNode *i2) const;
|
|
313
|
+
bool isInSameCSSpan(const CxtStmt& cxtStmt1, const CxtStmt& cxtStmt2) const;
|
|
314
|
+
bool isInSameCISpan(const ICFGNode *i1, const ICFGNode *i2) const;
|
|
315
|
+
|
|
316
|
+
inline u32_t getNumOfCxtLocks()
|
|
317
|
+
{
|
|
318
|
+
return cxtLockset.size();
|
|
319
|
+
}
|
|
320
|
+
/// Print locks and spans
|
|
321
|
+
void printLocks(const CxtStmt& cts);
|
|
322
|
+
|
|
323
|
+
/// Get tct
|
|
324
|
+
TCT* getTCT()
|
|
325
|
+
{
|
|
326
|
+
return tct;
|
|
327
|
+
}
|
|
328
|
+
private:
|
|
329
|
+
/// Handle fork
|
|
330
|
+
void handleFork(const CxtStmt& cts);
|
|
331
|
+
|
|
332
|
+
/// Handle call
|
|
333
|
+
void handleCall(const CxtStmt& cts);
|
|
334
|
+
|
|
335
|
+
/// Handle return
|
|
336
|
+
void handleRet(const CxtStmt& cts);
|
|
337
|
+
|
|
338
|
+
/// Handle intra
|
|
339
|
+
void handleIntra(const CxtStmt& cts);
|
|
340
|
+
|
|
341
|
+
/// Handle call relations
|
|
342
|
+
void handleCallRelation(CxtLockProc& clp, const CallGraphEdge* cgEdge, const CallICFGNode* call);
|
|
343
|
+
|
|
344
|
+
/// Return true it a lock matches an unlock
|
|
345
|
+
bool isAliasedLocks(const CxtLock& cl1, const CxtLock& cl2)
|
|
346
|
+
{
|
|
347
|
+
return isAliasedLocks(cl1.getStmt(), cl2.getStmt());
|
|
348
|
+
}
|
|
349
|
+
bool isAliasedLocks(const ICFGNode* i1, const ICFGNode* i2)
|
|
350
|
+
{
|
|
351
|
+
/// todo: must alias
|
|
352
|
+
return tct->getPTA()->alias(getLockVal(i1)->getId(), getLockVal(i2)->getId());
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/// Mark thread flags for cxtStmt
|
|
356
|
+
//@{
|
|
357
|
+
/// Transfer function for marking context-sensitive statement
|
|
358
|
+
void markCxtStmtFlag(const CxtStmt& tgr, const CxtStmt& src)
|
|
359
|
+
{
|
|
360
|
+
const CxtLockSet& srclockset = getCxtLockfromCxtStmt(src);
|
|
361
|
+
if(hasCxtLockfromCxtStmt(tgr)== false)
|
|
362
|
+
{
|
|
363
|
+
for(CxtLockSet::const_iterator it = srclockset.begin(), eit = srclockset.end(); it!=eit; ++it)
|
|
364
|
+
{
|
|
365
|
+
addCxtStmtToSpan(tgr,*it);
|
|
366
|
+
}
|
|
367
|
+
pushToCTSWorkList(tgr);
|
|
368
|
+
}
|
|
369
|
+
else
|
|
370
|
+
{
|
|
371
|
+
if(intersect(getCxtLockfromCxtStmt(tgr),srclockset))
|
|
372
|
+
pushToCTSWorkList(tgr);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
bool intersect(CxtLockSet& tgrlockset, const CxtLockSet& srclockset)
|
|
376
|
+
{
|
|
377
|
+
CxtLockSet toBeDeleted;
|
|
378
|
+
for(CxtLockSet::const_iterator it = tgrlockset.begin(), eit = tgrlockset.end(); it!=eit; ++it)
|
|
379
|
+
{
|
|
380
|
+
if(srclockset.find(*it)==srclockset.end())
|
|
381
|
+
toBeDeleted.insert(*it);
|
|
382
|
+
}
|
|
383
|
+
for(CxtLockSet::const_iterator it = toBeDeleted.begin(), eit = toBeDeleted.end(); it!=eit; ++it)
|
|
384
|
+
{
|
|
385
|
+
tgrlockset.erase(*it);
|
|
386
|
+
}
|
|
387
|
+
return !toBeDeleted.empty();
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/// Clear flags
|
|
391
|
+
inline void clearFlagMap()
|
|
392
|
+
{
|
|
393
|
+
cxtStmtList.clear();
|
|
394
|
+
}
|
|
395
|
+
//@}
|
|
396
|
+
|
|
397
|
+
/// WorkList helper functions
|
|
398
|
+
//@{
|
|
399
|
+
inline bool pushToCTPWorkList(const CxtLockProc& clp)
|
|
400
|
+
{
|
|
401
|
+
if (isVisitedCTPs(clp) == false)
|
|
402
|
+
{
|
|
403
|
+
visitedCTPs.insert(clp);
|
|
404
|
+
return clpList.push(clp);
|
|
405
|
+
}
|
|
406
|
+
return false;
|
|
407
|
+
}
|
|
408
|
+
inline CxtLockProc popFromCTPWorkList()
|
|
409
|
+
{
|
|
410
|
+
CxtLockProc clp = clpList.pop();
|
|
411
|
+
return clp;
|
|
412
|
+
}
|
|
413
|
+
inline bool isVisitedCTPs(const CxtLockProc& clp) const
|
|
414
|
+
{
|
|
415
|
+
return visitedCTPs.find(clp) != visitedCTPs.end();
|
|
416
|
+
}
|
|
417
|
+
//@}
|
|
418
|
+
|
|
419
|
+
/// Worklist operations
|
|
420
|
+
//@{
|
|
421
|
+
inline bool pushToCTSWorkList(const CxtStmt& cs)
|
|
422
|
+
{
|
|
423
|
+
return cxtStmtList.push(cs);
|
|
424
|
+
}
|
|
425
|
+
inline CxtStmt popFromCTSWorkList()
|
|
426
|
+
{
|
|
427
|
+
CxtStmt clp = cxtStmtList.pop();
|
|
428
|
+
return clp;
|
|
429
|
+
}
|
|
430
|
+
//@}
|
|
431
|
+
|
|
432
|
+
/// Push calling context
|
|
433
|
+
void pushCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee);
|
|
434
|
+
/// Match context
|
|
435
|
+
bool matchCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee);
|
|
436
|
+
|
|
437
|
+
/// Whether it is a lock site
|
|
438
|
+
inline bool isTDFork(const ICFGNode* call)
|
|
439
|
+
{
|
|
440
|
+
if(SVFUtil::isa<CallICFGNode>(call) == false)
|
|
441
|
+
return false;
|
|
442
|
+
return getTCG()->getThreadAPI()->isTDFork(SVFUtil::cast<CallICFGNode>(call));
|
|
443
|
+
}
|
|
444
|
+
/// Whether it is a lock site
|
|
445
|
+
inline bool isTDAcquire(const ICFGNode* call)
|
|
446
|
+
{
|
|
447
|
+
if(SVFUtil::isa<CallICFGNode>(call) == false)
|
|
448
|
+
return false;
|
|
449
|
+
return getTCG()->getThreadAPI()->isTDAcquire(SVFUtil::cast<CallICFGNode>(call));
|
|
450
|
+
}
|
|
451
|
+
/// Whether it is a unlock site
|
|
452
|
+
inline bool isTDRelease(const ICFGNode* call)
|
|
453
|
+
{
|
|
454
|
+
if(SVFUtil::isa<CallICFGNode>(call) == false)
|
|
455
|
+
return false;
|
|
456
|
+
return getTCG()->getThreadAPI()->isTDRelease(SVFUtil::cast<CallICFGNode>(call));
|
|
457
|
+
}
|
|
458
|
+
/// Whether it is a callsite
|
|
459
|
+
inline bool isCallSite(const ICFGNode* inst)
|
|
460
|
+
{
|
|
461
|
+
return tct->isCallSite(inst);
|
|
462
|
+
}
|
|
463
|
+
/// Whether it is calling an external function
|
|
464
|
+
inline bool isExtCall(const ICFGNode* inst)
|
|
465
|
+
{
|
|
466
|
+
return tct->isExtCall(inst);
|
|
467
|
+
}
|
|
468
|
+
/// Get lock value
|
|
469
|
+
inline const SVFVar* getLockVal(const ICFGNode* call)
|
|
470
|
+
{
|
|
471
|
+
return getTCG()->getThreadAPI()->getLockVal(call);
|
|
472
|
+
}
|
|
473
|
+
/// ThreadCallGraph
|
|
474
|
+
inline ThreadCallGraph* getTCG() const
|
|
475
|
+
{
|
|
476
|
+
return tct->getThreadCallGraph();
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/// TCT
|
|
480
|
+
TCT* tct;
|
|
481
|
+
|
|
482
|
+
/// context-sensitive statement worklist
|
|
483
|
+
CxtStmtWorkList cxtStmtList;
|
|
484
|
+
|
|
485
|
+
/// Map a statement to all its context-sensitive statements
|
|
486
|
+
InstToCxtStmtSet instToCxtStmtSet;
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
/// Context-sensitive locks
|
|
490
|
+
CxtLockSet cxtLockset;
|
|
491
|
+
|
|
492
|
+
/// Map a context-sensitive lock to its lock span statements
|
|
493
|
+
/// Map a context-sensitive statement to its context-sensitive lock
|
|
494
|
+
//@{
|
|
495
|
+
CxtLockToSpan cxtLocktoSpan;
|
|
496
|
+
CxtStmtToCxtLockSet cxtStmtToCxtLockSet;
|
|
497
|
+
//@}
|
|
498
|
+
|
|
499
|
+
/// Following data structures are used for collecting context-sensitive locks
|
|
500
|
+
//@{
|
|
501
|
+
CxtLockProcVec clpList; /// CxtLockProc List
|
|
502
|
+
CxtLockProcSet visitedCTPs; /// Record all visited clps
|
|
503
|
+
//@}
|
|
504
|
+
|
|
505
|
+
/// Collecting lock/unlock sites
|
|
506
|
+
//@{
|
|
507
|
+
InstSet locksites;
|
|
508
|
+
InstSet unlocksites;
|
|
509
|
+
//@}
|
|
510
|
+
|
|
511
|
+
/// Candidate functions which relevant to locks/unlocks
|
|
512
|
+
//@{
|
|
513
|
+
FunSet lockcandidateFuncSet;
|
|
514
|
+
//@}
|
|
515
|
+
|
|
516
|
+
/// Used for context-insensitive intra-procedural locks
|
|
517
|
+
//@{
|
|
518
|
+
CILockToSpan ciLocktoSpan;
|
|
519
|
+
InstToInstSetMap instCILocksMap;
|
|
520
|
+
InstToInstSetMap instTocondCILocksMap;
|
|
521
|
+
//@}
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
public:
|
|
525
|
+
double lockTime;
|
|
526
|
+
u32_t numOfTotalQueries;
|
|
527
|
+
u32_t numOfLockedQueries;
|
|
528
|
+
double lockQueriesTime;
|
|
529
|
+
};
|
|
530
|
+
|
|
531
|
+
} // End namespace SVF
|
|
532
|
+
|
|
533
|
+
#endif /* INCLUDE_MTA_LockAnalysis_H_ */
|