svf-lib 1.0.732 → 1.0.736
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/Release-build/lib/libSvf.a +0 -0
- package/SVF-linux/include/DDA/ContextDDA.h +1 -1
- package/SVF-linux/include/DDA/DDAClient.h +8 -8
- package/SVF-linux/include/DDA/DDAVFSolver.h +5 -5
- package/SVF-linux/include/DDA/FlowDDA.h +1 -1
- package/SVF-linux/include/Graphs/ConsG.h +6 -6
- package/SVF-linux/include/Graphs/ConsGEdge.h +2 -2
- package/SVF-linux/include/Graphs/ConsGNode.h +1 -1
- package/SVF-linux/include/Graphs/ExternalPAG.h +14 -14
- package/SVF-linux/include/Graphs/GenericGraph.h +1 -1
- package/SVF-linux/include/Graphs/ICFGNode.h +14 -14
- package/SVF-linux/include/Graphs/IRGraph.h +236 -0
- package/SVF-linux/include/Graphs/OfflineConsG.h +1 -1
- package/SVF-linux/include/Graphs/SVFG.h +1 -1
- package/SVF-linux/include/Graphs/SVFGOPT.h +3 -3
- package/SVF-linux/include/Graphs/VFG.h +37 -52
- package/SVF-linux/include/Graphs/VFGNode.h +2 -3
- package/SVF-linux/include/MSSA/MemRegion.h +11 -11
- package/SVF-linux/include/MSSA/MemSSA.h +4 -4
- package/SVF-linux/include/MTA/FSMPTA.h +1 -1
- package/SVF-linux/include/MemoryModel/PAGBuilderFromFile.h +8 -8
- package/SVF-linux/include/MemoryModel/PTAStat.h +31 -31
- package/SVF-linux/include/MemoryModel/PointerAnalysis.h +9 -9
- package/SVF-linux/include/MemoryModel/PointerAnalysisImpl.h +3 -3
- package/SVF-linux/include/MemoryModel/SVFIR.h +526 -235
- package/SVF-linux/include/MemoryModel/SVFStatements.h +872 -0
- package/SVF-linux/include/MemoryModel/SVFVariables.h +842 -0
- package/SVF-linux/include/MemoryModel/SymbolTableInfo.h +346 -55
- package/SVF-linux/include/SABER/SaberSVFGBuilder.h +0 -2
- package/SVF-linux/include/SABER/SrcSnkDDA.h +3 -3
- package/SVF-linux/include/SVF-FE/Graph2Json.h +1 -3
- package/SVF-linux/include/SVF-FE/SVFIRBuilder.h +398 -0
- package/SVF-linux/include/SVF-FE/SymbolTableBuilder.h +0 -1
- package/SVF-linux/include/Util/CFLSolver.h +1 -1
- package/SVF-linux/include/Util/ExtAPI.h +1 -1
- package/SVF-linux/include/Util/IRAnnotator.h +6 -6
- package/SVF-linux/include/Util/Options.h +1 -1
- package/SVF-linux/include/Util/TypeBasedHeapCloning.h +11 -11
- package/SVF-linux/include/WPA/Andersen.h +11 -11
- package/SVF-linux/include/WPA/AndersenSFR.h +4 -4
- package/SVF-linux/include/WPA/FlowSensitive.h +2 -2
- package/SVF-linux/include/WPA/FlowSensitiveTBHC.h +1 -1
- package/SVF-linux/include/WPA/Steensgaard.h +2 -2
- package/SVF-linux/include/WPA/TypeAnalysis.h +1 -1
- package/SVF-linux/include/WPA/VersionedFlowSensitive.h +2 -2
- package/SVF-linux/include/WPA/WPAStat.h +1 -2
- package/SVF-osx/Release-build/lib/CUDD/libCudd.a +0 -0
- package/SVF-osx/Release-build/lib/libSvf.a +0 -0
- package/SVF-osx/include/DDA/ContextDDA.h +1 -1
- package/SVF-osx/include/DDA/DDAClient.h +8 -8
- package/SVF-osx/include/DDA/DDAVFSolver.h +5 -5
- package/SVF-osx/include/DDA/FlowDDA.h +1 -1
- package/SVF-osx/include/Graphs/ConsG.h +6 -6
- package/SVF-osx/include/Graphs/ConsGEdge.h +2 -2
- package/SVF-osx/include/Graphs/ConsGNode.h +1 -1
- package/SVF-osx/include/Graphs/ExternalPAG.h +14 -14
- package/SVF-osx/include/Graphs/GenericGraph.h +1 -1
- package/SVF-osx/include/Graphs/ICFGNode.h +14 -14
- package/SVF-osx/include/Graphs/IRGraph.h +236 -0
- package/SVF-osx/include/Graphs/OfflineConsG.h +1 -1
- package/SVF-osx/include/Graphs/SVFG.h +1 -1
- package/SVF-osx/include/Graphs/SVFGOPT.h +3 -3
- package/SVF-osx/include/Graphs/VFG.h +37 -52
- package/SVF-osx/include/Graphs/VFGNode.h +2 -3
- package/SVF-osx/include/MSSA/MemRegion.h +11 -11
- package/SVF-osx/include/MSSA/MemSSA.h +4 -4
- package/SVF-osx/include/MTA/FSMPTA.h +1 -1
- package/SVF-osx/include/MemoryModel/PAGBuilderFromFile.h +8 -8
- package/SVF-osx/include/MemoryModel/PTAStat.h +31 -31
- package/SVF-osx/include/MemoryModel/PointerAnalysis.h +9 -9
- package/SVF-osx/include/MemoryModel/PointerAnalysisImpl.h +3 -3
- package/SVF-osx/include/MemoryModel/SVFIR.h +526 -235
- package/SVF-osx/include/MemoryModel/SVFStatements.h +872 -0
- package/SVF-osx/include/MemoryModel/SVFVariables.h +842 -0
- package/SVF-osx/include/MemoryModel/SymbolTableInfo.h +346 -55
- package/SVF-osx/include/SABER/SaberSVFGBuilder.h +0 -2
- package/SVF-osx/include/SABER/SrcSnkDDA.h +3 -3
- package/SVF-osx/include/SVF-FE/Graph2Json.h +1 -3
- package/SVF-osx/include/SVF-FE/SVFIRBuilder.h +398 -0
- package/SVF-osx/include/SVF-FE/SymbolTableBuilder.h +0 -1
- package/SVF-osx/include/Util/CFLSolver.h +1 -1
- package/SVF-osx/include/Util/ExtAPI.h +1 -1
- package/SVF-osx/include/Util/IRAnnotator.h +6 -6
- package/SVF-osx/include/Util/Options.h +1 -1
- package/SVF-osx/include/Util/TypeBasedHeapCloning.h +11 -11
- package/SVF-osx/include/WPA/Andersen.h +11 -11
- package/SVF-osx/include/WPA/AndersenSFR.h +4 -4
- package/SVF-osx/include/WPA/FlowSensitive.h +2 -2
- package/SVF-osx/include/WPA/FlowSensitiveTBHC.h +1 -1
- package/SVF-osx/include/WPA/Steensgaard.h +2 -2
- package/SVF-osx/include/WPA/TypeAnalysis.h +1 -1
- package/SVF-osx/include/WPA/VersionedFlowSensitive.h +2 -2
- package/SVF-osx/include/WPA/WPAStat.h +1 -2
- package/package.json +1 -1
|
Binary file
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#ifndef DDACLIENT_H_
|
|
12
12
|
#define DDACLIENT_H_
|
|
13
13
|
|
|
14
|
-
#include "
|
|
14
|
+
#include "MemoryModel/SVFIR.h"
|
|
15
15
|
#include "MemoryModel/PointerAnalysisImpl.h"
|
|
16
16
|
#include "Graphs/SVFG.h"
|
|
17
17
|
#include "Util/BasicTypes.h"
|
|
@@ -32,7 +32,7 @@ public:
|
|
|
32
32
|
virtual inline void initialise(SVFModule*) {}
|
|
33
33
|
|
|
34
34
|
/// Collect candidate pointers for query.
|
|
35
|
-
virtual inline OrderedNodeSet& collectCandidateQueries(
|
|
35
|
+
virtual inline OrderedNodeSet& collectCandidateQueries(SVFIR* p)
|
|
36
36
|
{
|
|
37
37
|
setPAG(p);
|
|
38
38
|
if (solveAll)
|
|
@@ -52,8 +52,8 @@ public:
|
|
|
52
52
|
|
|
53
53
|
/// Call back used by DDAVFSolver.
|
|
54
54
|
virtual inline void handleStatement(const SVFGNode*, NodeID) {}
|
|
55
|
-
/// Set
|
|
56
|
-
inline void setPAG(
|
|
55
|
+
/// Set SVFIR graph.
|
|
56
|
+
inline void setPAG(SVFIR* g)
|
|
57
57
|
{
|
|
58
58
|
pag = g;
|
|
59
59
|
}
|
|
@@ -81,11 +81,11 @@ public:
|
|
|
81
81
|
protected:
|
|
82
82
|
void addCandidate(NodeID id)
|
|
83
83
|
{
|
|
84
|
-
if (pag->isValidTopLevelPtr(pag->
|
|
84
|
+
if (pag->isValidTopLevelPtr(pag->getGNode(id)))
|
|
85
85
|
candidateQueries.insert(id);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
SVFIR* pag; ///< SVFIR graph used by current DDA analysis
|
|
89
89
|
SVFModule* module; ///< LLVM module
|
|
90
90
|
NodeID curPtr; ///< current pointer being queried
|
|
91
91
|
OrderedNodeSet candidateQueries; ///< store all candidate pointers to be queried
|
|
@@ -109,7 +109,7 @@ public:
|
|
|
109
109
|
~FunptrDDAClient() {}
|
|
110
110
|
|
|
111
111
|
/// Only collect function pointers as query candidates.
|
|
112
|
-
virtual OrderedNodeSet& collectCandidateQueries(
|
|
112
|
+
virtual OrderedNodeSet& collectCandidateQueries(SVFIR* p);
|
|
113
113
|
virtual void performStat(PointerAnalysis* pta);
|
|
114
114
|
};
|
|
115
115
|
|
|
@@ -128,7 +128,7 @@ public:
|
|
|
128
128
|
~AliasDDAClient() {}
|
|
129
129
|
|
|
130
130
|
/// Only collect function pointers as query candidates.
|
|
131
|
-
virtual OrderedNodeSet& collectCandidateQueries(
|
|
131
|
+
virtual OrderedNodeSet& collectCandidateQueries(SVFIR* pag);
|
|
132
132
|
|
|
133
133
|
virtual void performStat(PointerAnalysis* pta);
|
|
134
134
|
|
|
@@ -29,7 +29,7 @@ public:
|
|
|
29
29
|
typedef SCCDetection<SVFG*> SVFGSCC;
|
|
30
30
|
typedef SCCDetection<PTACallGraph*> CallGraphSCC;
|
|
31
31
|
typedef PTACallGraphEdge::CallInstSet CallInstSet;
|
|
32
|
-
typedef
|
|
32
|
+
typedef SVFIR::CallSiteSet CallSiteSet;
|
|
33
33
|
typedef OrderedSet<DPIm> DPTItemSet;
|
|
34
34
|
typedef OrderedMap<DPIm, CPtSet> DPImToCPtSetMap;
|
|
35
35
|
typedef OrderedMap<DPIm,CVar> DPMToCVarMap;
|
|
@@ -287,7 +287,7 @@ protected:
|
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
/// Build SVFG
|
|
290
|
-
virtual inline void buildSVFG(
|
|
290
|
+
virtual inline void buildSVFG(SVFIR* pag)
|
|
291
291
|
{
|
|
292
292
|
_ander = AndersenWaveDiff::createAndersenWaveDiff(pag);
|
|
293
293
|
_svfg = svfgBuilder.buildPTROnlySVFGWithoutOPT(_ander);
|
|
@@ -473,7 +473,7 @@ protected:
|
|
|
473
473
|
{
|
|
474
474
|
NodeID funPtr = _pag->getFunPtr(cbn);
|
|
475
475
|
DPIm funPtrDpm(dpm);
|
|
476
|
-
funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->
|
|
476
|
+
funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->getGNode(funPtr)),funPtr);
|
|
477
477
|
findPT(funPtrDpm);
|
|
478
478
|
}
|
|
479
479
|
}
|
|
@@ -486,7 +486,7 @@ protected:
|
|
|
486
486
|
{
|
|
487
487
|
NodeID funPtr = _pag->getFunPtr(*it);
|
|
488
488
|
DPIm funPtrDpm(dpm);
|
|
489
|
-
funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->
|
|
489
|
+
funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->getGNode(funPtr)),funPtr);
|
|
490
490
|
findPT(funPtrDpm);
|
|
491
491
|
}
|
|
492
492
|
}
|
|
@@ -750,7 +750,7 @@ protected:
|
|
|
750
750
|
}
|
|
751
751
|
|
|
752
752
|
bool outOfBudgetQuery; ///< Whether the current query is out of step limits
|
|
753
|
-
|
|
753
|
+
SVFIR* _pag; ///< SVFIR
|
|
754
754
|
SVFG* _svfg; ///< SVFG
|
|
755
755
|
AndersenWaveDiff* _ander; ///< Andersen's analysis
|
|
756
756
|
NodeBS candidateQueries; ///< candidate pointers;
|
|
@@ -30,7 +30,7 @@ public:
|
|
|
30
30
|
typedef BVDataPTAImpl::CallEdgeMap CallEdgeMap;
|
|
31
31
|
typedef BVDataPTAImpl::FunctionSet FunctionSet;
|
|
32
32
|
/// Constructor
|
|
33
|
-
FlowDDA(
|
|
33
|
+
FlowDDA(SVFIR* _pag, DDAClient* client): BVDataPTAImpl(_pag, PointerAnalysis::FlowS_DDA),
|
|
34
34
|
DDAVFSolver<NodeID,PointsTo,LocDPItem>(),
|
|
35
35
|
_client(client)
|
|
36
36
|
{
|
|
@@ -52,7 +52,7 @@ public:
|
|
|
52
52
|
typedef FIFOWorkList<NodeID> WorkList;
|
|
53
53
|
|
|
54
54
|
protected:
|
|
55
|
-
|
|
55
|
+
SVFIR*pag;
|
|
56
56
|
NodeToRepMap nodeToRepMap;
|
|
57
57
|
NodeToSubsMap nodeToSubsMap;
|
|
58
58
|
WorkList nodesToBeCollapsed;
|
|
@@ -92,7 +92,7 @@ protected:
|
|
|
92
92
|
|
|
93
93
|
public:
|
|
94
94
|
/// Constructor
|
|
95
|
-
ConstraintGraph(
|
|
95
|
+
ConstraintGraph(SVFIR* p): pag(p), edgeIndex(0)
|
|
96
96
|
{
|
|
97
97
|
buildCG();
|
|
98
98
|
}
|
|
@@ -172,7 +172,7 @@ public:
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
///Add a
|
|
175
|
+
///Add a SVFIR edge into Edge map
|
|
176
176
|
//@{
|
|
177
177
|
/// Add Address edge
|
|
178
178
|
AddrCGEdge* addAddrCGEdge(NodeID src, NodeID dst);
|
|
@@ -187,7 +187,7 @@ public:
|
|
|
187
187
|
StoreCGEdge* addStoreCGEdge(NodeID src, NodeID dst);
|
|
188
188
|
//@}
|
|
189
189
|
|
|
190
|
-
///Get
|
|
190
|
+
///Get SVFIR edge
|
|
191
191
|
//@{
|
|
192
192
|
/// Get Address edges
|
|
193
193
|
inline ConstraintEdge::ConstraintEdgeSetTy& getAddrCGEdges()
|
|
@@ -296,9 +296,9 @@ public:
|
|
|
296
296
|
return false;
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
-
/// Wrappers for invoking
|
|
299
|
+
/// Wrappers for invoking SVFIR methods
|
|
300
300
|
//@{
|
|
301
|
-
inline const
|
|
301
|
+
inline const SVFIR::CallSiteToFunPtrMap& getIndirectCallsites() const
|
|
302
302
|
{
|
|
303
303
|
return pag->getIndirectCallsites();
|
|
304
304
|
}
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
#ifndef CONSGEDGE_H_
|
|
31
31
|
#define CONSGEDGE_H_
|
|
32
32
|
|
|
33
|
-
#include "
|
|
33
|
+
#include "MemoryModel/SVFIR.h"
|
|
34
34
|
#include "Util/WorkList.h"
|
|
35
35
|
|
|
36
36
|
#include <map>
|
|
@@ -42,7 +42,7 @@ namespace SVF
|
|
|
42
42
|
class ConstraintNode;
|
|
43
43
|
/*!
|
|
44
44
|
* Self-defined edge for constraint resolution
|
|
45
|
-
* including add/remove/re-target, but all the operations do not affect original
|
|
45
|
+
* including add/remove/re-target, but all the operations do not affect original SVFIR Edges
|
|
46
46
|
*/
|
|
47
47
|
typedef GenericEdge<ConstraintNode> GenericConsEdgeTy;
|
|
48
48
|
class ConstraintEdge : public GenericConsEdgeTy
|
|
@@ -101,7 +101,7 @@ public:
|
|
|
101
101
|
}
|
|
102
102
|
//@}
|
|
103
103
|
|
|
104
|
-
/// Direct and Indirect
|
|
104
|
+
/// Direct and Indirect SVFIR edges
|
|
105
105
|
inline bool isdirectEdge(ConstraintEdge::ConstraintEdgeK kind)
|
|
106
106
|
{
|
|
107
107
|
return (kind == ConstraintEdge::Copy || kind == ConstraintEdge::NormalGep || kind == ConstraintEdge::VariantGep );
|
|
@@ -10,15 +10,15 @@
|
|
|
10
10
|
#ifndef EXTERNALPAG_H_
|
|
11
11
|
#define EXTERNALPAG_H_
|
|
12
12
|
|
|
13
|
-
#include "
|
|
13
|
+
#include "MemoryModel/SVFVariables.h"
|
|
14
14
|
|
|
15
15
|
extern llvm::cl::list<std::string> DumpPAGFunctions;
|
|
16
16
|
|
|
17
17
|
namespace SVF
|
|
18
18
|
{
|
|
19
19
|
|
|
20
|
-
/// Represents the
|
|
21
|
-
/// It's purpose is to be attached to the main
|
|
20
|
+
/// Represents the SVFIR of a function loaded externally (i.e. from file).
|
|
21
|
+
/// It's purpose is to be attached to the main SVFIR (almost) seamlessly.
|
|
22
22
|
class ExternalPAG
|
|
23
23
|
{
|
|
24
24
|
private:
|
|
@@ -28,17 +28,17 @@ private:
|
|
|
28
28
|
functionToExternalPAGEntries;
|
|
29
29
|
static Map<const SVFFunction*, PAGNode *> functionToExternalPAGReturns;
|
|
30
30
|
|
|
31
|
-
/// Name of the function this external
|
|
31
|
+
/// Name of the function this external SVFIR represents.
|
|
32
32
|
std::string functionName;
|
|
33
33
|
|
|
34
|
-
/// Value nodes in this external
|
|
35
|
-
/// because we will rebuild these nodes in the main
|
|
34
|
+
/// Value nodes in this external SVFIR, represented by NodeIDs
|
|
35
|
+
/// because we will rebuild these nodes in the main SVFIR.
|
|
36
36
|
NodeSet valueNodes;
|
|
37
|
-
/// Object nodes in this external
|
|
38
|
-
/// because we will rebuild these nodes in the main
|
|
37
|
+
/// Object nodes in this external SVFIR, represented by NodeIDs
|
|
38
|
+
/// because we will rebuild these nodes in the main SVFIR.
|
|
39
39
|
NodeSet objectNodes;
|
|
40
|
-
/// Edges in this external
|
|
41
|
-
/// we will rebuild these edges in the main
|
|
40
|
+
/// Edges in this external SVFIR, represented by the parts of an Edge because
|
|
41
|
+
/// we will rebuild these edges in the main SVFIR.
|
|
42
42
|
OrderedSet<std::tuple<NodeID, NodeID, std::string, int>> edges;
|
|
43
43
|
|
|
44
44
|
// Special nodes.
|
|
@@ -82,15 +82,15 @@ public:
|
|
|
82
82
|
~ExternalPAG() {}
|
|
83
83
|
|
|
84
84
|
/// Parses command line arguments and attaches external PAGs to main
|
|
85
|
-
///
|
|
85
|
+
/// SVFIR.
|
|
86
86
|
static void initialise(SVFModule* svfModule);
|
|
87
87
|
|
|
88
|
-
/// Connects callsite if a external
|
|
88
|
+
/// Connects callsite if a external SVFIR implementing the relevant function
|
|
89
89
|
/// has been added.
|
|
90
90
|
/// Returns true on success, false otherwise.
|
|
91
91
|
static bool connectCallsiteToExternalPAG(CallSite *cs);
|
|
92
92
|
|
|
93
|
-
/// Whether an external
|
|
93
|
+
/// Whether an external SVFIR implementing function exists.
|
|
94
94
|
static bool hasExternalPAG(const SVFFunction* function);
|
|
95
95
|
|
|
96
96
|
/// Dump individual PAGs of specified functions. Currently to outs().
|
|
@@ -136,7 +136,7 @@ public:
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
/// Adds (creates new equivalents) all the nodes and edges of this extpag to
|
|
139
|
-
/// the main
|
|
139
|
+
/// the main SVFIR. function is used as a key for future lookups.
|
|
140
140
|
/// Returns true on success, false otherwise (incl. if it already exists).
|
|
141
141
|
bool addExternalPAG(const SVFFunction* function);
|
|
142
142
|
|
|
@@ -108,7 +108,7 @@ public:
|
|
|
108
108
|
}
|
|
109
109
|
} equalGEdge;
|
|
110
110
|
|
|
111
|
-
inline bool operator==(const GenericEdge<NodeType>* rhs) const
|
|
111
|
+
virtual inline bool operator==(const GenericEdge<NodeType>* rhs) const
|
|
112
112
|
{
|
|
113
113
|
return (rhs->edgeFlag == this->edgeFlag && rhs->getSrcID() == this->getSrcID()
|
|
114
114
|
&& rhs->getDstID() == this->getDstID());
|
|
@@ -41,8 +41,8 @@ class ICFGNode;
|
|
|
41
41
|
class RetBlockNode;
|
|
42
42
|
class CallPE;
|
|
43
43
|
class RetPE;
|
|
44
|
-
class
|
|
45
|
-
class
|
|
44
|
+
class SVFStmt;
|
|
45
|
+
class SVFVar;
|
|
46
46
|
class VFGNode;
|
|
47
47
|
|
|
48
48
|
/*!
|
|
@@ -67,7 +67,7 @@ public:
|
|
|
67
67
|
typedef Set<const CallPE *> CallPESet;
|
|
68
68
|
typedef Set<const RetPE *> RetPESet;
|
|
69
69
|
typedef std::list<const VFGNode*> VFGNodeList;
|
|
70
|
-
typedef std::list<const
|
|
70
|
+
typedef std::list<const SVFStmt*> PAGEdgeList;
|
|
71
71
|
|
|
72
72
|
public:
|
|
73
73
|
/// Constructor
|
|
@@ -113,7 +113,7 @@ public:
|
|
|
113
113
|
|
|
114
114
|
/// Set/Get methods of VFGNodes
|
|
115
115
|
///@{
|
|
116
|
-
inline void addPAGEdge(const
|
|
116
|
+
inline void addPAGEdge(const SVFStmt *edge)
|
|
117
117
|
{
|
|
118
118
|
pagEdges.push_back(edge);
|
|
119
119
|
}
|
|
@@ -252,7 +252,7 @@ class FunEntryBlockNode : public InterBlockNode
|
|
|
252
252
|
{
|
|
253
253
|
|
|
254
254
|
public:
|
|
255
|
-
typedef std::vector<const
|
|
255
|
+
typedef std::vector<const SVFVar *> FormalParmNodeVec;
|
|
256
256
|
private:
|
|
257
257
|
FormalParmNodeVec FPNodes;
|
|
258
258
|
public:
|
|
@@ -271,7 +271,7 @@ public:
|
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
/// Add formal parameters
|
|
274
|
-
inline void addFormalParms(const
|
|
274
|
+
inline void addFormalParms(const SVFVar *fp)
|
|
275
275
|
{
|
|
276
276
|
FPNodes.push_back(fp);
|
|
277
277
|
}
|
|
@@ -310,7 +310,7 @@ class FunExitBlockNode : public InterBlockNode
|
|
|
310
310
|
|
|
311
311
|
private:
|
|
312
312
|
const SVFFunction* fun;
|
|
313
|
-
const
|
|
313
|
+
const SVFVar *formalRet;
|
|
314
314
|
public:
|
|
315
315
|
FunExitBlockNode(NodeID id, const SVFFunction* f);
|
|
316
316
|
|
|
@@ -321,13 +321,13 @@ public:
|
|
|
321
321
|
}
|
|
322
322
|
|
|
323
323
|
/// Return actual return parameter
|
|
324
|
-
inline const
|
|
324
|
+
inline const SVFVar *getFormalRet() const
|
|
325
325
|
{
|
|
326
326
|
return formalRet;
|
|
327
327
|
}
|
|
328
328
|
|
|
329
329
|
/// Add actual return parameter
|
|
330
|
-
inline void addFormalRet(const
|
|
330
|
+
inline void addFormalRet(const SVFVar *fr)
|
|
331
331
|
{
|
|
332
332
|
formalRet = fr;
|
|
333
333
|
}
|
|
@@ -365,7 +365,7 @@ class CallBlockNode : public InterBlockNode
|
|
|
365
365
|
{
|
|
366
366
|
|
|
367
367
|
public:
|
|
368
|
-
typedef std::vector<const
|
|
368
|
+
typedef std::vector<const SVFVar *> ActualParmVFGNodeVec;
|
|
369
369
|
private:
|
|
370
370
|
const Instruction* cs;
|
|
371
371
|
const RetBlockNode* ret;
|
|
@@ -421,7 +421,7 @@ public:
|
|
|
421
421
|
}
|
|
422
422
|
|
|
423
423
|
/// Add actual parameters
|
|
424
|
-
inline void addActualParms(const
|
|
424
|
+
inline void addActualParms(const SVFVar *ap)
|
|
425
425
|
{
|
|
426
426
|
APNodes.push_back(ap);
|
|
427
427
|
}
|
|
@@ -461,7 +461,7 @@ class RetBlockNode : public InterBlockNode
|
|
|
461
461
|
|
|
462
462
|
private:
|
|
463
463
|
const Instruction* cs;
|
|
464
|
-
const
|
|
464
|
+
const SVFVar *actualRet;
|
|
465
465
|
const CallBlockNode* callBlockNode;
|
|
466
466
|
public:
|
|
467
467
|
RetBlockNode(NodeID id, const Instruction* c, CallBlockNode* cb) :
|
|
@@ -482,13 +482,13 @@ public:
|
|
|
482
482
|
return callBlockNode;
|
|
483
483
|
}
|
|
484
484
|
/// Return actual return parameter
|
|
485
|
-
inline const
|
|
485
|
+
inline const SVFVar *getActualRet() const
|
|
486
486
|
{
|
|
487
487
|
return actualRet;
|
|
488
488
|
}
|
|
489
489
|
|
|
490
490
|
/// Add actual return parameter
|
|
491
|
-
inline void addActualRet(const
|
|
491
|
+
inline void addActualRet(const SVFVar *ar)
|
|
492
492
|
{
|
|
493
493
|
actualRet = ar;
|
|
494
494
|
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
//===- SVFIR.h -- SVF IR Graph or PAG (Program Assignment Graph)--------------------------------------//
|
|
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 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 General Public License for more details.
|
|
17
|
+
|
|
18
|
+
// You should have received a copy of the GNU General Public License
|
|
19
|
+
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
//
|
|
21
|
+
//===----------------------------------------------------------------------===//
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* IRGraph.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: Nov 1, 2013
|
|
27
|
+
* Author: Yulei Sui
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
#ifndef IRGRAPH_H_
|
|
32
|
+
#define IRGRAPH_H_
|
|
33
|
+
|
|
34
|
+
#include "MemoryModel/SVFStatements.h"
|
|
35
|
+
#include "MemoryModel/SVFVariables.h"
|
|
36
|
+
#include "Util/NodeIDAllocator.h"
|
|
37
|
+
#include "Util/SVFUtil.h"
|
|
38
|
+
#include "Graphs/ICFG.h"
|
|
39
|
+
|
|
40
|
+
namespace SVF
|
|
41
|
+
{
|
|
42
|
+
typedef SVFVar PAGNode;
|
|
43
|
+
typedef SVFStmt PAGEdge;
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* Graph representation of SVF IR. It can be seen as a program assignment graph (PAG)
|
|
47
|
+
*/
|
|
48
|
+
class IRGraph : public GenericGraph<SVFVar,SVFStmt>
|
|
49
|
+
{
|
|
50
|
+
public:
|
|
51
|
+
typedef Set<const SVFStmt*> PAGEdgeSet;
|
|
52
|
+
typedef Map<const Value*,PAGEdgeSet> ValueToEdgeMap;
|
|
53
|
+
|
|
54
|
+
protected:
|
|
55
|
+
SVFStmt::PAGKindToEdgeSetMapTy PAGEdgeKindToSetMap; // < SVFIR edge map containing all PAGEdges
|
|
56
|
+
SVFStmt::PAGKindToEdgeSetMapTy PTAPAGEdgeKindToSetMap; // < SVFIR edge map containing only pointer-related edges, i.e, both RHS and RHS are of pointer type
|
|
57
|
+
bool fromFile; ///< Whether the SVFIR is built according to user specified data from a txt file
|
|
58
|
+
NodeID nodeNumAfterPAGBuild; // initial node number after building SVFIR, excluding later added nodes, e.g., gepobj nodes
|
|
59
|
+
u32_t totalPTAPAGEdge;
|
|
60
|
+
ValueToEdgeMap valueToEdgeMap; ///< Map llvm::Values to all corresponding PAGEdges
|
|
61
|
+
SymbolTableInfo* symInfo;
|
|
62
|
+
|
|
63
|
+
/// Add a node into the graph
|
|
64
|
+
inline NodeID addNode(SVFVar* node, NodeID i)
|
|
65
|
+
{
|
|
66
|
+
addGNode(i,node);
|
|
67
|
+
return i;
|
|
68
|
+
}
|
|
69
|
+
/// Add an edge into the graph
|
|
70
|
+
bool addEdge(SVFVar* src, SVFVar* dst, SVFStmt* edge);
|
|
71
|
+
|
|
72
|
+
//// Return true if this edge exits
|
|
73
|
+
SVFStmt* hasNonlabeledEdge(SVFVar* src, SVFVar* dst, SVFStmt::PEDGEK kind);
|
|
74
|
+
/// Return true if this labeled edge exits, including store, call and load
|
|
75
|
+
/// two store edge can have same dst and src but located in different basic blocks, thus flags are needed to distinguish them
|
|
76
|
+
SVFStmt* hasLabeledEdge(SVFVar* src, SVFVar* dst, SVFStmt::PEDGEK kind, const ICFGNode* cs);
|
|
77
|
+
/// Return MultiOpndStmt since it has more than one operands (we use operand 2 here to make the flag)
|
|
78
|
+
SVFStmt* hasLabeledEdge(SVFVar* src, SVFVar* op1, SVFStmt::PEDGEK kind, const SVFVar* op2);
|
|
79
|
+
|
|
80
|
+
/// Map a value to a set of edges
|
|
81
|
+
inline void mapValueToEdge(const Value *V, SVFStmt *edge)
|
|
82
|
+
{
|
|
83
|
+
auto inserted = valueToEdgeMap.emplace(V, PAGEdgeSet{edge});
|
|
84
|
+
if (!inserted.second) {
|
|
85
|
+
inserted.first->second.emplace(edge);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/// get MemObj according to LLVM value
|
|
89
|
+
inline const MemObj* getMemObj(const Value* val) const{
|
|
90
|
+
return symInfo->getObj(symInfo->getObjSym(val));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public:
|
|
94
|
+
IRGraph(bool buildFromFile): fromFile(buildFromFile), nodeNumAfterPAGBuild(0), totalPTAPAGEdge(0){
|
|
95
|
+
symInfo = SymbolTableInfo::SymbolInfo();
|
|
96
|
+
// insert dummy value if a correct value cannot be found
|
|
97
|
+
valueToEdgeMap[nullptr] = PAGEdgeSet();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
virtual ~IRGraph();
|
|
101
|
+
|
|
102
|
+
/// Whether this SVFIR built from a txt file
|
|
103
|
+
inline bool isBuiltFromFile()
|
|
104
|
+
{
|
|
105
|
+
return fromFile;
|
|
106
|
+
}
|
|
107
|
+
/// Get all SVFIR Edges that corresponds to an LLVM value
|
|
108
|
+
inline const PAGEdgeSet& getValueEdges(const Value *V)
|
|
109
|
+
{
|
|
110
|
+
auto it = valueToEdgeMap.find(V);
|
|
111
|
+
if (it == valueToEdgeMap.end()) {
|
|
112
|
+
//special empty set
|
|
113
|
+
return valueToEdgeMap.at(nullptr);
|
|
114
|
+
}
|
|
115
|
+
return it->second;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// Get SVFIR Node according to LLVM value
|
|
119
|
+
///getNode - Return the node corresponding to the specified pointer.
|
|
120
|
+
inline NodeID getValueNode(const Value *V)
|
|
121
|
+
{
|
|
122
|
+
return symInfo->getValSym(V);
|
|
123
|
+
}
|
|
124
|
+
inline bool hasValueNode(const Value* V)
|
|
125
|
+
{
|
|
126
|
+
return symInfo->hasValSym(V);
|
|
127
|
+
}
|
|
128
|
+
/// getObject - Return the obj node id refer to the memory object for the
|
|
129
|
+
/// specified global, heap or alloca instruction according to llvm value.
|
|
130
|
+
inline NodeID getObjectNode(const Value *V)
|
|
131
|
+
{
|
|
132
|
+
return symInfo->getObjSym(V);
|
|
133
|
+
}
|
|
134
|
+
/// GetReturnNode - Return the unique node representing the return value of a function
|
|
135
|
+
inline NodeID getReturnNode(const SVFFunction* func) const
|
|
136
|
+
{
|
|
137
|
+
return symInfo->getRetSym(func->getLLVMFun());
|
|
138
|
+
}
|
|
139
|
+
/// getVarargNode - Return the unique node representing the variadic argument of a variadic function.
|
|
140
|
+
inline NodeID getVarargNode(const SVFFunction* func) const
|
|
141
|
+
{
|
|
142
|
+
return symInfo->getVarargSym(func->getLLVMFun());
|
|
143
|
+
}
|
|
144
|
+
inline NodeID getBlackHoleNode() const
|
|
145
|
+
{
|
|
146
|
+
return symInfo->blackholeSymID();
|
|
147
|
+
}
|
|
148
|
+
inline NodeID getConstantNode() const
|
|
149
|
+
{
|
|
150
|
+
return symInfo->constantSymID();
|
|
151
|
+
}
|
|
152
|
+
inline NodeID getBlkPtr() const
|
|
153
|
+
{
|
|
154
|
+
return symInfo->blkPtrSymID();
|
|
155
|
+
}
|
|
156
|
+
inline NodeID getNullPtr() const
|
|
157
|
+
{
|
|
158
|
+
return symInfo->nullPtrSymID();
|
|
159
|
+
}
|
|
160
|
+
inline const MemObj* getBlackHoleObj() const
|
|
161
|
+
{
|
|
162
|
+
return symInfo->getBlkObj();
|
|
163
|
+
}
|
|
164
|
+
inline const MemObj* getConstantObj() const
|
|
165
|
+
{
|
|
166
|
+
return symInfo->getConstantObj();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
inline Size_t getValueNodeNum() const
|
|
170
|
+
{
|
|
171
|
+
return symInfo->valSyms().size();
|
|
172
|
+
}
|
|
173
|
+
inline Size_t getObjectNodeNum() const
|
|
174
|
+
{
|
|
175
|
+
return symInfo->idToObjMap().size();
|
|
176
|
+
}
|
|
177
|
+
inline u32_t getNodeNumAfterPAGBuild() const
|
|
178
|
+
{
|
|
179
|
+
return nodeNumAfterPAGBuild;
|
|
180
|
+
}
|
|
181
|
+
inline void setNodeNumAfterPAGBuild(u32_t num)
|
|
182
|
+
{
|
|
183
|
+
nodeNumAfterPAGBuild = num;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
inline Size_t getPAGNodeNum() const
|
|
187
|
+
{
|
|
188
|
+
return nodeNum;
|
|
189
|
+
}
|
|
190
|
+
inline Size_t getPAGEdgeNum() const
|
|
191
|
+
{
|
|
192
|
+
return edgeNum;
|
|
193
|
+
}
|
|
194
|
+
inline Size_t getPTAPAGEdgeNum() const
|
|
195
|
+
{
|
|
196
|
+
return totalPTAPAGEdge;
|
|
197
|
+
}
|
|
198
|
+
/// Return graph name
|
|
199
|
+
inline std::string getGraphName() const
|
|
200
|
+
{
|
|
201
|
+
return "SVFIR";
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// Dump SVFIR
|
|
205
|
+
void dump(std::string name);
|
|
206
|
+
|
|
207
|
+
/// View graph from the debugger
|
|
208
|
+
void view();
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
namespace llvm
|
|
215
|
+
{
|
|
216
|
+
|
|
217
|
+
/* !
|
|
218
|
+
* GraphTraits specializations of SVFIR to be used for the generic graph algorithms.
|
|
219
|
+
* Provide graph traits for tranversing from a SVFIR node using standard graph traversals.
|
|
220
|
+
*/
|
|
221
|
+
template<> struct GraphTraits<SVF::SVFVar*> : public GraphTraits<SVF::GenericNode<SVF::SVFVar,SVF::SVFStmt>* >
|
|
222
|
+
{
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/// Inverse GraphTraits specializations for SVFIR node, it is used for inverse traversal.
|
|
226
|
+
template<> struct GraphTraits<Inverse<SVF::SVFVar *> > : public GraphTraits<Inverse<SVF::GenericNode<SVF::SVFVar,SVF::SVFStmt>* > >
|
|
227
|
+
{
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
template<> struct GraphTraits<SVF::IRGraph*> : public GraphTraits<SVF::GenericGraph<SVF::SVFVar,SVF::SVFStmt>* >
|
|
231
|
+
{
|
|
232
|
+
typedef SVF::SVFVar *NodeRef;
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
} // End namespace llvm
|
|
236
|
+
#endif /* IRGRAPH_H_ */
|
|
@@ -55,7 +55,7 @@ protected:
|
|
|
55
55
|
NodeToRepMap norToRepMap; // for each *a construct a --> rep, i.e., mapping a node of to a rep node for online constraint solving
|
|
56
56
|
|
|
57
57
|
public:
|
|
58
|
-
OfflineConsG(
|
|
58
|
+
OfflineConsG(SVFIR *p) : ConstraintGraph(p),
|
|
59
59
|
nodeToRefMap( {}), norToRepMap({})
|
|
60
60
|
{
|
|
61
61
|
buildOfflineCG();
|
|
@@ -369,7 +369,7 @@ protected:
|
|
|
369
369
|
}
|
|
370
370
|
else
|
|
371
371
|
{
|
|
372
|
-
assert((it->second == node->getId()) && "a
|
|
372
|
+
assert((it->second == node->getId()) && "a SVFIR node can only have unique definition ");
|
|
373
373
|
}
|
|
374
374
|
}
|
|
375
375
|
inline NodeID getDef(const MRVer* mvar) const
|
|
@@ -259,7 +259,7 @@ private:
|
|
|
259
259
|
inline void resetDef(const PAGNode* pagNode, const SVFGNode* node)
|
|
260
260
|
{
|
|
261
261
|
PAGNodeToDefMapTy::iterator it = PAGNodeToDefMap.find(pagNode);
|
|
262
|
-
assert(it != PAGNodeToDefMap.end() && "a
|
|
262
|
+
assert(it != PAGNodeToDefMap.end() && "a SVFIR node doesn't have definition before");
|
|
263
263
|
PAGNodeToDefMap[pagNode] = node->getId();
|
|
264
264
|
}
|
|
265
265
|
|
|
@@ -290,11 +290,11 @@ private:
|
|
|
290
290
|
//@{
|
|
291
291
|
inline bool actualInOfIndCS(const ActualINSVFGNode* ai) const
|
|
292
292
|
{
|
|
293
|
-
return (
|
|
293
|
+
return (SVFIR::getPAG()->isIndirectCallSites(ai->getCallSite()));
|
|
294
294
|
}
|
|
295
295
|
inline bool actualOutOfIndCS(const ActualOUTSVFGNode* ao) const
|
|
296
296
|
{
|
|
297
|
-
return (
|
|
297
|
+
return (SVFIR::getPAG()->isIndirectCallSites(ao->getCallSite()));
|
|
298
298
|
}
|
|
299
299
|
//@}
|
|
300
300
|
|