svf-lib 1.0.1732 → 1.0.1733
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-osx/Release-build/svf/libSvfCore.a +0 -0
- package/SVF-osx/Release-build/svf-llvm/libSvfLLVM.a +0 -0
- package/SVF-osx/svf/include/AbstractExecution/ConsExeState.h +99 -96
- package/SVF-osx/svf/include/AbstractExecution/ExeState.h +64 -55
- package/SVF-osx/svf/include/AbstractExecution/IntervalExeState.h +65 -59
- package/SVF-osx/svf/include/AbstractExecution/SVFIR2ConsExeState.h +7 -7
- package/SVF-osx/svf/include/AbstractExecution/SVFIR2ItvExeState.h +18 -14
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
@@ -54,10 +54,6 @@ public:
|
|
|
54
54
|
|
|
55
55
|
static ConsExeState globalConsES;
|
|
56
56
|
|
|
57
|
-
protected:
|
|
58
|
-
VarToValMap _varToVal;
|
|
59
|
-
LocToValMap _locToVal;
|
|
60
|
-
|
|
61
57
|
public:
|
|
62
58
|
ConsExeState(): ExeState(ExeState::SingleValueK) {}
|
|
63
59
|
|
|
@@ -100,8 +96,7 @@ public:
|
|
|
100
96
|
|
|
101
97
|
using ExeState::operator==;
|
|
102
98
|
using ExeState::operator!=;
|
|
103
|
-
|
|
104
|
-
//{%
|
|
99
|
+
|
|
105
100
|
bool operator==(const ConsExeState &rhs) const;
|
|
106
101
|
|
|
107
102
|
bool operator!=(const ConsExeState &other) const
|
|
@@ -113,113 +108,141 @@ public:
|
|
|
113
108
|
|
|
114
109
|
u32_t hash() const override;
|
|
115
110
|
|
|
116
|
-
|
|
117
|
-
bool joinWith(const ConsExeState &rhs);
|
|
111
|
+
protected:
|
|
118
112
|
|
|
119
|
-
|
|
120
|
-
|
|
113
|
+
VarToValMap _varToVal; ///< Map a variable (symbol) to its constant value
|
|
114
|
+
LocToValMap _locToVal; ///< Map a memory address to its stored constant value
|
|
121
115
|
|
|
122
|
-
|
|
123
|
-
void applySummary(const ConsExeState &summary);
|
|
116
|
+
public:
|
|
124
117
|
|
|
125
|
-
///
|
|
126
|
-
|
|
118
|
+
/// get memory addresses of variable
|
|
119
|
+
virtual Addrs &getAddrs(u32_t id) override
|
|
127
120
|
{
|
|
128
|
-
|
|
121
|
+
auto it = globalConsES._varToAddrs.find(id);
|
|
122
|
+
if (it != globalConsES._varToAddrs.end()) return it->second;
|
|
123
|
+
return _varToAddrs[id];
|
|
129
124
|
}
|
|
130
125
|
|
|
131
|
-
///
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
std::string varToString(u32_t varId) const;
|
|
142
|
-
|
|
143
|
-
std::string locToString(u32_t objId) const;
|
|
144
|
-
|
|
145
|
-
bool applySelect(u32_t res, u32_t cond, u32_t top, u32_t fop);
|
|
126
|
+
/// get constant value of variable
|
|
127
|
+
inline SingleAbsValue &operator[](u32_t varId)
|
|
128
|
+
{
|
|
129
|
+
auto it = globalConsES._varToVal.find(varId);
|
|
130
|
+
if (it != globalConsES._varToVal.end())
|
|
131
|
+
return it->second;
|
|
132
|
+
else
|
|
133
|
+
return _varToVal[varId];
|
|
134
|
+
}
|
|
146
135
|
|
|
147
|
-
|
|
136
|
+
/// whether the variable is in varToAddrs table
|
|
137
|
+
virtual inline bool inVarToAddrsTable(u32_t id) const override
|
|
138
|
+
{
|
|
139
|
+
return _varToAddrs.find(id) != _varToAddrs.end() ||
|
|
140
|
+
globalConsES._varToAddrs.find(id) != globalConsES._varToAddrs.end();
|
|
141
|
+
}
|
|
148
142
|
|
|
149
|
-
|
|
143
|
+
/// whether the variable is in varToVal table
|
|
144
|
+
inline bool inVarToValTable(u32_t varId) const
|
|
150
145
|
{
|
|
151
146
|
return _varToVal.count(varId) || globalConsES._varToVal.count(varId);
|
|
152
147
|
}
|
|
153
148
|
|
|
154
|
-
|
|
149
|
+
/// whether the memory address stores memory addresses
|
|
150
|
+
virtual inline bool inLocToAddrsTable(u32_t id) const override
|
|
155
151
|
{
|
|
156
|
-
|
|
157
|
-
s32_t virAddr = z3Expr2NumValue(loc);
|
|
158
|
-
assert(isVirtualMemAddress(virAddr) && "Pointer operand is not a physical address?");
|
|
159
|
-
u32_t objId = getInternalID(virAddr);
|
|
160
|
-
assert(getInternalID(objId) == objId && "SVFVar idx overflow > 0x7f000000?");
|
|
161
|
-
return inLocalLocToVal(objId);
|
|
152
|
+
return globalConsES._locToAddrs.find(id) != globalConsES._locToAddrs.end() || inLocalLocToAddrsTable(id);
|
|
162
153
|
}
|
|
163
154
|
|
|
164
|
-
|
|
155
|
+
/// whether the memory address stores constant value
|
|
156
|
+
inline bool inLocToValTable(u32_t varId) const
|
|
165
157
|
{
|
|
166
|
-
return _locToVal.count(varId);
|
|
158
|
+
return inLocalLocToValTable(varId) || globalConsES._locToVal.count(varId);
|
|
167
159
|
}
|
|
168
160
|
|
|
169
|
-
inline
|
|
161
|
+
inline const VarToValMap &getVarToVal() const
|
|
170
162
|
{
|
|
171
|
-
return
|
|
163
|
+
return _varToVal;
|
|
172
164
|
}
|
|
173
165
|
|
|
174
|
-
inline
|
|
166
|
+
inline const LocToValMap &getLocToVal() const
|
|
175
167
|
{
|
|
176
|
-
|
|
177
|
-
return eq((*this)[lhs], (*this)[rhs]);
|
|
168
|
+
return _locToVal;
|
|
178
169
|
}
|
|
179
|
-
//%}
|
|
180
170
|
|
|
181
|
-
virtual inline bool
|
|
171
|
+
virtual inline bool inLocalLocToAddrsTable(u32_t id) const
|
|
182
172
|
{
|
|
183
|
-
return
|
|
184
|
-
globalConsES._varToVAddrs.find(id) != globalConsES._varToVAddrs.end();
|
|
173
|
+
return _locToAddrs.find(id) != _locToAddrs.end();
|
|
185
174
|
}
|
|
186
175
|
|
|
187
|
-
|
|
176
|
+
inline bool inLocalLocToValTable(u32_t varId) const
|
|
188
177
|
{
|
|
189
|
-
return
|
|
178
|
+
return _locToVal.count(varId);
|
|
190
179
|
}
|
|
191
180
|
|
|
192
|
-
|
|
181
|
+
inline bool inLocalLocToValTable(const SingleAbsValue& addr) const
|
|
193
182
|
{
|
|
194
|
-
return
|
|
183
|
+
return _locToVal.count(getInternalID(addr.getNumeral()));
|
|
195
184
|
}
|
|
196
185
|
|
|
197
|
-
|
|
186
|
+
public:
|
|
187
|
+
|
|
188
|
+
/// Merge rhs into this
|
|
189
|
+
bool joinWith(const ConsExeState &rhs);
|
|
190
|
+
|
|
191
|
+
/// Build global execution state
|
|
192
|
+
void buildGlobES(ConsExeState &globES, Set<u32_t> &vars);
|
|
193
|
+
|
|
194
|
+
/// Update symbolic states based on the summary/side-effect of callee
|
|
195
|
+
void applySummary(const ConsExeState &summary);
|
|
196
|
+
|
|
197
|
+
inline bool equalVar(u32_t lhs, u32_t rhs)
|
|
198
198
|
{
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
return _varToVAddrs[id];
|
|
199
|
+
if (!inVarToValTable(lhs) || !inVarToValTable(rhs)) return false;
|
|
200
|
+
return eq((*this)[lhs], (*this)[rhs]);
|
|
202
201
|
}
|
|
203
202
|
|
|
204
|
-
|
|
203
|
+
/// Whether state is null state (uninitialized state)
|
|
204
|
+
inline bool isNullState() const
|
|
205
|
+
{
|
|
206
|
+
return _varToVal.size() == 1 && eq((*_varToVal.begin()).second, -1) && _locToVal.empty();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/// Print values of all expressions
|
|
210
|
+
void printExprValues() const;
|
|
211
|
+
|
|
212
|
+
/// Print values of all expressions
|
|
213
|
+
void printExprValues(std::ostream &oss) const override;
|
|
214
|
+
|
|
215
|
+
std::string toString() const override;
|
|
216
|
+
|
|
217
|
+
std::string pcToString() const;
|
|
218
|
+
|
|
219
|
+
std::string varToString(u32_t varId) const;
|
|
220
|
+
|
|
221
|
+
std::string locToString(u32_t objId) const;
|
|
222
|
+
|
|
223
|
+
bool applySelect(u32_t res, u32_t cond, u32_t top, u32_t fop);
|
|
224
|
+
|
|
225
|
+
bool applyPhi(u32_t res, std::vector<u32_t> &ops);
|
|
226
|
+
|
|
227
|
+
virtual Addrs &loadAddrs(u32_t addr) override
|
|
205
228
|
{
|
|
206
229
|
assert(isVirtualMemAddress(addr) && "not virtual address?");
|
|
207
230
|
u32_t objId = getInternalID(addr);
|
|
208
|
-
auto it =
|
|
209
|
-
if (it !=
|
|
231
|
+
auto it = _locToAddrs.find(objId);
|
|
232
|
+
if (it != _locToAddrs.end())
|
|
210
233
|
{
|
|
211
234
|
return it->second;
|
|
212
235
|
}
|
|
213
236
|
else
|
|
214
237
|
{
|
|
215
|
-
auto globIt = globalConsES.
|
|
216
|
-
if (globIt != globalConsES.
|
|
238
|
+
auto globIt = globalConsES._locToAddrs.find(objId);
|
|
239
|
+
if (globIt != globalConsES._locToAddrs.end())
|
|
217
240
|
{
|
|
218
241
|
return globIt->second;
|
|
219
242
|
}
|
|
220
243
|
else
|
|
221
244
|
{
|
|
222
|
-
return
|
|
245
|
+
return getAddrs(0);
|
|
223
246
|
}
|
|
224
247
|
}
|
|
225
248
|
}
|
|
@@ -227,15 +250,15 @@ public:
|
|
|
227
250
|
virtual std::string varToAddrs(u32_t varId) const override
|
|
228
251
|
{
|
|
229
252
|
std::stringstream exprName;
|
|
230
|
-
auto it =
|
|
231
|
-
if (it ==
|
|
253
|
+
auto it = _varToAddrs.find(varId);
|
|
254
|
+
if (it == _varToAddrs.end())
|
|
232
255
|
{
|
|
233
|
-
auto git = globalConsES.
|
|
234
|
-
if (git == globalConsES.
|
|
256
|
+
auto git = globalConsES._varToAddrs.find(varId);
|
|
257
|
+
if (git == globalConsES._varToAddrs.end())
|
|
235
258
|
exprName << "Var not in varToAddrs!\n";
|
|
236
259
|
else
|
|
237
260
|
{
|
|
238
|
-
const
|
|
261
|
+
const Addrs &vaddrs = git->second;
|
|
239
262
|
if (vaddrs.size() == 1)
|
|
240
263
|
{
|
|
241
264
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -253,7 +276,7 @@ public:
|
|
|
253
276
|
}
|
|
254
277
|
else
|
|
255
278
|
{
|
|
256
|
-
const
|
|
279
|
+
const Addrs &vaddrs = it->second;
|
|
257
280
|
if (vaddrs.size() == 1)
|
|
258
281
|
{
|
|
259
282
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -274,15 +297,15 @@ public:
|
|
|
274
297
|
virtual std::string locToAddrs(u32_t objId) const override
|
|
275
298
|
{
|
|
276
299
|
std::stringstream exprName;
|
|
277
|
-
auto it =
|
|
278
|
-
if (it ==
|
|
300
|
+
auto it = _locToAddrs.find(objId);
|
|
301
|
+
if (it == _locToAddrs.end())
|
|
279
302
|
{
|
|
280
|
-
auto git = globalConsES.
|
|
281
|
-
if (git == globalConsES.
|
|
303
|
+
auto git = globalConsES._locToAddrs.find(objId);
|
|
304
|
+
if (git == globalConsES._locToAddrs.end())
|
|
282
305
|
exprName << "Obj not in locToVal!\n";
|
|
283
306
|
else
|
|
284
307
|
{
|
|
285
|
-
const
|
|
308
|
+
const Addrs &vaddrs = git->second;
|
|
286
309
|
if (vaddrs.size() == 1)
|
|
287
310
|
{
|
|
288
311
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -300,7 +323,7 @@ public:
|
|
|
300
323
|
}
|
|
301
324
|
else
|
|
302
325
|
{
|
|
303
|
-
const
|
|
326
|
+
const Addrs &vaddrs = it->second;
|
|
304
327
|
if (vaddrs.size() == 1)
|
|
305
328
|
{
|
|
306
329
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -337,20 +360,8 @@ public:
|
|
|
337
360
|
|
|
338
361
|
public:
|
|
339
362
|
|
|
340
|
-
inline const VarToValMap &getVarToVal() const
|
|
341
|
-
{
|
|
342
|
-
return _varToVal;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
inline const LocToValMap &getLocToVal() const
|
|
346
|
-
{
|
|
347
|
-
return _locToVal;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
363
|
s64_t getNumber(u32_t lhs);
|
|
351
364
|
|
|
352
|
-
public:
|
|
353
|
-
|
|
354
365
|
static inline SingleAbsValue getIntOneZ3Expr()
|
|
355
366
|
{
|
|
356
367
|
return getContext().int_val(1);
|
|
@@ -372,14 +383,6 @@ public:
|
|
|
372
383
|
}
|
|
373
384
|
|
|
374
385
|
public:
|
|
375
|
-
inline SingleAbsValue &operator[](u32_t varId)
|
|
376
|
-
{
|
|
377
|
-
auto it = globalConsES._varToVal.find(varId);
|
|
378
|
-
if (it != globalConsES._varToVal.end())
|
|
379
|
-
return it->second;
|
|
380
|
-
else
|
|
381
|
-
return _varToVal[varId];
|
|
382
|
-
}
|
|
383
386
|
|
|
384
387
|
/// Store value to location
|
|
385
388
|
bool store(const SingleAbsValue &loc, const SingleAbsValue &value);
|
|
@@ -48,9 +48,9 @@ class ExeState
|
|
|
48
48
|
|
|
49
49
|
public:
|
|
50
50
|
|
|
51
|
-
typedef AddressValue
|
|
52
|
-
typedef Map<u32_t,
|
|
53
|
-
/// Execution state
|
|
51
|
+
typedef AddressValue Addrs;
|
|
52
|
+
typedef Map<u32_t, Addrs> VarToAddrs;
|
|
53
|
+
/// Execution state type
|
|
54
54
|
enum ExeState_TYPE
|
|
55
55
|
{
|
|
56
56
|
IntervalK, SingleValueK
|
|
@@ -63,18 +63,18 @@ public:
|
|
|
63
63
|
|
|
64
64
|
virtual ~ExeState() = default;
|
|
65
65
|
|
|
66
|
-
ExeState(const ExeState &rhs) :
|
|
67
|
-
|
|
66
|
+
ExeState(const ExeState &rhs) : _varToAddrs(rhs._varToAddrs),
|
|
67
|
+
_locToAddrs(rhs._locToAddrs) {}
|
|
68
68
|
|
|
69
|
-
ExeState(ExeState &&rhs) noexcept:
|
|
70
|
-
|
|
69
|
+
ExeState(ExeState &&rhs) noexcept: _varToAddrs(std::move(rhs._varToAddrs)),
|
|
70
|
+
_locToAddrs(std::move(rhs._locToAddrs)) {}
|
|
71
71
|
|
|
72
72
|
ExeState &operator=(const ExeState &rhs)
|
|
73
73
|
{
|
|
74
74
|
if(*this != rhs)
|
|
75
75
|
{
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
_varToAddrs = rhs._varToAddrs;
|
|
77
|
+
_locToAddrs = rhs._locToAddrs;
|
|
78
78
|
}
|
|
79
79
|
return *this;
|
|
80
80
|
}
|
|
@@ -83,24 +83,47 @@ public:
|
|
|
83
83
|
{
|
|
84
84
|
if (this != &rhs)
|
|
85
85
|
{
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
_varToAddrs = std::move(rhs._varToAddrs);
|
|
87
|
+
_locToAddrs = std::move(rhs._locToAddrs);
|
|
88
88
|
}
|
|
89
89
|
return *this;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
protected:
|
|
93
|
+
VarToAddrs _varToAddrs{{0, getVirtualMemAddress(0)}}; ///< Map a variable (symbol) to its memory addresses
|
|
94
|
+
VarToAddrs _locToAddrs; ///< Map a memory address to its stored memory addresses
|
|
93
95
|
|
|
94
|
-
|
|
96
|
+
public:
|
|
97
|
+
|
|
98
|
+
/// get memory addresses of variable
|
|
99
|
+
virtual Addrs &getAddrs(u32_t id)
|
|
95
100
|
{
|
|
96
|
-
return
|
|
101
|
+
return _varToAddrs[id];
|
|
97
102
|
}
|
|
98
103
|
|
|
99
|
-
|
|
104
|
+
/// whether the variable is in varToAddrs table
|
|
105
|
+
inline virtual bool inVarToAddrsTable(u32_t id) const
|
|
100
106
|
{
|
|
101
|
-
return
|
|
107
|
+
return _varToAddrs.find(id) != _varToAddrs.end();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/// whether the memory address stores memory addresses
|
|
111
|
+
inline virtual bool inLocToAddrsTable(u32_t id) const
|
|
112
|
+
{
|
|
113
|
+
return _locToAddrs.find(id) != _locToAddrs.end();
|
|
102
114
|
}
|
|
103
115
|
|
|
116
|
+
inline virtual const VarToAddrs &getVarToAddrs() const
|
|
117
|
+
{
|
|
118
|
+
return _varToAddrs;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
inline virtual const VarToAddrs &getLocToAddrs() const
|
|
122
|
+
{
|
|
123
|
+
return _locToAddrs;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public:
|
|
104
127
|
/// Make all value join with the other
|
|
105
128
|
bool joinWith(const ExeState &other);
|
|
106
129
|
|
|
@@ -122,44 +145,20 @@ public:
|
|
|
122
145
|
return _kind;
|
|
123
146
|
}
|
|
124
147
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return _varToVAddrs;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
inline virtual const VarToVAddrs &getLocToVAddrs() const
|
|
131
|
-
{
|
|
132
|
-
return _locToVAddrs;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
inline virtual bool inVarToAddrsTable(u32_t id) const
|
|
136
|
-
{
|
|
137
|
-
return _varToVAddrs.find(id) != _varToVAddrs.end();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
inline virtual bool inLocToAddrsTable(u32_t id) const
|
|
141
|
-
{
|
|
142
|
-
return _locToVAddrs.find(id) != _locToVAddrs.end();
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
virtual VAddrs &getVAddrs(u32_t id)
|
|
146
|
-
{
|
|
147
|
-
return _varToVAddrs[id];
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
inline virtual void storeVAddrs(u32_t addr, const VAddrs &vaddrs)
|
|
148
|
+
public:
|
|
149
|
+
inline virtual void storeAddrs(u32_t addr, const Addrs &vaddrs)
|
|
151
150
|
{
|
|
152
151
|
assert(isVirtualMemAddress(addr) && "not virtual address?");
|
|
153
152
|
if(isNullPtr(addr)) return;
|
|
154
153
|
u32_t objId = getInternalID(addr);
|
|
155
|
-
|
|
154
|
+
_locToAddrs[objId] = vaddrs;
|
|
156
155
|
}
|
|
157
156
|
|
|
158
|
-
inline virtual
|
|
157
|
+
inline virtual Addrs &loadAddrs(u32_t addr)
|
|
159
158
|
{
|
|
160
159
|
assert(isVirtualMemAddress(addr) && "not virtual address?");
|
|
161
160
|
u32_t objId = getInternalID(addr);
|
|
162
|
-
return
|
|
161
|
+
return _locToAddrs[objId];
|
|
163
162
|
}
|
|
164
163
|
|
|
165
164
|
inline bool isNullPtr(u32_t addr)
|
|
@@ -167,13 +166,23 @@ public:
|
|
|
167
166
|
return getInternalID(addr) == 0;
|
|
168
167
|
}
|
|
169
168
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
169
|
+
public:
|
|
170
|
+
|
|
171
|
+
virtual bool operator==(const ExeState &rhs) const;
|
|
172
|
+
|
|
173
|
+
inline virtual bool operator!=(const ExeState &rhs) const
|
|
174
|
+
{
|
|
175
|
+
return !(*this == rhs);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
bool equals(const ExeState *other) const
|
|
179
|
+
{
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
173
182
|
|
|
174
183
|
protected:
|
|
175
184
|
|
|
176
|
-
static bool
|
|
185
|
+
static bool eqVarToAddrs(const VarToAddrs &lhs, const VarToAddrs &rhs)
|
|
177
186
|
{
|
|
178
187
|
if (lhs.size() != rhs.size()) return false;
|
|
179
188
|
for (const auto &item: lhs)
|
|
@@ -194,14 +203,14 @@ public:
|
|
|
194
203
|
virtual std::string varToAddrs(u32_t varId) const
|
|
195
204
|
{
|
|
196
205
|
std::stringstream exprName;
|
|
197
|
-
auto it =
|
|
198
|
-
if (it ==
|
|
206
|
+
auto it = _varToAddrs.find(varId);
|
|
207
|
+
if (it == _varToAddrs.end())
|
|
199
208
|
{
|
|
200
209
|
exprName << "Var not in varToAddrs!\n";
|
|
201
210
|
}
|
|
202
211
|
else
|
|
203
212
|
{
|
|
204
|
-
const
|
|
213
|
+
const Addrs &vaddrs = it->second;
|
|
205
214
|
if (vaddrs.size() == 1)
|
|
206
215
|
{
|
|
207
216
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -222,14 +231,14 @@ public:
|
|
|
222
231
|
virtual std::string locToAddrs(u32_t objId) const
|
|
223
232
|
{
|
|
224
233
|
std::stringstream exprName;
|
|
225
|
-
auto it =
|
|
226
|
-
if (it ==
|
|
234
|
+
auto it = _locToAddrs.find(objId);
|
|
235
|
+
if (it == _locToAddrs.end())
|
|
227
236
|
{
|
|
228
237
|
exprName << "Var not in varToAddrs!\n";
|
|
229
238
|
}
|
|
230
239
|
else
|
|
231
240
|
{
|
|
232
|
-
const
|
|
241
|
+
const Addrs &vaddrs = it->second;
|
|
233
242
|
if (vaddrs.size() == 1)
|
|
234
243
|
{
|
|
235
244
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -63,17 +63,10 @@ public:
|
|
|
63
63
|
|
|
64
64
|
static IntervalExeState globalES;
|
|
65
65
|
|
|
66
|
-
protected:
|
|
67
|
-
/// key: nodeID value: Domain Value
|
|
68
|
-
VarToValMap _varToItvVal;
|
|
69
|
-
/// key: nodeID value: Domain Value
|
|
70
|
-
LocToValMap _locToItvVal;
|
|
71
|
-
|
|
72
66
|
public:
|
|
73
|
-
/// default constructor
|
|
67
|
+
/// default constructor
|
|
74
68
|
IntervalExeState() : ExeState(ExeState::IntervalK) {}
|
|
75
69
|
|
|
76
|
-
/// set path constraints, val2val and loc2val map
|
|
77
70
|
IntervalExeState(VarToValMap &_varToValMap, LocToValMap &_locToValMap) : ExeState(ExeState::IntervalK),
|
|
78
71
|
_varToItvVal(_varToValMap),
|
|
79
72
|
_locToItvVal(_locToValMap) {}
|
|
@@ -85,7 +78,8 @@ public:
|
|
|
85
78
|
|
|
86
79
|
}
|
|
87
80
|
|
|
88
|
-
|
|
81
|
+
virtual ~IntervalExeState() = default;
|
|
82
|
+
|
|
89
83
|
IntervalExeState &operator=(const IntervalExeState &rhs)
|
|
90
84
|
{
|
|
91
85
|
if (rhs != *this)
|
|
@@ -150,53 +144,63 @@ public:
|
|
|
150
144
|
return inv;
|
|
151
145
|
}
|
|
152
146
|
|
|
153
|
-
|
|
147
|
+
protected:
|
|
148
|
+
|
|
149
|
+
VarToValMap _varToItvVal; ///< Map a variable (symbol) to its interval value
|
|
150
|
+
LocToValMap _locToItvVal; ///< Map a memory address to its stored interval value
|
|
151
|
+
|
|
152
|
+
public:
|
|
153
|
+
|
|
154
|
+
/// get memory addresses of variable
|
|
155
|
+
Addrs &getAddrs(u32_t id) override
|
|
154
156
|
{
|
|
155
|
-
auto it =
|
|
156
|
-
if (it !=
|
|
157
|
+
auto it = _varToAddrs.find(id);
|
|
158
|
+
if (it != _varToAddrs.end())
|
|
157
159
|
return it->second;
|
|
158
160
|
else
|
|
159
|
-
return globalES.
|
|
161
|
+
return globalES._varToAddrs[id];
|
|
160
162
|
}
|
|
161
163
|
|
|
162
|
-
|
|
164
|
+
/// get interval value of variable
|
|
165
|
+
inline IntervalValue &operator[](u32_t varId)
|
|
163
166
|
{
|
|
164
|
-
|
|
165
|
-
|
|
167
|
+
auto localIt = _varToItvVal.find(varId);
|
|
168
|
+
if(localIt != _varToItvVal.end())
|
|
169
|
+
return localIt->second;
|
|
170
|
+
else
|
|
171
|
+
{
|
|
172
|
+
return globalES._varToItvVal[varId];
|
|
173
|
+
}
|
|
166
174
|
}
|
|
167
175
|
|
|
176
|
+
/// whether the variable is in varToAddrs table
|
|
168
177
|
inline bool inVarToAddrsTable(u32_t id) const override
|
|
169
178
|
{
|
|
170
|
-
return
|
|
171
|
-
globalES.
|
|
179
|
+
return _varToAddrs.find(id) != _varToAddrs.end() ||
|
|
180
|
+
globalES._varToAddrs.find(id) != globalES._varToAddrs.end();
|
|
172
181
|
}
|
|
173
182
|
|
|
174
|
-
|
|
183
|
+
/// whether the variable is in varToVal table
|
|
184
|
+
inline bool inVarToValTable(u32_t id) const
|
|
175
185
|
{
|
|
176
|
-
return
|
|
177
|
-
globalES.
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
inline bool inLocalLocToIValTable(u32_t id) const
|
|
181
|
-
{
|
|
182
|
-
return _locToItvVal.find(id) != _locToItvVal.end();
|
|
186
|
+
return _varToItvVal.find(id) != _varToItvVal.end() ||
|
|
187
|
+
globalES._varToItvVal.find(id) != globalES._varToItvVal.end();
|
|
183
188
|
}
|
|
184
189
|
|
|
190
|
+
/// whether the memory address stores memory addresses
|
|
185
191
|
inline bool inLocToAddrsTable(u32_t id) const override
|
|
186
192
|
{
|
|
187
|
-
return
|
|
188
|
-
globalES.
|
|
193
|
+
return _locToAddrs.find(id) != _locToAddrs.end() ||
|
|
194
|
+
globalES._locToAddrs.find(id) != globalES._locToAddrs.end();
|
|
189
195
|
}
|
|
190
196
|
|
|
191
|
-
|
|
197
|
+
/// whether the memory address stores interval value
|
|
198
|
+
inline bool inLocToValTable(u32_t id) const
|
|
192
199
|
{
|
|
193
|
-
return
|
|
200
|
+
return _locToItvVal.find(id) != _locToItvVal.end() ||
|
|
201
|
+
globalES._locToItvVal.find(id) != globalES._locToItvVal.end();
|
|
194
202
|
}
|
|
195
203
|
|
|
196
|
-
bool equals(const IntervalExeState &other) const;
|
|
197
|
-
|
|
198
|
-
virtual ~IntervalExeState() = default;
|
|
199
|
-
|
|
200
204
|
/// get var2val map
|
|
201
205
|
const VarToValMap &getVarToVal() const
|
|
202
206
|
{
|
|
@@ -209,18 +213,18 @@ public:
|
|
|
209
213
|
return _locToItvVal;
|
|
210
214
|
}
|
|
211
215
|
|
|
212
|
-
|
|
213
|
-
inline IntervalValue &operator[](u32_t varId)
|
|
216
|
+
inline bool inLocalLocToValTable(u32_t id) const
|
|
214
217
|
{
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
218
|
+
return _locToItvVal.find(id) != _locToItvVal.end();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
inline bool inLocalLocToAddrsTable(u32_t id) const
|
|
222
|
+
{
|
|
223
|
+
return _locToAddrs.find(id) != _locToAddrs.end();
|
|
222
224
|
}
|
|
223
225
|
|
|
226
|
+
public:
|
|
227
|
+
|
|
224
228
|
inline void cpyItvToLocal(u32_t varId)
|
|
225
229
|
{
|
|
226
230
|
auto localIt = _varToItvVal.find(varId);
|
|
@@ -316,24 +320,24 @@ public:
|
|
|
316
320
|
}
|
|
317
321
|
}
|
|
318
322
|
|
|
319
|
-
inline
|
|
323
|
+
inline Addrs &loadAddrs(u32_t addr) override
|
|
320
324
|
{
|
|
321
325
|
assert(isVirtualMemAddress(addr) && "not virtual address?");
|
|
322
326
|
u32_t objId = getInternalID(addr);
|
|
323
|
-
auto it =
|
|
324
|
-
if(it !=
|
|
327
|
+
auto it = _locToAddrs.find(objId);
|
|
328
|
+
if(it != _locToAddrs.end())
|
|
325
329
|
return it->second;
|
|
326
330
|
else
|
|
327
331
|
{
|
|
328
|
-
auto globIt = globalES.
|
|
329
|
-
if(globIt != globalES.
|
|
332
|
+
auto globIt = globalES._locToAddrs.find(objId);
|
|
333
|
+
if(globIt != globalES._locToAddrs.end())
|
|
330
334
|
return globIt->second;
|
|
331
335
|
else
|
|
332
|
-
return
|
|
336
|
+
return _locToAddrs[objId];
|
|
333
337
|
}
|
|
334
338
|
}
|
|
335
339
|
|
|
336
|
-
inline IntervalValue&
|
|
340
|
+
inline IntervalValue& getLocToVal(u32_t id)
|
|
337
341
|
{
|
|
338
342
|
auto it = _locToItvVal.find(id);
|
|
339
343
|
if(it != _locToItvVal.end())
|
|
@@ -348,18 +352,18 @@ public:
|
|
|
348
352
|
}
|
|
349
353
|
}
|
|
350
354
|
|
|
351
|
-
inline
|
|
355
|
+
inline Addrs& getLocAddrs(u32_t id)
|
|
352
356
|
{
|
|
353
|
-
auto it =
|
|
354
|
-
if(it !=
|
|
357
|
+
auto it = _locToAddrs.find(id);
|
|
358
|
+
if(it != _locToAddrs.end())
|
|
355
359
|
return it->second;
|
|
356
360
|
else
|
|
357
361
|
{
|
|
358
|
-
auto globIt = globalES.
|
|
359
|
-
if(globIt != globalES.
|
|
362
|
+
auto globIt = globalES._locToAddrs.find(id);
|
|
363
|
+
if(globIt != globalES._locToAddrs.end())
|
|
360
364
|
return globIt->second;
|
|
361
365
|
else
|
|
362
|
-
return
|
|
366
|
+
return _locToAddrs[id];
|
|
363
367
|
}
|
|
364
368
|
}
|
|
365
369
|
|
|
@@ -371,6 +375,8 @@ public:
|
|
|
371
375
|
return "";
|
|
372
376
|
}
|
|
373
377
|
|
|
378
|
+
bool equals(const IntervalExeState &other) const;
|
|
379
|
+
|
|
374
380
|
static bool eqVarToValMap(const VarToValMap &lhs, const VarToValMap &rhs)
|
|
375
381
|
{
|
|
376
382
|
if (lhs.size() != rhs.size()) return false;
|
|
@@ -441,14 +447,14 @@ public:
|
|
|
441
447
|
{
|
|
442
448
|
_locToItvVal.clear();
|
|
443
449
|
_varToItvVal.clear();
|
|
444
|
-
|
|
445
|
-
|
|
450
|
+
_locToAddrs.clear();
|
|
451
|
+
_varToAddrs.clear();
|
|
446
452
|
}
|
|
447
453
|
|
|
448
454
|
private:
|
|
449
455
|
void printTable(const VarToValMap &table, std::ostream &oss) const;
|
|
450
456
|
|
|
451
|
-
void printTable(const
|
|
457
|
+
void printTable(const VarToAddrs &table, std::ostream &oss) const;
|
|
452
458
|
};
|
|
453
459
|
}
|
|
454
460
|
|
|
@@ -35,7 +35,7 @@ namespace SVF
|
|
|
35
35
|
class SVFIR2ConsExeState
|
|
36
36
|
{
|
|
37
37
|
public:
|
|
38
|
-
typedef ExeState::
|
|
38
|
+
typedef ExeState::Addrs Addrs;
|
|
39
39
|
|
|
40
40
|
SVFIR2ConsExeState() = default;
|
|
41
41
|
|
|
@@ -89,7 +89,7 @@ public:
|
|
|
89
89
|
//%}
|
|
90
90
|
|
|
91
91
|
/// Return the expr of gep object given a base and offset
|
|
92
|
-
|
|
92
|
+
Addrs getGepObjAddress(u32_t base, s32_t offset);
|
|
93
93
|
|
|
94
94
|
/// Return the offset expression of a GepStmt
|
|
95
95
|
std::pair<s32_t, s32_t> getGepOffset(const GepStmt *gep);
|
|
@@ -123,17 +123,17 @@ public:
|
|
|
123
123
|
|
|
124
124
|
inline bool inVarToValTable(u32_t id) const
|
|
125
125
|
{
|
|
126
|
-
return _es->
|
|
126
|
+
return _es->inVarToValTable(id);
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
inline bool
|
|
129
|
+
inline bool inVarToAddrsTable(u32_t id) const
|
|
130
130
|
{
|
|
131
|
-
return _es->
|
|
131
|
+
return _es->inVarToAddrsTable(id);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
inline bool
|
|
134
|
+
inline bool inLocToValTable(u32_t id) const
|
|
135
135
|
{
|
|
136
|
-
return _es->
|
|
136
|
+
return _es->inLocToValTable(id);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
inline bool inLocToAddrsTable(u32_t id) const
|
|
@@ -41,8 +41,8 @@ namespace SVF
|
|
|
41
41
|
class SVFIR2ItvExeState
|
|
42
42
|
{
|
|
43
43
|
public:
|
|
44
|
-
typedef ExeState::
|
|
45
|
-
static
|
|
44
|
+
typedef ExeState::Addrs Addrs;
|
|
45
|
+
static Addrs globalNulladdrs;
|
|
46
46
|
public:
|
|
47
47
|
SVFIR2ItvExeState(SVFIR *ir) : _svfir(ir) {}
|
|
48
48
|
|
|
@@ -66,12 +66,12 @@ public:
|
|
|
66
66
|
return _relEs;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
void
|
|
69
|
+
void widenAddrs(IntervalExeState &lhs, const IntervalExeState &rhs);
|
|
70
70
|
|
|
71
|
-
void
|
|
71
|
+
void narrowAddrs(IntervalExeState &lhs, const IntervalExeState &rhs);
|
|
72
72
|
|
|
73
73
|
/// Return the field address given a pointer points to a struct object and an offset
|
|
74
|
-
|
|
74
|
+
Addrs getGepObjAddress(u32_t pointer, APOffset offset);
|
|
75
75
|
|
|
76
76
|
/// Return the value range of Integer SVF Type, e.g. unsigned i8 Type->[0, 255], signed i8 Type->[-128, 127]
|
|
77
77
|
IntervalValue getRangeLimitFromType(const SVFType* type);
|
|
@@ -102,29 +102,33 @@ public:
|
|
|
102
102
|
/// Init SVFVar
|
|
103
103
|
void initSVFVar(u32_t varId);
|
|
104
104
|
|
|
105
|
-
inline
|
|
105
|
+
inline Addrs &getAddrs(u32_t id)
|
|
106
106
|
{
|
|
107
107
|
if (inVarToAddrsTable(id))
|
|
108
|
-
return _es.
|
|
108
|
+
return _es.getAddrs(id);
|
|
109
109
|
else
|
|
110
|
-
return
|
|
110
|
+
return globalNulladdrs;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
/// whether the variable is in varToVal table
|
|
114
|
+
inline bool inVarToValTable(u32_t id) const
|
|
114
115
|
{
|
|
115
|
-
return _es.
|
|
116
|
+
return _es.inVarToValTable(id);
|
|
116
117
|
}
|
|
117
118
|
|
|
118
|
-
|
|
119
|
+
/// whether the variable is in varToAddrs table
|
|
120
|
+
inline bool inVarToAddrsTable(u32_t id) const
|
|
119
121
|
{
|
|
120
|
-
return _es.
|
|
122
|
+
return _es.inVarToAddrsTable(id);
|
|
121
123
|
}
|
|
122
124
|
|
|
123
|
-
|
|
125
|
+
/// whether the memory address stores a interval value
|
|
126
|
+
inline bool inLocToValTable(u32_t id) const
|
|
124
127
|
{
|
|
125
|
-
return _es.
|
|
128
|
+
return _es.inLocToValTable(id);
|
|
126
129
|
}
|
|
127
130
|
|
|
131
|
+
/// whether the memory address stores memory addresses
|
|
128
132
|
inline bool inLocToAddrsTable(u32_t id) const
|
|
129
133
|
{
|
|
130
134
|
return _es.inLocToAddrsTable(id);
|