Skip to content

Commit f1ff824

Browse files
author
klaas
committed
Disambiguates two exprts with the same ID.
This commit resolves an issue where ID_dynamic_object was used to label two semantically distinct exprts. One, with a single operand, was a boolean expression meaning that the operand is a pointer to a dynamic object. This has been renamed to ID_is_dynamic_object. The second, with two operands, is an exprt representing a dynamic object itself. This has stayed ID_dynamic_object. Disambiguating which meaning was intended in each case was relatively easy, as uses of these exprts frequently come with assertions about the number of operands, and so this was used to inform which instances of ID_dynamic_object should be changed and which should be left the same.
1 parent 3e51f30 commit f1ff824

12 files changed

+70
-22
lines changed

regression/goto-instrument/slice19/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
main.c
33
--full-slice
44
^EXIT=0$

src/ansi-c/c_typecheck_expr.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2141,11 +2141,10 @@ exprt c_typecheck_baset::do_special_functions(
21412141
throw 0;
21422142
}
21432143

2144-
exprt dynamic_object_expr=exprt(ID_dynamic_object, expr.type());
2145-
dynamic_object_expr.operands()=expr.arguments();
2146-
dynamic_object_expr.add_source_location()=source_location;
2144+
exprt is_dynamic_object_expr = is_dynamic_object_exprt(expr.arguments()[0]);
2145+
is_dynamic_object_expr.add_source_location() = source_location;
21472146

2148-
return dynamic_object_expr;
2147+
return is_dynamic_object_expr;
21492148
}
21502149
else if(identifier==CPROVER_PREFIX "POINTER_OFFSET")
21512150
{

src/ansi-c/expr2c.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3580,8 +3580,8 @@ std::string expr2ct::convert_with_precedence(
35803580
else if(src.id()==ID_invalid_pointer)
35813581
return convert_function(src, "__CPROVER_invalid_pointer", precedence=16);
35823582

3583-
else if(src.id()==ID_dynamic_object)
3584-
return convert_function(src, "DYNAMIC_OBJECT", precedence=16);
3583+
else if(src.id()==ID_is_dynamic_object)
3584+
return convert_function(src, "IS_DYNAMIC_OBJECT", precedence=16);
35853585

35863586
else if(src.id()=="is_zero_string")
35873587
return convert_function(src, "IS_ZERO_STRING", precedence=16);

src/solvers/flattening/bv_pointers.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ literalt bv_pointerst::convert_rest(const exprt &expr)
4545
}
4646
}
4747
}
48-
else if(expr.id()==ID_dynamic_object)
48+
else if(expr.id()==ID_is_dynamic_object)
4949
{
5050
if(operands.size()==1 &&
5151
operands[0].type().id()==ID_pointer)
@@ -735,7 +735,7 @@ void bv_pointerst::add_addr(const exprt &expr, bvt &bv)
735735
void bv_pointerst::do_postponed(
736736
const postponedt &postponed)
737737
{
738-
if(postponed.expr.id()==ID_dynamic_object)
738+
if(postponed.expr.id()==ID_is_dynamic_object)
739739
{
740740
const pointer_logict::objectst &objects=
741741
pointer_logic.objects;

src/solvers/smt2/smt2_conv.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,7 @@ void smt2_convt::convert_expr(const exprt &expr)
13671367
if(ext>0)
13681368
out << ")"; // zero_extend
13691369
}
1370-
else if(expr.id()==ID_dynamic_object)
1370+
else if(expr.id()==ID_is_dynamic_object)
13711371
{
13721372
convert_is_dynamic_object(expr);
13731373
}

src/util/irep_ids.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ IREP_ID_TWO(overflow_minus, overflow--)
448448
IREP_ID_TWO(overflow_mult, overflow-*)
449449
IREP_ID_TWO(overflow_unary_minus, overflow-unary-)
450450
IREP_ID_ONE(object_descriptor)
451+
IREP_ID_ONE(is_dynamic_object)
451452
IREP_ID_ONE(dynamic_object)
452453
IREP_ID_TWO(C_dynamic, #dynamic)
453454
IREP_ID_ONE(object_size)

src/util/pointer_predicates.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ exprt dynamic_size(const namespacet &ns)
7070

7171
exprt dynamic_object(const exprt &pointer)
7272
{
73-
exprt dynamic_expr(ID_dynamic_object, bool_typet());
73+
exprt dynamic_expr(ID_is_dynamic_object, bool_typet());
7474
dynamic_expr.copy_to_operands(pointer);
7575
return dynamic_expr;
7676
}

src/util/simplify_expr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2266,8 +2266,8 @@ bool simplify_exprt::simplify_node(exprt &expr)
22662266
result=simplify_byte_extract(to_byte_extract_expr(expr)) && result;
22672267
else if(expr.id()==ID_pointer_object)
22682268
result=simplify_pointer_object(expr) && result;
2269-
else if(expr.id()==ID_dynamic_object)
2270-
result=simplify_dynamic_object(expr) && result;
2269+
else if(expr.id()==ID_is_dynamic_object)
2270+
result=simplify_is_dynamic_object(expr) && result;
22712271
else if(expr.id()==ID_invalid_pointer)
22722272
result=simplify_invalid_pointer(expr) && result;
22732273
else if(expr.id()==ID_object_size)

src/util/simplify_expr_class.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class simplify_exprt
9696
bool simplify_pointer_object(exprt &expr);
9797
bool simplify_object_size(exprt &expr);
9898
bool simplify_dynamic_size(exprt &expr);
99-
bool simplify_dynamic_object(exprt &expr);
99+
bool simplify_is_dynamic_object(exprt &expr);
100100
bool simplify_invalid_pointer(exprt &expr);
101101
bool simplify_same_object(exprt &expr);
102102
bool simplify_good_pointer(exprt &expr);

src/util/simplify_expr_int.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,7 +1699,7 @@ bool simplify_exprt::simplify_inequality_constant(exprt &expr)
16991699
expr.op0().operands().size()==1)
17001700
{
17011701
if(expr.op0().op0().id()==ID_symbol ||
1702-
expr.op0().op0().id()==ID_dynamic_object ||
1702+
expr.op0().op0().id()==ID_is_dynamic_object ||
17031703
expr.op0().op0().id()==ID_member ||
17041704
expr.op0().op0().id()==ID_index ||
17051705
expr.op0().op0().id()==ID_string_constant)
@@ -1715,7 +1715,7 @@ bool simplify_exprt::simplify_inequality_constant(exprt &expr)
17151715
expr.op0().op0().operands().size()==1)
17161716
{
17171717
if(expr.op0().op0().op0().id()==ID_symbol ||
1718-
expr.op0().op0().op0().id()==ID_dynamic_object ||
1718+
expr.op0().op0().op0().id()==ID_is_dynamic_object ||
17191719
expr.op0().op0().op0().id()==ID_member ||
17201720
expr.op0().op0().op0().id()==ID_index ||
17211721
expr.op0().op0().op0().id()==ID_string_constant)

src/util/simplify_expr_pointer.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ bool simplify_exprt::simplify_inequality_pointer_object(exprt &expr)
464464
{
465465
if(op.operands().size()!=1 ||
466466
(op.op0().id()!=ID_symbol &&
467-
op.op0().id()!=ID_dynamic_object &&
467+
op.op0().id()!=ID_is_dynamic_object &&
468468
op.op0().id()!=ID_string_constant))
469469
return true;
470470
}
@@ -508,18 +508,18 @@ bool simplify_exprt::simplify_pointer_object(exprt &expr)
508508
return result;
509509
}
510510

511-
bool simplify_exprt::simplify_dynamic_object(exprt &expr)
511+
bool simplify_exprt::simplify_is_dynamic_object(exprt &expr)
512512
{
513-
if(expr.operands().size()!=1)
514-
return true;
513+
// This should hold as a result of the expr ID being is_dynamic_object.
514+
PRECONDITION(expr.operands().size() == 1);
515515

516516
exprt &op=expr.op0();
517517

518518
if(op.id()==ID_if && op.operands().size()==3)
519519
{
520520
if_exprt if_expr=lift_if(expr, 0);
521-
simplify_dynamic_object(if_expr.true_case());
522-
simplify_dynamic_object(if_expr.false_case());
521+
simplify_is_dynamic_object(if_expr.true_case());
522+
simplify_is_dynamic_object(if_expr.false_case());
523523
simplify_if(if_expr);
524524
expr.swap(if_expr);
525525

src/util/std_expr.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2106,6 +2106,54 @@ inline void validate_expr(const dynamic_object_exprt &value)
21062106
}
21072107

21082108

2109+
/*! \brief Evaluates to true if the operand is a pointer to a dynamic object.
2110+
*/
2111+
class is_dynamic_object_exprt:public unary_predicate_exprt
2112+
{
2113+
public:
2114+
is_dynamic_object_exprt():unary_predicate_exprt(ID_is_dynamic_object)
2115+
{
2116+
}
2117+
2118+
explicit is_dynamic_object_exprt(const exprt &op):
2119+
unary_predicate_exprt(ID_is_dynamic_object, op)
2120+
{
2121+
}
2122+
};
2123+
2124+
/*! \brief Cast a generic exprt to a \ref is_dynamic_object_exprt
2125+
*
2126+
* This is an unchecked conversion. \a expr must be known to be \ref
2127+
* is_dynamic_object_exprt.
2128+
*
2129+
* \param expr Source expression
2130+
* \return Object of type \ref is_dynamic_object_exprt
2131+
*
2132+
* \ingroup gr_std_expr
2133+
*/
2134+
inline const is_dynamic_object_exprt &to_is_dynamic_object_expr(
2135+
const exprt &expr)
2136+
{
2137+
PRECONDITION(expr.id()==ID_is_dynamic_object);
2138+
DATA_INVARIANT(
2139+
expr.operands().size()==1,
2140+
"is_dynamic_object must have one operand");
2141+
return static_cast<const is_dynamic_object_exprt &>(expr);
2142+
}
2143+
2144+
/*! \copydoc to_is_dynamic_object_expr(const exprt &)
2145+
* \ingroup gr_std_expr
2146+
*/
2147+
inline is_dynamic_object_exprt &to_is_dynamic_object_expr(exprt &expr)
2148+
{
2149+
PRECONDITION(expr.id()==ID_is_dynamic_object);
2150+
DATA_INVARIANT(
2151+
expr.operands().size()==1,
2152+
"is_dynamic_object must have one operand");
2153+
return static_cast<is_dynamic_object_exprt &>(expr);
2154+
}
2155+
2156+
21092157
/*! \brief semantic type conversion
21102158
*/
21112159
class typecast_exprt:public unary_exprt

0 commit comments

Comments
 (0)