Skip to content

Commit d9e3eb5

Browse files
authored
Merge pull request #7119 from diffblue/two_pointer_predicates
add __CPROVER_live_object and __CPROVER_writeable_object
2 parents 4ec09df + c22c61d commit d9e3eb5

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

src/util/irep_ids.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,8 @@ IREP_ID_ONE(dynamic_object)
455455
IREP_ID_TWO(C_dynamic, #dynamic)
456456
IREP_ID_ONE(object_size)
457457
IREP_ID_ONE(good_pointer)
458+
IREP_ID_ONE(live_object)
459+
IREP_ID_ONE(writeable_object)
458460
IREP_ID_ONE(integer_address)
459461
IREP_ID_ONE(integer_address_object)
460462
IREP_ID_TWO(null_object, NULL-object)

src/util/pointer_expr.h

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,4 +1059,115 @@ inline void validate_expr(const object_size_exprt &value)
10591059
"Object size expression must have pointer typed operand.");
10601060
}
10611061

1062+
/// A predicate that indicates that the object pointed to is live
1063+
class live_object_exprt : public unary_predicate_exprt
1064+
{
1065+
public:
1066+
explicit live_object_exprt(exprt pointer)
1067+
: unary_predicate_exprt(ID_live_object, std::move(pointer))
1068+
{
1069+
PRECONDITION(as_const(*this).pointer().type().id() == ID_pointer);
1070+
}
1071+
1072+
exprt &pointer()
1073+
{
1074+
return op0();
1075+
}
1076+
1077+
const exprt &pointer() const
1078+
{
1079+
return op0();
1080+
}
1081+
};
1082+
1083+
template <>
1084+
inline bool can_cast_expr<live_object_exprt>(const exprt &base)
1085+
{
1086+
return base.id() == ID_live_object;
1087+
}
1088+
1089+
inline void validate_expr(const live_object_exprt &value)
1090+
{
1091+
validate_operands(value, 1, "live_object must have one operand");
1092+
}
1093+
1094+
/// \brief Cast an exprt to a \ref live_object_exprt
1095+
///
1096+
/// \a expr must be known to be \ref live_object_exprt.
1097+
///
1098+
/// \param expr: Source expression
1099+
/// \return Object of type \ref live_object_exprt
1100+
inline const live_object_exprt &to_live_object_expr(const exprt &expr)
1101+
{
1102+
PRECONDITION(expr.id() == ID_live_object);
1103+
const live_object_exprt &ret = static_cast<const live_object_exprt &>(expr);
1104+
validate_expr(ret);
1105+
return ret;
1106+
}
1107+
1108+
/// \copydoc to_live_object_expr(const exprt &)
1109+
inline live_object_exprt &to_live_object_expr(exprt &expr)
1110+
{
1111+
PRECONDITION(expr.id() == ID_live_object);
1112+
live_object_exprt &ret = static_cast<live_object_exprt &>(expr);
1113+
validate_expr(ret);
1114+
return ret;
1115+
}
1116+
1117+
/// A predicate that indicates that the object pointed to is writeable
1118+
class writeable_object_exprt : public unary_predicate_exprt
1119+
{
1120+
public:
1121+
explicit writeable_object_exprt(exprt pointer)
1122+
: unary_predicate_exprt(ID_writeable_object, std::move(pointer))
1123+
{
1124+
PRECONDITION(as_const(*this).pointer().type().id() == ID_pointer);
1125+
}
1126+
1127+
exprt &pointer()
1128+
{
1129+
return op0();
1130+
}
1131+
1132+
const exprt &pointer() const
1133+
{
1134+
return op0();
1135+
}
1136+
};
1137+
1138+
template <>
1139+
inline bool can_cast_expr<writeable_object_exprt>(const exprt &base)
1140+
{
1141+
return base.id() == ID_writeable_object;
1142+
}
1143+
1144+
inline void validate_expr(const writeable_object_exprt &value)
1145+
{
1146+
validate_operands(value, 1, "writeable_object must have one operand");
1147+
}
1148+
1149+
/// \brief Cast an exprt to a \ref writeable_object_exprt
1150+
///
1151+
/// \a expr must be known to be \ref writeable_object_exprt.
1152+
///
1153+
/// \param expr: Source expression
1154+
/// \return Object of type \ref writeable_object_exprt
1155+
inline const writeable_object_exprt &to_writeable_object_expr(const exprt &expr)
1156+
{
1157+
PRECONDITION(expr.id() == ID_writeable_object);
1158+
const writeable_object_exprt &ret =
1159+
static_cast<const writeable_object_exprt &>(expr);
1160+
validate_expr(ret);
1161+
return ret;
1162+
}
1163+
1164+
/// \copydoc to_writeable_object_expr(const exprt &)
1165+
inline writeable_object_exprt &to_writeable_object_expr(exprt &expr)
1166+
{
1167+
PRECONDITION(expr.id() == ID_writeable_object);
1168+
writeable_object_exprt &ret = static_cast<writeable_object_exprt &>(expr);
1169+
validate_expr(ret);
1170+
return ret;
1171+
}
1172+
10621173
#endif // CPROVER_UTIL_POINTER_EXPR_H

0 commit comments

Comments
 (0)