Skip to content

Commit 1cb7776

Browse files
authored
Merge pull request #7339 from tautschnig/feature/value-set-extractbits
Value sets: handle extractbits out of pointers
2 parents 1f94286 + 3b8fa07 commit 1cb7776

File tree

1 file changed

+35
-3
lines changed

1 file changed

+35
-3
lines changed

src/pointer-analysis/value_set.cpp

Lines changed: 35 additions & 3 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

@@ -1052,9 +1054,39 @@ void value_sett::get_value_set_rec(
10521054
value_set_with_local_definition.get_value_set_rec(
10531055
let_expr.where(), dest, suffix, original_type, ns);
10541056
}
1057+
else if(auto eb = expr_try_dynamic_cast<extractbits_exprt>(expr))
1058+
{
1059+
object_mapt pointer_expr_set;
1060+
get_value_set_rec(eb->src(), pointer_expr_set, "", eb->src().type(), ns);
1061+
1062+
for(const auto &object_map_entry : pointer_expr_set.read())
1063+
{
1064+
offsett offset = object_map_entry.second;
1065+
1066+
// kill any offset
1067+
offset.reset();
1068+
1069+
insert(dest, object_map_entry.first, offset);
1070+
}
1071+
}
10551072
else
10561073
{
1057-
insert(dest, exprt(ID_unknown, original_type));
1074+
object_mapt pointer_expr_set;
1075+
for(const auto &op : expr.operands())
1076+
get_value_set_rec(op, pointer_expr_set, "", original_type, ns);
1077+
1078+
for(const auto &object_map_entry : pointer_expr_set.read())
1079+
{
1080+
offsett offset = object_map_entry.second;
1081+
1082+
// kill any offset
1083+
offset.reset();
1084+
1085+
insert(dest, object_map_entry.first, offset);
1086+
}
1087+
1088+
if(pointer_expr_set.read().empty())
1089+
insert(dest, exprt(ID_unknown, original_type));
10581090
}
10591091

10601092
#ifdef DEBUG

0 commit comments

Comments
 (0)