@@ -67,11 +67,17 @@ irep_idt custom_bitvector_domaint::object2id(const exprt &src)
6767 }
6868 else if (op.id ()==ID_typecast)
6969 {
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);
7176 }
7277 else
7378 {
7479 irep_idt op_id=object2id (op);
80+
7581 if (op_id.empty ())
7682 return irep_idt ();
7783 else
@@ -188,9 +194,8 @@ std::set<exprt> custom_bitvector_analysist::aliases(
188194 std::set<exprt> result;
189195
190196 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));
194199
195200 result.insert (src);
196201
@@ -300,36 +305,39 @@ void custom_bitvector_domaint::transform(
300305
301306 exprt lhs=code_function_call.arguments ()[0 ];
302307
303- if (lhs.is_constant () &&
304- to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
308+ if (lhs.type ().id ()==ID_pointer)
305309 {
306- if (mode==modet::CLEAR_MAY)
310+ if (lhs.is_constant () &&
311+ to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
307312 {
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+ }
313329 }
314- else if (mode==modet::CLEAR_MUST)
330+ else
315331 {
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);
326333
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);
329336
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+ }
333341 }
334342 }
335343 }
@@ -415,40 +423,43 @@ void custom_bitvector_domaint::transform(
415423
416424 exprt lhs=instruction.code .op0 ();
417425
418- if (lhs.is_constant () &&
419- to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
426+ if (lhs.type ().id ()==ID_pointer)
420427 {
421- if (mode==modet::CLEAR_MAY)
428+ if (lhs.is_constant () &&
429+ to_constant_expr (lhs).get_value ()==ID_NULL) // NULL means all
422430 {
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);
427437
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);
437447
438- // erase blank ones
439- erase_blank_vectors (must_bits);
448+ // erase blank ones
449+ erase_blank_vectors (must_bits);
450+ }
440451 }
441- }
442- else
443- {
444- dereference_exprt deref (lhs);
452+ else
453+ {
454+ dereference_exprt deref (lhs);
445455
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);
448458
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+ }
452463 }
453464 }
454465 }
@@ -628,6 +639,9 @@ exprt custom_bitvector_domaint::eval(
628639
629640 exprt pointer=src.op0 ();
630641
642+ if (pointer.type ().id ()!=ID_pointer)
643+ return src;
644+
631645 if (pointer.is_constant () &&
632646 to_constant_expr (pointer).get_value ()==ID_NULL) // NULL means all
633647 {
0 commit comments