Skip to content

Commit 91e6220

Browse files
authored
Merge pull request #6833 from diffblue/pointer_logic_object
pointer_logic: use mp_integer for numbering objects
2 parents e6dfe72 + c89b4f4 commit 91e6220

File tree

5 files changed

+23
-29
lines changed

5 files changed

+23
-29
lines changed

src/solvers/flattening/bv_pointers.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -816,18 +816,14 @@ exprt bv_pointerst::bv_get_rec(
816816
bvrep, pointer_logic.pointer_expr(pointer, pt)};
817817
}
818818

819-
bvt bv_pointerst::encode(std::size_t addr, const pointer_typet &type) const
819+
bvt bv_pointerst::encode(const mp_integer &addr, const pointer_typet &type)
820+
const
820821
{
821822
const std::size_t offset_bits = get_offset_width(type);
822823
const std::size_t object_bits = get_object_width(type);
823824

824825
bvt zero_offset(offset_bits, const_literal(false));
825-
826-
// set variable part
827-
bvt object;
828-
object.reserve(object_bits);
829-
for(std::size_t i=0; i<object_bits; i++)
830-
object.push_back(const_literal((addr & (std::size_t(1) << i)) != 0));
826+
bvt object = bv_utils.build_constant(addr, object_bits);
831827

832828
return object_offset_encoding(object, zero_offset);
833829
}
@@ -889,7 +885,7 @@ bvt bv_pointerst::offset_arithmetic(
889885

890886
bvt bv_pointerst::add_addr(const exprt &expr)
891887
{
892-
std::size_t a=pointer_logic.add_object(expr);
888+
const auto a = pointer_logic.add_object(expr);
893889

894890
const pointer_typet type = pointer_type(expr.type());
895891
const std::size_t object_bits = get_object_width(type);

src/solvers/flattening/bv_pointers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class bv_pointerst:public boolbvt
4040
typedef boolbvt SUB;
4141

4242
NODISCARD
43-
bvt encode(std::size_t object, const pointer_typet &) const;
43+
bvt encode(const mp_integer &object, const pointer_typet &) const;
4444

4545
virtual bvt convert_pointer_type(const exprt &);
4646

src/solvers/flattening/pointer_logic.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,17 @@ bool pointer_logict::is_dynamic_object(const exprt &expr) const
3131
SYMEX_DYNAMIC_PREFIX));
3232
}
3333

34-
void pointer_logict::get_dynamic_objects(std::vector<std::size_t> &o) const
34+
void pointer_logict::get_dynamic_objects(std::vector<mp_integer> &o) const
3535
{
3636
o.clear();
37-
std::size_t nr=0;
37+
mp_integer nr = 0;
3838

3939
for(auto it = objects.cbegin(); it != objects.cend(); ++it, ++nr)
4040
if(is_dynamic_object(*it))
4141
o.push_back(nr);
4242
}
4343

44-
std::size_t pointer_logict::add_object(const exprt &expr)
44+
mp_integer pointer_logict::add_object(const exprt &expr)
4545
{
4646
// remove any index/member
4747

@@ -58,11 +58,10 @@ std::size_t pointer_logict::add_object(const exprt &expr)
5858
}
5959

6060
exprt pointer_logict::pointer_expr(
61-
std::size_t object,
61+
const mp_integer &object,
6262
const pointer_typet &type) const
6363
{
64-
pointert pointer(object, 0);
65-
return pointer_expr(pointer, type);
64+
return pointer_expr({object, 0}, type);
6665
}
6766

6867
exprt pointer_logict::pointer_expr(
@@ -89,10 +88,11 @@ exprt pointer_logict::pointer_expr(
8988

9089
if(pointer.object>=objects.size())
9190
{
92-
return constant_exprt("INVALID-" + std::to_string(pointer.object), type);
91+
return constant_exprt("INVALID-" + integer2string(pointer.object), type);
9392
}
9493

95-
const exprt &object_expr=objects[pointer.object];
94+
const exprt &object_expr =
95+
objects[numeric_cast_v<std::size_t>(pointer.object)];
9696

9797
typet subtype = type.base_type();
9898
// This is a gcc extension.

src/solvers/flattening/pointer_logic.h

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ class pointer_logict
2727

2828
struct pointert
2929
{
30-
std::size_t object;
31-
mp_integer offset;
30+
mp_integer object, offset;
3231

3332
pointert()
3433
{
3534
}
3635

37-
pointert(std::size_t _obj, mp_integer _off):object(_obj), offset(_off)
36+
pointert(mp_integer _obj, mp_integer _off)
37+
: object(std::move(_obj)), offset(std::move(_off))
3838
{
3939
}
4040
};
@@ -45,34 +45,32 @@ class pointer_logict
4545
const pointer_typet &type) const;
4646

4747
/// Convert an (object,0) pair to an expression
48-
exprt pointer_expr(
49-
std::size_t object,
50-
const pointer_typet &type) const;
48+
exprt pointer_expr(const mp_integer &object, const pointer_typet &type) const;
5149

5250
~pointer_logict();
5351
explicit pointer_logict(const namespacet &_ns);
5452

55-
std::size_t add_object(const exprt &expr);
53+
mp_integer add_object(const exprt &expr);
5654

5755
/// \return number of NULL object
58-
std::size_t get_null_object() const
56+
const mp_integer &get_null_object() const
5957
{
6058
return null_object;
6159
}
6260

6361
/// \return number of INVALID object
64-
std::size_t get_invalid_object() const
62+
const mp_integer &get_invalid_object() const
6563
{
6664
return invalid_object;
6765
}
6866

6967
bool is_dynamic_object(const exprt &expr) const;
7068

71-
void get_dynamic_objects(std::vector<std::size_t> &objects) const;
69+
void get_dynamic_objects(std::vector<mp_integer> &objects) const;
7270

7371
protected:
7472
const namespacet &ns;
75-
std::size_t null_object, invalid_object;
73+
mp_integer null_object, invalid_object;
7674
};
7775

7876
#endif // CPROVER_SOLVERS_FLATTENING_POINTER_LOGIC_H

src/solvers/smt2/smt2_conv.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3153,7 +3153,7 @@ void smt2_convt::convert_mod(const mod_exprt &expr)
31533153

31543154
void smt2_convt::convert_is_dynamic_object(const unary_exprt &expr)
31553155
{
3156-
std::vector<std::size_t> dynamic_objects;
3156+
std::vector<mp_integer> dynamic_objects;
31573157
pointer_logic.get_dynamic_objects(dynamic_objects);
31583158

31593159
if(dynamic_objects.empty())

0 commit comments

Comments
 (0)