Skip to content

Commit 62fe0a1

Browse files
committed
Make get_subexpression_at_offset return an exprt for consistency
All other functions declared in that block in pointer_offset_size.h return an exprt and the comment explicitly states that they return nil_exprt() on failure. get_subexpression_at_offset used to return "true" on success (and false on failure), which is the opposite of what most of the code base does. (But the interpretation of true/false as return values is non-obvious anyway and thus returning an expression adds clarity.)
1 parent af04748 commit 62fe0a1

File tree

3 files changed

+27
-25
lines changed

3 files changed

+27
-25
lines changed

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -529,18 +529,18 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
529529
if(ns.follow(result.value.type())!=ns.follow(dereference_type))
530530
result.value.make_typecast(dereference_type);
531531
}
532-
else if(get_subexpression_at_offset(
533-
root_object_subexpression,
534-
o.offset(),
535-
dereference_type,
536-
ns))
537-
{
538-
// Successfully found a member, array index, or combination thereof
539-
// that matches the desired type and offset:
540-
result.value=root_object_subexpression;
541-
}
542532
else
543533
{
534+
exprt subexpr = get_subexpression_at_offset(
535+
root_object_subexpression, o.offset(), dereference_type, ns);
536+
if(subexpr.is_not_nil())
537+
{
538+
// Successfully found a member, array index, or combination thereof
539+
// that matches the desired type and offset:
540+
result.value = subexpr;
541+
return result;
542+
}
543+
544544
// we extract something from the root object
545545
result.value=o.root_object();
546546

src/util/pointer_offset_size.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -621,17 +621,18 @@ exprt build_sizeof_expr(
621621
return result;
622622
}
623623

624-
bool get_subexpression_at_offset(
625-
exprt &result,
624+
exprt get_subexpression_at_offset(
625+
const exprt &expr,
626626
mp_integer offset,
627627
const typet &target_type_raw,
628628
const namespacet &ns)
629629
{
630+
exprt result = expr;
630631
const typet &source_type=ns.follow(result.type());
631632
const typet &target_type=ns.follow(target_type_raw);
632633

633634
if(offset==0 && source_type==target_type)
634-
return true;
635+
return result;
635636

636637
if(source_type.id()==ID_struct)
637638
{
@@ -658,7 +659,7 @@ bool get_subexpression_at_offset(
658659
}
659660
++offsets;
660661
}
661-
return false;
662+
return nil_exprt();
662663
}
663664
else if(source_type.id()==ID_array)
664665
{
@@ -667,26 +668,27 @@ bool get_subexpression_at_offset(
667668
const auto &at=to_array_type(source_type);
668669
mp_integer elem_size=pointer_offset_size(at.subtype(), ns);
669670
if(elem_size==-1)
670-
return false;
671+
return nil_exprt();
671672
mp_integer cellidx=offset/elem_size;
672673
if(cellidx < 0 || !cellidx.is_long())
673-
return false;
674+
return nil_exprt();
674675
offset=offset%elem_size;
675676
result=index_exprt(result, from_integer(cellidx, unsignedbv_typet(64)));
676677
return get_subexpression_at_offset(result, offset, target_type, ns);
677678
}
678679
else
679-
return false;
680+
return nil_exprt();
680681
}
681682

682-
bool get_subexpression_at_offset(
683-
exprt &result,
683+
exprt get_subexpression_at_offset(
684+
const exprt &expr,
684685
const exprt &offset,
685686
const typet &target_type,
686687
const namespacet &ns)
687688
{
688689
mp_integer offset_const;
689690
if(to_integer(offset, offset_const))
690-
return false;
691-
return get_subexpression_at_offset(result, offset_const, target_type, ns);
691+
return nil_exprt();
692+
693+
return get_subexpression_at_offset(expr, offset_const, target_type, ns);
692694
}

src/util/pointer_offset_size.h

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

84-
bool get_subexpression_at_offset(
85-
exprt &result,
84+
exprt get_subexpression_at_offset(
85+
const exprt &expr,
8686
mp_integer offset,
8787
const typet &target_type,
8888
const namespacet &ns);
8989

90-
bool get_subexpression_at_offset(
91-
exprt &result,
90+
exprt get_subexpression_at_offset(
91+
const exprt &expr,
9292
const exprt &offset,
9393
const typet &target_type,
9494
const namespacet &ns);

0 commit comments

Comments
 (0)