Skip to content

Commit 8b93307

Browse files
klaasDaniel Kroening
klaas
authored and
Daniel Kroening
committed
Fixed secondary issues arising from local_bitvector_analysis fix.
In particular, goto_check did not properly handle pointers whose value was an integer address (such as int *p = 0x10 in the test case memory_allocation1). This commit adds in pointer checks on pointers which are integer addresses, treating them essentially the same as pointers which are unknown (and could therefore point to any of the more well-defined types of memory objects), except that they are known not to be null, so no check for NULL is needed.
1 parent 113e200 commit 8b93307

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

regression/cbmc/memory_allocation1/test.desc

Lines changed: 3 additions & 3 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-
\[main.pointer_dereference.2\] dereference failure: pointer invalid in \*p: SUCCESS
6+
\[main.pointer_dereference.[0-9]+\] dereference failure: pointer invalid in \*p: SUCCESS
77
\[main.assertion.1\] assertion \*p==42: SUCCESS
8-
\[main.pointer_dereference.14\] dereference failure: pointer invalid in p\[.*1\]: FAILURE
8+
\[main.pointer_dereference.[0-9]+\] dereference failure: pointer invalid in p\[.*1\]: FAILURE
99
\[main.assertion.2\] assertion \*\(p\+1\)==42: SUCCESS
10-
\*\* 12 of 26 failed
10+
^VERIFICATION FAILED$
1111
--
1212
^warning: ignoring

src/analyses/goto_check.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,8 @@ void goto_checkt::pointer_validity_check(
991991
allocs=disjunction(disjuncts);
992992
}
993993

994-
if(flags.is_unknown() || flags.is_null())
994+
if(flags.is_unknown() ||
995+
flags.is_null())
995996
{
996997
add_guarded_claim(
997998
or_exprt(allocs, not_exprt(null_pointer(pointer))),
@@ -1002,7 +1003,8 @@ void goto_checkt::pointer_validity_check(
10021003
guard);
10031004
}
10041005

1005-
if(flags.is_unknown())
1006+
if(flags.is_unknown() ||
1007+
flags.is_integer_address())
10061008
add_guarded_claim(
10071009
or_exprt(allocs, not_exprt(invalid_pointer(pointer))),
10081010
"dereference failure: pointer invalid",
@@ -1020,7 +1022,9 @@ void goto_checkt::pointer_validity_check(
10201022
expr,
10211023
guard);
10221024

1023-
if(flags.is_unknown() || flags.is_dynamic_heap())
1025+
if(flags.is_unknown() ||
1026+
flags.is_dynamic_heap() ||
1027+
flags.is_integer_address())
10241028
add_guarded_claim(
10251029
or_exprt(allocs, not_exprt(deallocated(pointer, ns))),
10261030
"dereference failure: deallocated dynamic object",
@@ -1029,7 +1033,9 @@ void goto_checkt::pointer_validity_check(
10291033
expr,
10301034
guard);
10311035

1032-
if(flags.is_unknown() || flags.is_dynamic_local())
1036+
if(flags.is_unknown() ||
1037+
flags.is_dynamic_local() ||
1038+
flags.is_integer_address())
10331039
add_guarded_claim(
10341040
or_exprt(allocs, not_exprt(dead_object(pointer, ns))),
10351041
"dereference failure: dead object",
@@ -1038,7 +1044,9 @@ void goto_checkt::pointer_validity_check(
10381044
expr,
10391045
guard);
10401046

1041-
if(flags.is_unknown() || flags.is_dynamic_heap())
1047+
if(flags.is_unknown() ||
1048+
flags.is_dynamic_heap() ||
1049+
flags.is_integer_address())
10421050
{
10431051
const or_exprt dynamic_bounds(
10441052
dynamic_object_lower_bound(pointer, ns, access_lb),
@@ -1059,7 +1067,8 @@ void goto_checkt::pointer_validity_check(
10591067

10601068
if(flags.is_unknown() ||
10611069
flags.is_dynamic_local() ||
1062-
flags.is_static_lifetime())
1070+
flags.is_static_lifetime() ||
1071+
flags.is_integer_address())
10631072
{
10641073
const or_exprt object_bounds(
10651074
object_lower_bound(pointer, ns, access_lb),

0 commit comments

Comments
 (0)