@@ -128,21 +128,20 @@ literalt bv_pointerst::convert_rest(const exprt &expr)
128
128
if (!bv.empty ())
129
129
{
130
130
const pointer_typet &type = to_pointer_type (operands[0 ].type ());
131
+ bvt object_bv = object_literals (bv, type);
131
132
132
- bvt invalid_bv = encode (pointer_logic.get_invalid_object (), type);
133
+ bvt invalid_bv = object_literals (
134
+ encode (pointer_logic.get_invalid_object (), type), type);
133
135
134
136
const std::size_t object_bits =
135
137
bv_pointers_width.get_object_width (type);
136
- const std::size_t offset_bits =
137
- bv_pointers_width.get_offset_width (type);
138
138
139
139
bvt equal_invalid_bv;
140
- equal_invalid_bv.resize (object_bits);
140
+ equal_invalid_bv.reserve (object_bits);
141
141
142
142
for (std::size_t i=0 ; i<object_bits; i++)
143
143
{
144
- equal_invalid_bv[i]=prop.lequal (bv[offset_bits+i],
145
- invalid_bv[offset_bits+i]);
144
+ equal_invalid_bv.push_back (prop.lequal (object_bv[i], invalid_bv[i]));
146
145
}
147
146
148
147
return prop.land (equal_invalid_bv);
@@ -601,20 +600,18 @@ bvt bv_pointerst::convert_bitvector(const exprt &expr)
601
600
expr.id () == ID_pointer_offset &&
602
601
to_unary_expr (expr).op ().type ().id () == ID_pointer)
603
602
{
604
- const exprt &op0 = to_unary_expr (expr).op ();
605
- bvt op0_bv = convert_bv (op0);
606
-
607
603
std::size_t width=boolbv_width (expr.type ());
608
604
609
605
if (width==0 )
610
606
return conversion_failed (expr);
611
607
612
- // we need to strip off the object part
613
- op0_bv.resize (
614
- bv_pointers_width.get_offset_width (to_pointer_type (op0.type ())));
608
+ const exprt &op0 = to_unary_expr (expr).op ();
609
+ const bvt &op0_bv = convert_bv (op0);
610
+
611
+ bvt offset_bv = offset_literals (op0_bv, to_pointer_type (op0.type ()));
615
612
616
613
// we do a sign extension to permit negative offsets
617
- return bv_utils.sign_extension (op0_bv , width);
614
+ return bv_utils.sign_extension (offset_bv , width);
618
615
}
619
616
else if (
620
617
expr.id () == ID_object_size &&
@@ -641,22 +638,17 @@ bvt bv_pointerst::convert_bitvector(const exprt &expr)
641
638
expr.id () == ID_pointer_object &&
642
639
to_unary_expr (expr).op ().type ().id () == ID_pointer)
643
640
{
644
- const exprt &op0 = to_unary_expr (expr).op ();
645
- bvt op0_bv = convert_bv (op0);
646
-
647
641
std::size_t width=boolbv_width (expr.type ());
648
642
649
643
if (width==0 )
650
644
return conversion_failed (expr);
651
645
652
- // erase offset bits
646
+ const exprt &op0 = to_unary_expr (expr).op ();
647
+ const bvt &op0_bv = convert_bv (op0);
653
648
654
- op0_bv.erase (
655
- op0_bv.begin () + 0 ,
656
- op0_bv.begin () +
657
- bv_pointers_width.get_offset_width (to_pointer_type (op0.type ())));
649
+ bvt object_bv = object_literals (op0_bv, to_pointer_type (op0.type ()));
658
650
659
- return bv_utils.zero_extension (op0_bv , width);
651
+ return bv_utils.zero_extension (object_bv , width);
660
652
}
661
653
else if (
662
654
expr.id () == ID_typecast &&
@@ -678,42 +670,47 @@ bvt bv_pointerst::convert_bitvector(const exprt &expr)
678
670
return SUB::convert_bitvector (expr);
679
671
}
680
672
681
- exprt bv_pointerst::bv_get_rec (
682
- const exprt &expr,
683
- const bvt &bv,
684
- std::size_t offset,
685
- const typet &type) const
673
+ static std::string bits_to_string (const propt &prop, const bvt &bv)
686
674
{
687
- if (type.id ()!=ID_pointer)
688
- return SUB::bv_get_rec (expr, bv, offset, type);
675
+ std::string result;
689
676
690
- std::string value_addr, value_offset, value;
691
-
692
- const std::size_t bits = boolbv_width (to_pointer_type (type));
693
- const std::size_t offset_bits =
694
- bv_pointers_width.get_offset_width (to_pointer_type (type));
695
- for (std::size_t i=0 ; i<bits; i++)
677
+ for (const auto &literal : bv)
696
678
{
697
679
char ch=0 ;
698
- std::size_t bit_nr=i+offset;
699
680
700
681
// clang-format off
701
- switch (prop.l_get (bv[bit_nr] ).get_value ())
682
+ switch (prop.l_get (literal ).get_value ())
702
683
{
703
684
case tvt::tv_enumt::TV_FALSE: ch = ' 0' ; break ;
704
685
case tvt::tv_enumt::TV_TRUE: ch = ' 1' ; break ;
705
686
case tvt::tv_enumt::TV_UNKNOWN: ch = ' 0' ; break ;
706
687
}
707
688
// clang-format on
708
689
709
- value=ch+value;
710
-
711
- if (i<offset_bits)
712
- value_offset=ch+value_offset;
713
- else
714
- value_addr=ch+value_addr;
690
+ result = ch + result;
715
691
}
716
692
693
+ return result;
694
+ }
695
+
696
+ exprt bv_pointerst::bv_get_rec (
697
+ const exprt &expr,
698
+ const bvt &bv,
699
+ std::size_t offset,
700
+ const typet &type) const
701
+ {
702
+ if (type.id () != ID_pointer)
703
+ return SUB::bv_get_rec (expr, bv, offset, type);
704
+
705
+ const pointer_typet &pt = to_pointer_type (type);
706
+ const std::size_t bits = boolbv_width (pt);
707
+ bvt value_bv (bv.begin () + offset, bv.begin () + offset + bits);
708
+
709
+ std::string value = bits_to_string (prop, value_bv);
710
+ std::string value_addr = bits_to_string (prop, object_literals (value_bv, pt));
711
+ std::string value_offset =
712
+ bits_to_string (prop, offset_literals (value_bv, pt));
713
+
717
714
// we treat these like bit-vector constants, but with
718
715
// some additional annotation
719
716
@@ -729,8 +726,7 @@ exprt bv_pointerst::bv_get_rec(
729
726
pointer.offset =binary2integer (value_offset, true );
730
727
731
728
// we add the elaborated expression as operand
732
- result.copy_to_operands (
733
- pointer_logic.pointer_expr (pointer, to_pointer_type (type)));
729
+ result.copy_to_operands (pointer_logic.pointer_expr (pointer, pt));
734
730
735
731
return std::move (result);
736
732
}
@@ -740,18 +736,15 @@ bvt bv_pointerst::encode(std::size_t addr, const pointer_typet &type) const
740
736
const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
741
737
const std::size_t object_bits = bv_pointers_width.get_object_width (type);
742
738
743
- bvt bv;
744
- bv.reserve (boolbv_width (type));
745
-
746
- // set offset to zero
747
- for (std::size_t i=0 ; i<offset_bits; i++)
748
- bv.push_back (const_literal (false ));
739
+ bvt zero_offset (offset_bits, const_literal (false ));
749
740
750
741
// set variable part
742
+ bvt object;
743
+ object.reserve (object_bits);
751
744
for (std::size_t i=0 ; i<object_bits; i++)
752
- bv .push_back (const_literal ((addr & (std::size_t (1 ) << i)) != 0 ));
745
+ object .push_back (const_literal ((addr & (std::size_t (1 ) << i)) != 0 ));
753
746
754
- return bv ;
747
+ return object_offset_encoding (object, zero_offset) ;
755
748
}
756
749
757
750
bvt bv_pointerst::offset_arithmetic (
@@ -761,19 +754,13 @@ bvt bv_pointerst::offset_arithmetic(
761
754
{
762
755
const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
763
756
764
- bvt bv1=bv;
765
- bv1.resize (offset_bits); // strip down
757
+ bvt bv1 = offset_literals (bv, type);
766
758
767
759
bvt bv2=bv_utils.build_constant (x, offset_bits);
768
760
769
761
bvt tmp=bv_utils.add (bv1, bv2);
770
762
771
- // copy offset bits
772
- bvt result = bv;
773
- for (std::size_t i=0 ; i<offset_bits; i++)
774
- result[i] = tmp[i];
775
-
776
- return result;
763
+ return object_offset_encoding (object_literals (bv, type), tmp);
777
764
}
778
765
779
766
bvt bv_pointerst::offset_arithmetic (
@@ -810,17 +797,14 @@ bvt bv_pointerst::offset_arithmetic(
810
797
bv_index=bv_utils.unsigned_multiplier (index , bv_factor);
811
798
}
812
799
813
- bv_index=bv_utils.zero_extension (bv_index, bv.size ());
800
+ const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
801
+ bv_index = bv_utils.zero_extension (bv_index, offset_bits);
814
802
815
- bvt bv_tmp=bv_utils. add (bv, bv_index );
803
+ bvt offset_bv = offset_literals (bv, type );
816
804
817
- // copy lower parts of result
818
- bvt result = bv;
819
- const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
820
- for (std::size_t i=0 ; i<offset_bits; i++)
821
- result[i] = bv_tmp[i];
805
+ bvt bv_tmp = bv_utils.add (offset_bv, bv_index);
822
806
823
- return result ;
807
+ return object_offset_encoding ( object_literals (bv, type), bv_tmp) ;
824
808
}
825
809
826
810
bvt bv_pointerst::add_addr (const exprt &expr)
@@ -846,9 +830,8 @@ void bv_pointerst::do_postponed(
846
830
{
847
831
if (postponed.expr .id () == ID_is_dynamic_object)
848
832
{
849
- const std::size_t offset_bits = bv_pointers_width.get_offset_width (
850
- to_pointer_type (to_unary_expr (postponed.expr ).op ().type ()));
851
-
833
+ const auto &type =
834
+ to_pointer_type (to_unary_expr (postponed.expr ).op ().type ());
852
835
const auto &objects = pointer_logic.objects ;
853
836
std::size_t number=0 ;
854
837
@@ -860,12 +843,9 @@ void bv_pointerst::do_postponed(
860
843
861
844
// only compare object part
862
845
pointer_typet pt = pointer_type (expr.type ());
863
- bvt bv = encode (number, pt);
864
-
865
- bv.erase (bv.begin (), bv.begin ()+offset_bits);
846
+ bvt bv = object_literals (encode (number, pt), type);
866
847
867
- bvt saved_bv=postponed.op ;
868
- saved_bv.erase (saved_bv.begin (), saved_bv.begin ()+offset_bits);
848
+ bvt saved_bv = object_literals (postponed.op , type);
869
849
870
850
POSTCONDITION (bv.size ()==saved_bv.size ());
871
851
PRECONDITION (postponed.bv .size ()==1 );
@@ -881,9 +861,8 @@ void bv_pointerst::do_postponed(
881
861
}
882
862
else if (postponed.expr .id ()==ID_object_size)
883
863
{
884
- const std::size_t offset_bits = bv_pointers_width.get_offset_width (
885
- to_pointer_type (to_unary_expr (postponed.expr ).op ().type ()));
886
-
864
+ const auto &type =
865
+ to_pointer_type (to_unary_expr (postponed.expr ).op ().type ());
887
866
const auto &objects = pointer_logic.objects ;
888
867
std::size_t number=0 ;
889
868
@@ -904,12 +883,9 @@ void bv_pointerst::do_postponed(
904
883
905
884
// only compare object part
906
885
pointer_typet pt = pointer_type (expr.type ());
907
- bvt bv = encode (number, pt);
908
-
909
- bv.erase (bv.begin (), bv.begin ()+offset_bits);
886
+ bvt bv = object_literals (encode (number, pt), type);
910
887
911
- bvt saved_bv=postponed.op ;
912
- saved_bv.erase (saved_bv.begin (), saved_bv.begin ()+offset_bits);
888
+ bvt saved_bv = object_literals (postponed.op , type);
913
889
914
890
bvt size_bv = convert_bv (object_size);
915
891
0 commit comments