Skip to content

Commit 407eb86

Browse files
author
Daniel Kroening
committed
bounds of heap objects now tracked using object_size()
1 parent 0149e41 commit 407eb86

File tree

10 files changed

+13
-37
lines changed

10 files changed

+13
-37
lines changed

regression/cbmc/Malloc23/test.desc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ main.c
33
--pointer-check
44
^EXIT=10$
55
^SIGNAL=0$
6-
pointer outside dynamic object bounds in \*p: FAILURE
7-
pointer outside dynamic object bounds in \*p: FAILURE
8-
pointer outside dynamic object bounds in p2\[.*1\]: FAILURE
9-
pointer outside dynamic object bounds in p2\[.*0\]: FAILURE
6+
pointer outside object bounds in \*p: FAILURE
7+
pointer outside object bounds in \*p: FAILURE
8+
pointer outside object bounds in p2\[.*1\]: FAILURE
9+
pointer outside object bounds in p2\[.*0\]: FAILURE
1010
\*\* 4 of [0-9]+ failed
1111
--
1212
^warning: ignoring

regression/cbmc/Pointer_byte_extract5/no-simplify.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ main.i
33
--bounds-check --32 --no-simplify
44
^EXIT=10$
55
^SIGNAL=0$
6-
array\.List dynamic object upper bound in p->List\[2\]: FAILURE
6+
array\.List object upper bound in p->List\[2\]: FAILURE
77
\*\* 1 of 14 failed
88
--
99
^warning: ignoring

regression/cbmc/Pointer_byte_extract5/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ main.i
33
--bounds-check --32
44
^EXIT=10$
55
^SIGNAL=0$
6-
array\.List dynamic object upper bound in p->List\[2\]: FAILURE
6+
array\.List object upper bound in p->List\[2\]: FAILURE
77
\*\* 1 of 11 failed
88
--
99
^warning: ignoring

regression/cbmc/pointer-extra-checks/test.desc

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ main.c
77
^\[main.pointer_dereference.2\] dereference failure: dead object in \*q: SUCCESS$
88
^\[main.pointer_dereference.3\] dereference failure: pointer outside object bounds in \*q: SUCCESS$
99
^\[main.pointer_dereference.4\] dereference failure: deallocated dynamic object in \*r: SUCCESS$
10-
^\[main.pointer_dereference.5\] dereference failure: pointer outside dynamic object bounds in \*r: SUCCESS$
10+
^\[main.pointer_dereference.5\] dereference failure: pointer outside object bounds in \*r: SUCCESS$
1111
^\[main.pointer_dereference.6\] dereference failure: pointer uninitialized in \*s: FAILURE$
1212
^VERIFICATION FAILED$
1313
--
@@ -16,23 +16,19 @@ main.c
1616
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer uninitialized in \*p:
1717
^\[main.pointer_dereference.[0-9]+\] dereference failure: deallocated dynamic object in \*p:
1818
^\[main.pointer_dereference.[0-9]+\] dereference failure: dead object in \*p:
19-
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer outside dynamic object bounds in \*p:
2019
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer outside object bounds in \*p:
2120
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer NULL in \*q:
2221
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer invalid in \*q:
2322
^\[main.pointer_dereference.[0-9]+\] dereference failure: deallocated dynamic object in \*q:
24-
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer outside dynamic object bounds in \*q:
2523
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer uninitialized in \*q:
2624
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer NULL in \*r:
2725
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer invalid in \*r:
2826
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer uninitialized in \*r:
2927
^\[main.pointer_dereference.[0-9]+\] dereference failure: dead object in \*r:
30-
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer outside object bounds in \*r:
3128
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer NULL in \*s:
3229
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer invalid in \*s:
3330
^\[main.pointer_dereference.[0-9]+\] dereference failure: deallocated dynamic object in \*s:
3431
^\[main.pointer_dereference.[0-9]+\] dereference failure: dead object in \*s:
35-
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer outside dynamic object bounds in \*s:
3632
^\[main.pointer_dereference.[0-9]+\] dereference failure: pointer outside object bounds in \*s:
3733
--
3834
This test ensures that local_bitvector_analysis is correctly labelling obvious

regression/goto-analyzer/constant_propagation_01/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ main.c
44
^EXIT=0$
55
^SIGNAL=0$
66
^Simplified: assert: 1, assume: 0, goto: 1, assigns: 5, function calls: 0$
7-
^Unmodified: assert: 0, assume: 0, goto: 0, assigns: 12, function calls: 2$
7+
^Unmodified: assert: 0, assume: 0, goto: 0, assigns: 11, function calls: 2$
88
--
99
^warning: ignoring

regression/goto-analyzer/constant_propagation_02/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ main.c
44
^EXIT=0$
55
^SIGNAL=0$
66
^Simplified: assert: 1, assume: 0, goto: 1, assigns: 6, function calls: 0$
7-
^Unmodified: assert: 0, assume: 0, goto: 0, assigns: 11, function calls: 2$
7+
^Unmodified: assert: 0, assume: 0, goto: 0, assigns: 10, function calls: 2$
88
--
99
^warning: ignoring

src/analyses/goto_check.cpp

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,27 +1031,16 @@ goto_checkt::address_check(const exprt &address, const exprt &size)
10311031
not_exprt(dead_object(address, ns)), "dead object"));
10321032
}
10331033

1034-
if(flags.is_unknown() || flags.is_dynamic_heap())
1035-
{
1036-
const or_exprt dynamic_bounds_violation(
1037-
dynamic_object_lower_bound(address, ns, nil_exprt()),
1038-
dynamic_object_upper_bound(address, ns, size));
1039-
1040-
conditions.push_back(conditiont(
1041-
implies_exprt(malloc_object(address, ns), not_exprt(dynamic_bounds_violation)),
1042-
"pointer outside dynamic object bounds"));
1043-
}
1044-
10451034
if(
10461035
flags.is_unknown() || flags.is_dynamic_local() ||
1047-
flags.is_static_lifetime())
1036+
flags.is_dynamic_heap() || flags.is_static_lifetime())
10481037
{
10491038
const or_exprt object_bounds_violation(
10501039
object_lower_bound(address, ns, nil_exprt()),
10511040
object_upper_bound(address, ns, size));
10521041

10531042
conditions.push_back(conditiont(
1054-
implies_exprt(not_exprt(dynamic_object(address)), not_exprt(object_bounds_violation)),
1043+
not_exprt(object_bounds_violation),
10551044
"pointer outside object bounds"));
10561045
}
10571046

@@ -1152,11 +1141,7 @@ void goto_checkt::bounds_check(
11521141
const exprt &pointer=
11531142
to_dereference_expr(ode.root_object()).pointer();
11541143

1155-
if_exprt size(
1156-
dynamic_object(pointer),
1157-
typecast_exprt(dynamic_size(ns), object_size(pointer).type()),
1158-
object_size(pointer));
1159-
1144+
auto size=object_size(pointer);
11601145
plus_exprt effective_offset(ode.offset(), pointer_offset(pointer));
11611146

11621147
assert(effective_offset.op0().type()==effective_offset.op1().type());
@@ -1173,7 +1158,7 @@ void goto_checkt::bounds_check(
11731158

11741159
add_guarded_claim(
11751160
precond,
1176-
name+" dynamic object upper bound",
1161+
name+" object upper bound",
11771162
"array bounds",
11781163
expr.find_source_location(),
11791164
expr,

src/ansi-c/ansi_c_internal_additions.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ void ansi_c_internal_additions(std::string &code)
144144
"const void *__CPROVER_deallocated=0;\n"
145145
"const void *__CPROVER_dead_object=0;\n"
146146
"const void *__CPROVER_malloc_object=0;\n"
147-
"__CPROVER_size_t __CPROVER_malloc_size;\n"
148147
"__CPROVER_bool __CPROVER_malloc_is_new_array=0;\n" // for C++
149148
"const void *__CPROVER_memory_leak=0;\n"
150149
"void *__CPROVER_allocate(__CPROVER_size_t size, __CPROVER_bool zero);\n"

src/ansi-c/library/cprover.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ typedef __typeof__(sizeof(int)) __CPROVER_size_t;
1313
void *__CPROVER_allocate(__CPROVER_size_t size, __CPROVER_bool zero);
1414
extern const void *__CPROVER_deallocated;
1515
extern const void *__CPROVER_malloc_object;
16-
extern __CPROVER_size_t __CPROVER_malloc_size;
1716
extern _Bool __CPROVER_malloc_is_new_array;
1817
extern const void *__CPROVER_memory_leak;
1918

src/ansi-c/library/stdlib.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ inline void *calloc(__CPROVER_size_t nmemb, __CPROVER_size_t size)
7979
__CPROVER_bool record_malloc = __VERIFIER_nondet___CPROVER_bool();
8080
__CPROVER_malloc_object =
8181
record_malloc ? malloc_res : __CPROVER_malloc_object;
82-
__CPROVER_malloc_size = record_malloc ? nmemb * size : __CPROVER_malloc_size;
8382
__CPROVER_malloc_is_new_array =
8483
record_malloc ? 0 : __CPROVER_malloc_is_new_array;
8584

@@ -115,7 +114,6 @@ inline void *malloc(__CPROVER_size_t malloc_size)
115114
// record the object size for non-determistic bounds checking
116115
__CPROVER_bool record_malloc=__VERIFIER_nondet___CPROVER_bool();
117116
__CPROVER_malloc_object=record_malloc?malloc_res:__CPROVER_malloc_object;
118-
__CPROVER_malloc_size=record_malloc?malloc_size:__CPROVER_malloc_size;
119117
__CPROVER_malloc_is_new_array=record_malloc?0:__CPROVER_malloc_is_new_array;
120118

121119
// detect memory leaks
@@ -141,7 +139,6 @@ inline void *__builtin_alloca(__CPROVER_size_t alloca_size)
141139
// record the object size for non-determistic bounds checking
142140
__CPROVER_bool record_malloc=__VERIFIER_nondet___CPROVER_bool();
143141
__CPROVER_malloc_object=record_malloc?res:__CPROVER_malloc_object;
144-
__CPROVER_malloc_size=record_malloc?alloca_size:__CPROVER_malloc_size;
145142
__CPROVER_malloc_is_new_array=record_malloc?0:__CPROVER_malloc_is_new_array;
146143

147144
return res;

0 commit comments

Comments
 (0)