Skip to content

Commit 97c6c55

Browse files
author
Daniel Kroening
authored
Merge pull request #3156 from tautschnig/get_subexpr-interface
Make get_subexpression_at_offset return an exprt for consistency
2 parents 163bc94 + bd5b0a0 commit 97c6c55

File tree

3 files changed

+26
-25
lines changed

3 files changed

+26
-25
lines changed

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -466,18 +466,18 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
466466
if(ns.follow(result.value.type())!=ns.follow(dereference_type))
467467
result.value.make_typecast(dereference_type);
468468
}
469-
else if(get_subexpression_at_offset(
470-
root_object_subexpression,
471-
o.offset(),
472-
dereference_type,
473-
ns))
474-
{
475-
// Successfully found a member, array index, or combination thereof
476-
// that matches the desired type and offset:
477-
result.value=root_object_subexpression;
478-
}
479469
else
480470
{
471+
exprt subexpr = get_subexpression_at_offset(
472+
root_object_subexpression, o.offset(), dereference_type, ns);
473+
if(subexpr.is_not_nil())
474+
{
475+
// Successfully found a member, array index, or combination thereof
476+
// that matches the desired type and offset:
477+
result.value = subexpr;
478+
return result;
479+
}
480+
481481
// we extract something from the root object
482482
result.value=o.root_object();
483483

src/util/pointer_offset_size.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -630,17 +630,18 @@ exprt build_sizeof_expr(
630630
return result;
631631
}
632632

633-
bool get_subexpression_at_offset(
634-
exprt &result,
633+
exprt get_subexpression_at_offset(
634+
const exprt &expr,
635635
mp_integer offset,
636636
const typet &target_type_raw,
637637
const namespacet &ns)
638638
{
639+
exprt result = expr;
639640
const typet &source_type=ns.follow(result.type());
640641
const typet &target_type=ns.follow(target_type_raw);
641642

642643
if(offset==0 && source_type==target_type)
643-
return true;
644+
return result;
644645

645646
if(source_type.id()==ID_struct)
646647
{
@@ -667,7 +668,7 @@ bool get_subexpression_at_offset(
667668
}
668669
++offsets;
669670
}
670-
return false;
671+
return nil_exprt();
671672
}
672673
else if(source_type.id()==ID_array)
673674
{
@@ -678,32 +679,32 @@ bool get_subexpression_at_offset(
678679
auto elem_size = pointer_offset_size(at.subtype(), ns);
679680

680681
if(!elem_size.has_value())
681-
return false;
682+
return nil_exprt();
682683

683684
mp_integer cellidx = offset / (*elem_size);
684685

685686
if(cellidx < 0 || !cellidx.is_long())
686-
return false;
687+
return nil_exprt();
687688

688689
offset = offset % (*elem_size);
689690

690691
result=index_exprt(result, from_integer(cellidx, unsignedbv_typet(64)));
691692
return get_subexpression_at_offset(result, offset, target_type, ns);
692693
}
693694
else
694-
return false;
695+
return nil_exprt();
695696
}
696697

697-
bool get_subexpression_at_offset(
698-
exprt &result,
698+
exprt get_subexpression_at_offset(
699+
const exprt &expr,
699700
const exprt &offset,
700701
const typet &target_type,
701702
const namespacet &ns)
702703
{
703704
mp_integer offset_const;
704705

705706
if(to_integer(offset, offset_const))
706-
return false;
707+
return nil_exprt();
707708
else
708-
return get_subexpression_at_offset(result, offset_const, target_type, ns);
709+
return get_subexpression_at_offset(expr, offset_const, target_type, ns);
709710
}

src/util/pointer_offset_size.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,14 @@ exprt build_sizeof_expr(
7979
const constant_exprt &expr,
8080
const namespacet &ns);
8181

82-
bool get_subexpression_at_offset(
83-
exprt &result,
82+
exprt get_subexpression_at_offset(
83+
const exprt &expr,
8484
mp_integer offset,
8585
const typet &target_type,
8686
const namespacet &ns);
8787

88-
bool get_subexpression_at_offset(
89-
exprt &result,
88+
exprt get_subexpression_at_offset(
89+
const exprt &expr,
9090
const exprt &offset,
9191
const typet &target_type,
9292
const namespacet &ns);

0 commit comments

Comments
 (0)