Skip to content

Commit d6f7f05

Browse files
committed
Indicate if more checks are required for a member expression
via a Boolean return value. For now these more checks are recursive call of check_rec on operands, but other checks may occur in the future.
1 parent 5289c58 commit d6f7f05

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/analyses/goto_check.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,9 @@ class goto_checkt
124124
/// - check all operands of the expression
125125
/// \param member: the expression to be checked
126126
/// \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);
128130

129131
/// Check that a division is valid: check for division by zero, overflow and
130132
/// NaN (for floating point numbers).
@@ -1574,7 +1576,7 @@ void goto_checkt::check_rec_if(const if_exprt &if_expr, guardt &guard)
15741576
}
15751577
}
15761578

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)
15781580
{
15791581
const dereference_exprt &deref = to_dereference_expr(member.struct_op());
15801582

@@ -1583,7 +1585,7 @@ void goto_checkt::check_rec_member(const member_exprt &member, guardt &guard)
15831585
// avoid building the following expressions when pointer_validity_check
15841586
// would return immediately anyway
15851587
if(!enable_pointer_check)
1586-
return;
1588+
return true;
15871589

15881590
// we rewrite s->member into *(s+member_offset)
15891591
// 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)
16091611
new_deref.add_source_location() = deref.source_location();
16101612
pointer_validity_check(new_deref, guard);
16111613

1612-
return;
1614+
return true;
16131615
}
1614-
1615-
for(const auto &operand : member.operands())
1616-
check_rec(operand, guard);
1616+
return false;
16171617
}
16181618

16191619
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)
16711671
expr.id() == ID_member &&
16721672
to_member_expr(expr).struct_op().id() == ID_dereference)
16731673
{
1674-
check_rec_member(to_member_expr(expr), guard);
1675-
return;
1674+
if(check_rec_member(to_member_expr(expr), guard))
1675+
return;
16761676
}
16771677

16781678
forall_operands(it, expr)

0 commit comments

Comments
 (0)