Skip to content

Commit 1e88e70

Browse files
committed
axioms for state_object_size
1 parent 812aafa commit 1e88e70

File tree

5 files changed

+52
-11
lines changed

5 files changed

+52
-11
lines changed

regression/cprover/safety/array_bounds2.desc

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

regression/cprover/safety/r_ok5.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
r_ok5.c
33

44
^EXIT=0$

regression/cprover/safety/simple_equality1.desc

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

src/cprover/axioms.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Module: Axioms
1515
#include <util/c_types.h>
1616
#include <util/format_expr.h>
1717
#include <util/pointer_predicates.h>
18+
#include <util/simplify_expr.h>
1819

1920
#include "simplify_state_expr.h"
2021
#include "state.h"
@@ -96,6 +97,24 @@ void axiomst::is_cstring(decision_proceduret &dest)
9697
}
9798
}
9899

100+
void axiomst::live_object(decision_proceduret &dest)
101+
{
102+
}
103+
104+
void axiomst::object_size(decision_proceduret &dest)
105+
{
106+
for(const auto &src : object_size_exprs)
107+
{
108+
auto src_simplified = simplify_state_expr_node(src, address_taken, ns);
109+
if(src_simplified != src)
110+
{
111+
auto equal = equal_exprt(src, src_simplified);
112+
std::cout << "OBJECT_SIZE: " << format(equal) << '\n';
113+
dest << replace(equal);
114+
}
115+
}
116+
}
117+
99118
exprt axiomst::replace(exprt src)
100119
{
101120
src.type() = replace(src.type());
@@ -211,23 +230,25 @@ void axiomst::node(const exprt &src, decision_proceduret &dest)
211230

212231
{
213232
// X_ok(p, s)
214-
// --> live_object(p) ∧ offset(p)≥0 ∧ offset(p)+s≤object_size(p)
215-
auto live_object =
216-
binary_predicate_exprt(state, ID_state_live_object, pointer);
233+
// <--> live_object(p) ∧ offset(p)≥0 ∧ offset(p)+s≤object_size(p)
234+
auto live_object = state_live_object_exprt(state, pointer);
235+
live_object_exprs.insert(live_object);
236+
auto live_object_simplified =
237+
simplify_state_expr_node(live_object, address_taken, ns);
217238
auto ssize_type = signed_size_type();
218239
auto offset = pointer_offset_exprt(pointer, ssize_type);
219240
auto offset_simplified =
220241
simplify_state_expr_node(offset, address_taken, ns);
221242
auto lower = binary_relation_exprt(
222243
offset_simplified, ID_ge, from_integer(0, ssize_type));
223-
auto object_size =
224-
binary_exprt(state, ID_state_object_size, pointer, ssize_type);
244+
auto object_size = state_object_size_exprt(state, pointer, ssize_type);
245+
object_size_exprs.insert(object_size);
225246
auto size_casted = typecast_exprt::conditional_cast(size, ssize_type);
226247
auto upper = binary_relation_exprt(
227248
plus_exprt(offset_simplified, size_casted), ID_le, object_size);
228249

229-
auto instance =
230-
replace(implies_exprt(src, and_exprt(live_object, lower, upper)));
250+
auto instance = replace(
251+
equal_exprt(src, and_exprt(live_object_simplified, lower, upper)));
231252
std::cout << "AXIOMd: " << format(instance) << "\n";
232253
dest << instance;
233254
}
@@ -255,4 +276,6 @@ void axiomst::emit(decision_proceduret &dest)
255276

256277
evaluate(dest);
257278
is_cstring(dest);
279+
live_object(dest);
280+
object_size(dest);
258281
}

src/cprover/simplify_state_expr.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,11 +395,29 @@ exprt simplify_state_expr_node(
395395
{
396396
auto &pointer_offset_expr = to_pointer_offset_expr(src);
397397

398-
// pointer_offset(❝x❞) -> 0
399398
if(pointer_offset_expr.pointer().id() == ID_object_address)
400399
{
400+
// pointer_offset(❝x❞) -> 0
401401
return from_integer(0, pointer_offset_expr.type());
402402
}
403+
else if(pointer_offset_expr.pointer().id() == ID_element_address)
404+
{
405+
const auto &element_address_expr =
406+
to_element_address_expr(pointer_offset_expr.pointer());
407+
if(element_address_expr.base().id() == ID_object_address)
408+
{
409+
// pointer_offset(element_address(❝x❞, y)) -> y*sizeof(x)
410+
auto size_opt = size_of_expr(element_address_expr.element_type(), ns);
411+
if(size_opt.has_value())
412+
{
413+
auto product = mult_exprt(
414+
typecast_exprt::conditional_cast(
415+
element_address_expr.index(), src.type()),
416+
typecast_exprt::conditional_cast(*size_opt, src.type()));
417+
return product;
418+
}
419+
}
420+
}
403421
}
404422
else if(src.id() == ID_state_object_size)
405423
{

0 commit comments

Comments
 (0)