@@ -124,7 +124,9 @@ class goto_checkt
124
124
// / - check all operands of the expression
125
125
// / \param member: the expression to be checked
126
126
// / \param guard: the condition for the check (unmodified here)
127
- void check_rec_member (const member_exprt &member, guardt &guard);
127
+ // / \return true if no more checks are required for \p member or its
128
+ // / sub-expressions
129
+ bool check_rec_member (const member_exprt &member, guardt &guard);
128
130
129
131
// / Check that a division is valid: check for division by zero, overflow and
130
132
// / NaN (for floating point numbers).
@@ -1574,7 +1576,7 @@ void goto_checkt::check_rec_if(const if_exprt &if_expr, guardt &guard)
1574
1576
}
1575
1577
}
1576
1578
1577
- void goto_checkt::check_rec_member (const member_exprt &member, guardt &guard)
1579
+ bool goto_checkt::check_rec_member (const member_exprt &member, guardt &guard)
1578
1580
{
1579
1581
const dereference_exprt &deref = to_dereference_expr (member.struct_op ());
1580
1582
@@ -1583,7 +1585,7 @@ void goto_checkt::check_rec_member(const member_exprt &member, guardt &guard)
1583
1585
// avoid building the following expressions when pointer_validity_check
1584
1586
// would return immediately anyway
1585
1587
if (!enable_pointer_check)
1586
- return ;
1588
+ return true ;
1587
1589
1588
1590
// we rewrite s->member into *(s+member_offset)
1589
1591
// to avoid requiring memory safety of the entire struct
@@ -1609,11 +1611,9 @@ void goto_checkt::check_rec_member(const member_exprt &member, guardt &guard)
1609
1611
new_deref.add_source_location () = deref.source_location ();
1610
1612
pointer_validity_check (new_deref, guard);
1611
1613
1612
- return ;
1614
+ return true ;
1613
1615
}
1614
-
1615
- for (const auto &operand : member.operands ())
1616
- check_rec (operand, guard);
1616
+ return false ;
1617
1617
}
1618
1618
1619
1619
void goto_checkt::check_rec_div (const div_exprt &div_expr, guardt &guard)
@@ -1671,8 +1671,8 @@ void goto_checkt::check_rec(const exprt &expr, guardt &guard)
1671
1671
expr.id () == ID_member &&
1672
1672
to_member_expr (expr).struct_op ().id () == ID_dereference)
1673
1673
{
1674
- check_rec_member (to_member_expr (expr), guard);
1675
- return ;
1674
+ if ( check_rec_member (to_member_expr (expr), guard))
1675
+ return ;
1676
1676
}
1677
1677
1678
1678
forall_operands (it, expr)
0 commit comments