135{
137 const ICFGNode* target =
edge->getDstNode()->getICFGNode();
139 if (
const auto*
indirect = SVFUtil::dyn_cast<IndirectSVFGEdge>(
edge))
140 {
143 }
145 if (
input.getLocToVal().empty() &&
objs.empty())
146 {
147
148
149
150 }
153 {
154
155
156
157
158
159
160
161
162
163
164
165
166
168 }
169 else
170 {
171
172
173
174
175
176
177
178
179
180
181
186 while (!worklist.
empty())
187 {
189 if (current == target)
190 {
191
192
193
194
195
196
198 }
199 else
200 {
201
202
203
204
205
206
209 {
211 for (
const SVFStmt* stmt : current->getSVFStmts())
212 {
213 if (const auto* store = SVFUtil::dyn_cast<StoreStmt>(stmt))
214 {
219 {
223 {
224
225
226
227
230 else
232 }
233 }
234 }
235 }
236 }
237 std::vector<std::pair<const ICFGNode*, const IntraCFGEdge*>> successors;
238 if (const auto* call = SVFUtil::dyn_cast<CallICFGNode>(current))
239 {
241 if (call->getCalledFunction() &&
243 {
244
245
246
247
248
249
250
251
253 {
256 {
259 {
261 }
262 }
263 }
264 }
265 else
266 {
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
284
285
287 {
289 {
290 if (
const auto*
indirect = SVFUtil::dyn_cast<IndirectSVFGEdge>(
retEdge))
291 {
299 }
300 }
301 }
302
303
305 {
307 {
310 {
311
312
313
315 }
316 else
317 {
318
319
320
321
323 }
324 }
325 }
326 }
327
328
329
330
331
332 successors.emplace_back(
retNode,
nullptr);
333 }
334 else
335 {
336
337
338
339
340
341
343 {
344 if (
const auto*
intra = SVFUtil::dyn_cast<IntraCFGEdge>(
out))
345 successors.emplace_back(
intra->getDstNode(),
intra);
346 }
347 }
348
350 {
354 {
355
356
357
358
359
361 }
363 {
364
365
366
367
368
369
370
371
372
373
374 }
375 else
376 {
377
378
379
380
381
382
385
386
387
388
389
391 else
392
393
394
395
396
397
398
399
400
401
402
404 }
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
421 {
422
423
424
425
426
427 }
429 {
430
431
432
433
434
437 }
438 else
439 {
440
441
442
443
444
447
448
449
450
451
452
454 {
455
456
459 }
460 }
461 }
462 }
463 }
464 }
466}
bool isStrongUpdate(const AddressValue &targets, const AbstractState &state) const
bool isBranchEdgeFeasible(const IntraCFGEdge *edge, AbstractState &as)
bool applyBranchRefinement(const IntraCFGEdge *edge, AbstractState &as)
bool hasAbsState(const ICFGNode *node)
void joinWith(const AbstractState &other)
domain join with other, important! other widen this.
static u32_t getVirtualMemAddress(u32_t idx)
The physical address starts with 0x7f...... + idx.
AddressValue & getAddrs()
bool push(const Data &data)
virtual const FunObjVar * getFun() const
Return the function of this ICFGNode.
const AbstractValue & getAbsValue(const ValVar *var, const ICFGNode *node) override
bool isExtCall(const FunObjVar *fun)