Skip to content

Commit ff830f9

Browse files
committed
numbered pointers for pointer->int
1 parent 87b6534 commit ff830f9

File tree

10 files changed

+31
-15
lines changed

10 files changed

+31
-15
lines changed

regression/cbmc/Malloc15/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
main.i
33
--32
44
^EXIT=0$

regression/cbmc/Pointer_array4/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE
1+
KNOWNBUG
22
main.i
33
--32
44
^EXIT=0$

regression/cbmc/printf1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG broken-smt-backend
1+
CORE broken-smt-backend
22
main.c
33
--trace
44
^EXIT=10$

regression/cbmc/trace-strings/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
main.c
33
--trace
44
^EXIT=10$

regression/cbmc/trace-values/trace-values.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG broken-smt-backend
1+
CORE broken-smt-backend
22
trace-values.c
33
--trace
44
^EXIT=10$

regression/cbmc/trace-values/unbounded_array.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG broken-smt-backend
1+
CORE broken-smt-backend
22
unbounded_array.c
33
--trace
44
\{ \[0u?l?l?\]=1, \[1u?l?l?\]=2, \[\d+u?l?l?\]=42 \}

regression/cbmc/trace_address_arithmetic1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
main.c
33
--trace
44
^EXIT=10$

src/goto-programs/goto_trace.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,8 @@ std::string trace_numeric_value(
246246
{
247247
const auto &annotated_pointer_constant =
248248
to_annotated_pointer_constant_expr(expr);
249-
auto width = to_pointer_type(expr.type()).get_width();
249+
// pointers use double-width
250+
auto width = 2 * to_pointer_type(expr.type()).get_width();
250251
auto &value = annotated_pointer_constant.get_value();
251252
auto c = constant_exprt(value, unsignedbv_typet(width));
252253
return numeric_representation(c, ns, options);

src/solvers/flattening/bv_pointers.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -729,17 +729,28 @@ bvt bv_pointerst::convert_bitvector(const exprt &expr)
729729
expr.id() == ID_typecast &&
730730
to_typecast_expr(expr).op().type().id() == ID_pointer)
731731
{
732-
// pointer to int
733-
bvt op0 = convert_pointer_type(to_typecast_expr(expr).op());
732+
// Pointer to int.
733+
// We special-case NULL, which should always yield 0.
734+
// Otherwise, we 'number' these.
735+
const auto &pointer_expr = to_typecast_expr(expr).op();
736+
const bvt pointer_bv = convert_pointer_type(pointer_expr);
737+
const auto is_null = bv_utils.is_zero(pointer_bv);
738+
const auto target_width = boolbv_width(expr.type());
739+
740+
if(target_width == 0)
741+
return conversion_failed(expr);
734742

735-
// squeeze it in!
743+
if(numbered_pointers.empty())
744+
numbered_pointers.emplace_back(bvt{});
736745

737-
std::size_t width=boolbv_width(expr.type());
746+
const auto number = numbered_pointers.size();
738747

739-
if(width==0)
740-
return conversion_failed(expr);
748+
numbered_pointers.push_back(pointer_bv);
741749

742-
return bv_utils.zero_extension(op0, width);
750+
return bv_utils.select(
751+
is_null,
752+
bv_utils.zeros(target_width),
753+
bv_utils.build_constant(number, target_width));
743754
}
744755
else if(expr.id() == ID_object_address)
745756
{

src/solvers/flattening/bv_pointers.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ class bv_pointerst:public boolbvt
108108
/// \param offset: Encoded offset
109109
/// \return Pointer encoding
110110
static bvt object_offset_encoding(const bvt &object, const bvt &offset);
111+
112+
/// Table that maps a 'pointer number' to its full-width bit-vector.
113+
/// Used for conversion of pointers to integers.
114+
std::vector<bvt> numbered_pointers;
111115
};
112116

113117
#endif // CPROVER_SOLVERS_FLATTENING_BV_POINTERS_H

0 commit comments

Comments
 (0)