@@ -67,11 +67,17 @@ irep_idt custom_bitvector_domaint::object2id(const exprt &src)
67
67
}
68
68
else if (op.id ()==ID_typecast)
69
69
{
70
- return object2id (dereference_exprt (to_typecast_expr (op).op ()));
70
+ irep_idt op_id=object2id (to_typecast_expr (op).op ());
71
+
72
+ if (op_id.empty ())
73
+ return irep_idt ();
74
+ else
75
+ return ' *' +id2string (op_id);
71
76
}
72
77
else
73
78
{
74
79
irep_idt op_id=object2id (op);
80
+
75
81
if (op_id.empty ())
76
82
return irep_idt ();
77
83
else
@@ -188,9 +194,8 @@ std::set<exprt> custom_bitvector_analysist::aliases(
188
194
std::set<exprt> result;
189
195
190
196
for (const auto &pointer : pointer_set)
191
- {
192
- result.insert (dereference_exprt (pointer));
193
- }
197
+ if (pointer.type ().id ()==ID_pointer)
198
+ result.insert (dereference_exprt (pointer));
194
199
195
200
result.insert (src);
196
201
@@ -300,36 +305,39 @@ void custom_bitvector_domaint::transform(
300
305
301
306
exprt lhs=code_function_call.arguments ()[0 ];
302
307
303
- if (lhs.is_constant () &&
304
- to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
308
+ if (lhs.type ().id ()==ID_pointer)
305
309
{
306
- if (mode==modet::CLEAR_MAY)
310
+ if (lhs.is_constant () &&
311
+ to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
307
312
{
308
- for (auto &bit : may_bits)
309
- clear_bit (bit.second , bit_nr);
310
-
311
- // erase blank ones
312
- erase_blank_vectors (may_bits);
313
+ if (mode==modet::CLEAR_MAY)
314
+ {
315
+ for (auto &bit : may_bits)
316
+ clear_bit (bit.second , bit_nr);
317
+
318
+ // erase blank ones
319
+ erase_blank_vectors (may_bits);
320
+ }
321
+ else if (mode==modet::CLEAR_MUST)
322
+ {
323
+ for (auto &bit : must_bits)
324
+ clear_bit (bit.second , bit_nr);
325
+
326
+ // erase blank ones
327
+ erase_blank_vectors (must_bits);
328
+ }
313
329
}
314
- else if (mode==modet::CLEAR_MUST)
330
+ else
315
331
{
316
- for (auto &bit : must_bits)
317
- clear_bit (bit.second , bit_nr);
318
-
319
- // erase blank ones
320
- erase_blank_vectors (must_bits);
321
- }
322
- }
323
- else
324
- {
325
- dereference_exprt deref (lhs);
332
+ dereference_exprt deref (lhs);
326
333
327
- // may alias other stuff
328
- std::set<exprt> lhs_set=cba.aliases (deref, from);
334
+ // may alias other stuff
335
+ std::set<exprt> lhs_set=cba.aliases (deref, from);
329
336
330
- for (const auto &lhs : lhs_set)
331
- {
332
- set_bit (lhs, bit_nr, mode);
337
+ for (const auto &lhs : lhs_set)
338
+ {
339
+ set_bit (lhs, bit_nr, mode);
340
+ }
333
341
}
334
342
}
335
343
}
@@ -415,40 +423,43 @@ void custom_bitvector_domaint::transform(
415
423
416
424
exprt lhs=instruction.code .op0 ();
417
425
418
- if (lhs.is_constant () &&
419
- to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
426
+ if (lhs.type ().id ()==ID_pointer)
420
427
{
421
- if (mode==modet::CLEAR_MAY)
428
+ if (lhs.is_constant () &&
429
+ to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
422
430
{
423
- for (bitst::iterator b_it=may_bits.begin ();
424
- b_it!=may_bits.end ();
425
- b_it++)
426
- clear_bit (b_it->second , bit_nr);
431
+ if (mode==modet::CLEAR_MAY)
432
+ {
433
+ for (bitst::iterator b_it=may_bits.begin ();
434
+ b_it!=may_bits.end ();
435
+ b_it++)
436
+ clear_bit (b_it->second , bit_nr);
427
437
428
- // erase blank ones
429
- erase_blank_vectors (may_bits);
430
- }
431
- else if (mode==modet::CLEAR_MUST)
432
- {
433
- for (bitst::iterator b_it=must_bits.begin ();
434
- b_it!=must_bits.end ();
435
- b_it++)
436
- clear_bit (b_it->second , bit_nr);
438
+ // erase blank ones
439
+ erase_blank_vectors (may_bits);
440
+ }
441
+ else if (mode==modet::CLEAR_MUST)
442
+ {
443
+ for (bitst::iterator b_it=must_bits.begin ();
444
+ b_it!=must_bits.end ();
445
+ b_it++)
446
+ clear_bit (b_it->second , bit_nr);
437
447
438
- // erase blank ones
439
- erase_blank_vectors (must_bits);
448
+ // erase blank ones
449
+ erase_blank_vectors (must_bits);
450
+ }
440
451
}
441
- }
442
- else
443
- {
444
- dereference_exprt deref (lhs);
452
+ else
453
+ {
454
+ dereference_exprt deref (lhs);
445
455
446
- // may alias other stuff
447
- std::set<exprt> lhs_set=cba.aliases (deref, from);
456
+ // may alias other stuff
457
+ std::set<exprt> lhs_set=cba.aliases (deref, from);
448
458
449
- for (const auto &lhs : lhs_set)
450
- {
451
- set_bit (lhs, bit_nr, mode);
459
+ for (const auto &lhs : lhs_set)
460
+ {
461
+ set_bit (lhs, bit_nr, mode);
462
+ }
452
463
}
453
464
}
454
465
}
@@ -628,6 +639,9 @@ exprt custom_bitvector_domaint::eval(
628
639
629
640
exprt pointer=src.op0 ();
630
641
642
+ if (pointer.type ().id ()!=ID_pointer)
643
+ return src;
644
+
631
645
if (pointer.is_constant () &&
632
646
to_constant_expr (pointer).get_value ()==ID_NULL) // NULL means all
633
647
{
0 commit comments