Skip to content

Commit ad95c7b

Browse files
committed
Add expression lowering to {r,w,rw}_ok
This prepares removal of expression rewriting in the front-end.
1 parent 3e490c9 commit ad95c7b

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

src/ansi-c/goto_check_c.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2032,7 +2032,7 @@ optionalt<exprt> goto_check_ct::expand_pointer_checks(exprt expr)
20322032
{
20332033
const auto &pointer_in_range_expr = to_pointer_in_range_expr(expr);
20342034

2035-
auto expanded = pointer_in_range_expr.lower();
2035+
auto expanded = pointer_in_range_expr.lower(ns);
20362036

20372037
// rec. call
20382038
auto expanded_rec_opt = expand_pointer_checks(expanded);

src/util/pointer_expr.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,25 @@ void dereference_exprt::validate(
227227
"operand");
228228
}
229229

230-
exprt pointer_in_range_exprt::lower() const
230+
exprt r_or_w_ok_exprt::lower(const namespacet &ns) const
231+
{
232+
return conjunction(
233+
{not_exprt{null_object(pointer())},
234+
not_exprt{is_invalid_pointer_exprt{pointer()}},
235+
not_exprt{deallocated(pointer(), ns)},
236+
not_exprt{dead_object(pointer(), ns)},
237+
not_exprt{object_lower_bound(pointer(), nil_exprt())},
238+
not_exprt{object_upper_bound(pointer(), size())}});
239+
}
240+
241+
exprt pointer_in_range_exprt::lower(const namespacet &ns) const
231242
{
232243
return and_exprt(
233244
{same_object(op0(), op1()),
234245
same_object(op1(), op2()),
235246
r_ok_exprt(
236-
op0(), minus_exprt(pointer_offset(op2()), pointer_offset(op0()))),
247+
op0(), minus_exprt(pointer_offset(op2()), pointer_offset(op0())))
248+
.lower(ns),
237249
binary_relation_exprt(pointer_offset(op0()), ID_le, pointer_offset(op1())),
238250
binary_relation_exprt(
239251
pointer_offset(op1()), ID_le, pointer_offset(op2()))});

src/util/pointer_expr.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ class pointer_in_range_exprt : public ternary_exprt
386386
}
387387

388388
// translate into equivalent conjunction
389-
exprt lower() const;
389+
exprt lower(const namespacet &ns) const;
390390
};
391391

392392
template <>
@@ -816,6 +816,10 @@ class r_or_w_ok_exprt : public binary_predicate_exprt
816816
{
817817
return op1();
818818
}
819+
820+
/// Lower an r_or_w_ok_exprt to arithmetic and logic expressions.
821+
/// \return Semantically equivalent expression
822+
exprt lower(const namespacet &ns) const;
819823
};
820824

821825
inline const r_or_w_ok_exprt &to_r_or_w_ok_expr(const exprt &expr)

0 commit comments

Comments
 (0)