Skip to content

Commit

Permalink
allow address_of of byte_extract expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Kroening committed Apr 25, 2018
1 parent 0f1482c commit 0b82ee2
Showing 1 changed file with 21 additions and 6 deletions.
27 changes: 21 additions & 6 deletions src/solvers/flattening/bv_pointers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,15 @@ bool bv_pointerst::convert_address_of_rec(
{
// this should be gone
bv=convert_pointer_type(array);
POSTCONDITION(bv.size()==bits);
CHECK_RETURN(bv.size()==bits);
}
else if(array_type.id()==ID_array ||
array_type.id()==ID_incomplete_array ||
array_type.id()==ID_string_constant)
{
if(convert_address_of_rec(array, bv))
return true;
POSTCONDITION(bv.size()==bits);
CHECK_RETURN(bv.size()==bits);
}
else
UNREACHABLE;
Expand All @@ -155,7 +155,22 @@ bool bv_pointerst::convert_address_of_rec(
DATA_INVARIANT(size>0, "array subtype expected to have non-zero size");

offset_arithmetic(bv, size, index);
POSTCONDITION(bv.size()==bits);
CHECK_RETURN(bv.size()==bits);
return false;
}
else if(expr.id()==ID_byte_extract_little_endian ||
expr.id()==ID_byte_extract_big_endian)
{
const auto &byte_extract_expr=to_byte_extract_expr(expr);

// recursive call
if(convert_address_of_rec(byte_extract_expr.op(), bv))
return true;

CHECK_RETURN(bv.size()==bits);

offset_arithmetic(bv, 1, byte_extract_expr.offset());
CHECK_RETURN(bv.size()==bits);
return false;
}
else if(expr.id()==ID_member)
Expand Down Expand Up @@ -296,7 +311,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
return bv;
}

POSTCONDITION(bv.size()==bits);
CHECK_RETURN(bv.size()==bits);
return bv;
}
else if(expr.id()==ID_constant)
Expand Down Expand Up @@ -334,13 +349,13 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
{
count++;
bv=convert_bv(*it);
POSTCONDITION(bv.size()==bits);
CHECK_RETURN(bv.size()==bits);

typet pointer_sub_type=it->type().subtype();
if(pointer_sub_type.id()==ID_empty)
pointer_sub_type=char_type();
size=pointer_offset_size(pointer_sub_type, ns);
POSTCONDITION(size>0);
CHECK_RETURN(size>0);
}
}

Expand Down

0 comments on commit 0b82ee2

Please sign in to comment.