Skip to content

Commit 0b82ee2

Browse files
author
Daniel Kroening
committed
allow address_of of byte_extract expressions
1 parent 0f1482c commit 0b82ee2

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

src/solvers/flattening/bv_pointers.cpp

+21-6
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,15 @@ bool bv_pointerst::convert_address_of_rec(
136136
{
137137
// this should be gone
138138
bv=convert_pointer_type(array);
139-
POSTCONDITION(bv.size()==bits);
139+
CHECK_RETURN(bv.size()==bits);
140140
}
141141
else if(array_type.id()==ID_array ||
142142
array_type.id()==ID_incomplete_array ||
143143
array_type.id()==ID_string_constant)
144144
{
145145
if(convert_address_of_rec(array, bv))
146146
return true;
147-
POSTCONDITION(bv.size()==bits);
147+
CHECK_RETURN(bv.size()==bits);
148148
}
149149
else
150150
UNREACHABLE;
@@ -155,7 +155,22 @@ bool bv_pointerst::convert_address_of_rec(
155155
DATA_INVARIANT(size>0, "array subtype expected to have non-zero size");
156156

157157
offset_arithmetic(bv, size, index);
158-
POSTCONDITION(bv.size()==bits);
158+
CHECK_RETURN(bv.size()==bits);
159+
return false;
160+
}
161+
else if(expr.id()==ID_byte_extract_little_endian ||
162+
expr.id()==ID_byte_extract_big_endian)
163+
{
164+
const auto &byte_extract_expr=to_byte_extract_expr(expr);
165+
166+
// recursive call
167+
if(convert_address_of_rec(byte_extract_expr.op(), bv))
168+
return true;
169+
170+
CHECK_RETURN(bv.size()==bits);
171+
172+
offset_arithmetic(bv, 1, byte_extract_expr.offset());
173+
CHECK_RETURN(bv.size()==bits);
159174
return false;
160175
}
161176
else if(expr.id()==ID_member)
@@ -296,7 +311,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
296311
return bv;
297312
}
298313

299-
POSTCONDITION(bv.size()==bits);
314+
CHECK_RETURN(bv.size()==bits);
300315
return bv;
301316
}
302317
else if(expr.id()==ID_constant)
@@ -334,13 +349,13 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
334349
{
335350
count++;
336351
bv=convert_bv(*it);
337-
POSTCONDITION(bv.size()==bits);
352+
CHECK_RETURN(bv.size()==bits);
338353

339354
typet pointer_sub_type=it->type().subtype();
340355
if(pointer_sub_type.id()==ID_empty)
341356
pointer_sub_type=char_type();
342357
size=pointer_offset_size(pointer_sub_type, ns);
343-
POSTCONDITION(size>0);
358+
CHECK_RETURN(size>0);
344359
}
345360
}
346361

0 commit comments

Comments
 (0)