61class AndersenWaveDiff;
77class MultiStageSlicer;
LockAnalysis * getLockAnalysis()
virtual LockAnalysis * computeLocksets(TCT *tct)
Compute locksets.
static std::set< const SVFStmt * > detectRace(SVFIR *svfIr, AndersenBase *pta, MHP *mhp, LockAnalysis *lockAnalysis, CallGraph *callGraph, std::set< RacePair > &outRacePairs)
std::unique_ptr< TCT > tct
static bool occurrencesRace(MHP *mhp, const RaceOccurrence &first, const RaceOccurrence &second)
Helpers for the equivalence-class race detector.
virtual ~MTA()
Destructor.
static PointsTo getGlobalObjectVariables(SVFIR *svfIr)
Escape/points-to helpers for the shared detector.
virtual MHP * computeMHP(TCT *tct)
Compute MHP.
static void commitRacePair(std::set< RacePair > &out, const RaceOccurrence &first, const RaceOccurrence &second)
std::unique_ptr< MTAStat > stat
static bool hasThreadFunctions(CallGraph *callGraph)
virtual bool runOnModule(SVFIR *module)
We start the pass here.
virtual void reportRaces()
Run the shared detector and print a race report.
static PointsTo getPointsToClosure(AndersenBase *pta, const PointsTo &pts)
std::unique_ptr< LockAnalysis > lockAnalysis
std::set< RacePair > racePairs
std::unique_ptr< SlicedSVFIRView > fullLockView
void runOnModule(SVFIR *pag, const ResolveIndirectCalls &resolveIndirectCalls)
Run the slicing pipeline on a pre-built SVFIR.
std::unique_ptr< FlowSensitive > mtaFSMPTA
void runWholeProgramDetection()
bool runPTASlicingAndAnalysis()
bool runFinalRaceDetection()
std::set< const SVFStmt * > getVulnerableStmts() const
Union of both statements of every candidate race pair (the slice targets).
std::set< RacePair > detectRacePairsOnSlicedGraph(BVDataPTAImpl *slicedPTA, MHP *slicedMHP, LockAnalysis *slicedLockAnalysis)
Re-check the candidate race pairs on the sliced graph using FSAM points-to.
std::unique_ptr< LockAnalysis > slicedLockAnalysis
std::unique_ptr< LockAnalysis > fullLockAnalysis
std::unique_ptr< SlicedSVFIRView > mtaSlicedView
std::unique_ptr< SlicedTCT > fullLockTCT
bool runMTASlicingAndAnalysis()
std::unique_ptr< MultiStageSlicer > multiStageSlicer
SlicedMTA(const SlicedMTA &)=delete
AndersenWaveDiff * preAnder
std::unique_ptr< MHP > slicedMhp
std::set< const ICFGNode * > singleSlicedNodes
std::unique_ptr< SingleSlicer > singleSlicer
SlicedMTA & operator=(const SlicedMTA &)=delete
std::unique_ptr< SlicedSVFIRView > ptaSlicedView
std::unique_ptr< TCT > tct
std::unique_ptr< SlicedSVFGView > slicedSVFGView
std::function< void(CallGraph *)> ResolveIndirectCalls
std::unique_ptr< SlicedTCT > slicedTCT
std::unique_ptr< MHP > mhp
LockAnalysis * buildFullLockAnalysis()
bool runPreAnalysis(const ResolveIndirectCalls &resolveIndirectCalls)
std::unique_ptr< MTASVFGBuilder > vfgPreBuilder
BVDataPTAImpl * getMainPTA() const
llvm::IRBuilder IRBuilder
One occurrence of a memory access under one thread instance.
A race pair: two statements that may race.
bool operator<(const RacePair &other) const
RacePair(const SVFStmt *s1, const SVFStmt *s2)