Skip to content

Commit 726ff62

Browse files
committed
Value sets: handle extractbits out of pointers
Tracking will not be precise, but we should not lose pointers that are split up via extractbits and later on pieced together.
1 parent ef4e270 commit 726ff62

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

src/pointer-analysis/value_set.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Author: Daniel Kroening, [email protected]
1212
#include "value_set.h"
1313

1414
#include <util/arith_tools.h>
15+
#include <util/bitvector_expr.h>
1516
#include <util/byte_operators.h>
1617
#include <util/c_types.h>
1718
#include <util/expr_util.h>
@@ -589,8 +590,9 @@ void value_sett::get_value_set_rec(
589590
// pointer-to-pointer -- we just ignore these
590591
get_value_set_rec(op, dest, suffix, original_type, ns);
591592
}
592-
else if(op_type.id()==ID_unsignedbv ||
593-
op_type.id()==ID_signedbv)
593+
else if(
594+
op_type.id() == ID_unsignedbv || op_type.id() == ID_signedbv ||
595+
op_type.id() == ID_bv)
594596
{
595597
// integer-to-pointer
596598

@@ -1028,6 +1030,37 @@ void value_sett::get_value_set_rec(
10281030
get_value_set_rec(
10291031
byte_extract_expr.op(), dest, suffix, original_type, ns);
10301032
}
1033+
else if(auto eb = expr_try_dynamic_cast<extractbits_exprt>(expr))
1034+
{
1035+
object_mapt pointer_expr_set;
1036+
get_value_set_rec(eb->src(), pointer_expr_set, "", eb->src().type(), ns);
1037+
1038+
for(const auto &object_map_entry : pointer_expr_set.read())
1039+
{
1040+
offsett offset = object_map_entry.second;
1041+
1042+
// kill any offset
1043+
offset.reset();
1044+
1045+
insert(dest, object_map_entry.first, offset);
1046+
}
1047+
}
1048+
else if(expr.id() == ID_concatenation)
1049+
{
1050+
object_mapt pointer_expr_set;
1051+
for(const auto &op : expr.operands())
1052+
get_value_set_rec(op, pointer_expr_set, "", original_type, ns);
1053+
1054+
for(const auto &object_map_entry : pointer_expr_set.read())
1055+
{
1056+
offsett offset = object_map_entry.second;
1057+
1058+
// kill any offset
1059+
offset.reset();
1060+
1061+
insert(dest, object_map_entry.first, offset);
1062+
}
1063+
}
10311064
else if(expr.id()==ID_byte_update_little_endian ||
10321065
expr.id()==ID_byte_update_big_endian)
10331066
{

0 commit comments

Comments
 (0)